Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 27 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy Now | 20127910 | 26 days ago | IN | 0.52 ETH | 0.00110946 | ||||
Buy Now | 19884844 | 60 days ago | IN | 1 ETH | 0.00043573 | ||||
Buy Now | 19884835 | 60 days ago | IN | 1 ETH | 0.00048333 | ||||
Buy Now | 19884538 | 60 days ago | IN | 1 ETH | 0.00066582 | ||||
Buy Now | 19791805 | 73 days ago | IN | 0.3 ETH | 0.00056244 | ||||
Buy Now | 19728467 | 82 days ago | IN | 10 ETH | 0.00101353 | ||||
Buy Now | 19726067 | 82 days ago | IN | 10 ETH | 0.00222041 | ||||
Buy Now | 19725741 | 82 days ago | IN | 10 ETH | 0.00356942 | ||||
Buy Now | 19724451 | 83 days ago | IN | 1.5 ETH | 0.0014562 | ||||
Buy Now | 19724450 | 83 days ago | IN | 1.5 ETH | 0.00145232 | ||||
Buy Now | 19724447 | 83 days ago | IN | 1.5 ETH | 0.00150701 | ||||
Buy Now | 19719294 | 83 days ago | IN | 1.5 ETH | 0.00210323 | ||||
Buy Now | 19662714 | 91 days ago | IN | 1.5 ETH | 0.00260168 | ||||
Transfer Ownersh... | 19631504 | 96 days ago | IN | 0 ETH | 0.00060396 | ||||
Set Beneficiary | 19631459 | 96 days ago | IN | 0 ETH | 0.00061089 | ||||
Schedule | 19618542 | 97 days ago | IN | 0 ETH | 0.00341884 | ||||
Buy Now | 18778621 | 215 days ago | IN | 10 ETH | 0.00691482 | ||||
Settle Auction | 18486641 | 256 days ago | IN | 0 ETH | 0.00369284 | ||||
Buy Now | 18486573 | 256 days ago | IN | 10 ETH | 0.00316134 | ||||
Bid | 18480329 | 257 days ago | IN | 22 ETH | 0.0018186 | ||||
Bid | 18479434 | 257 days ago | IN | 20 ETH | 0.00226269 | ||||
Buy Now | 18478624 | 257 days ago | IN | 10 ETH | 0.01013062 | ||||
Buy Now | 18478607 | 257 days ago | IN | 10 ETH | 0.00480548 | ||||
Change Split Mul... | 18477550 | 257 days ago | IN | 0 ETH | 0.00456879 | ||||
Schedule Multipl... | 18471080 | 258 days ago | IN | 0 ETH | 0.0228859 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20127910 | 26 days ago | 0.13 ETH | ||||
20127910 | 26 days ago | 0.39 ETH | ||||
19884844 | 60 days ago | 0.25 ETH | ||||
19884844 | 60 days ago | 0.75 ETH | ||||
19884835 | 60 days ago | 0.25 ETH | ||||
19884835 | 60 days ago | 0.75 ETH | ||||
19884538 | 60 days ago | 0.25 ETH | ||||
19884538 | 60 days ago | 0.75 ETH | ||||
19791805 | 73 days ago | 0.075 ETH | ||||
19791805 | 73 days ago | 0.225 ETH | ||||
19728467 | 82 days ago | 2 ETH | ||||
19728467 | 82 days ago | 8 ETH | ||||
19726067 | 82 days ago | 2 ETH | ||||
19726067 | 82 days ago | 8 ETH | ||||
19725741 | 82 days ago | 2 ETH | ||||
19725741 | 82 days ago | 8 ETH | ||||
19724451 | 83 days ago | 0.375 ETH | ||||
19724451 | 83 days ago | 1.125 ETH | ||||
19724450 | 83 days ago | 0.375 ETH | ||||
19724450 | 83 days ago | 1.125 ETH | ||||
19724447 | 83 days ago | 0.375 ETH | ||||
19724447 | 83 days ago | 1.125 ETH | ||||
19719294 | 83 days ago | 0.375 ETH | ||||
19719294 | 83 days ago | 1.125 ETH | ||||
19662714 | 91 days ago | 0.375 ETH |
Loading...
Loading
Contract Name:
ArtMarketplace
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity Standard Json-Input format)
// File: contracts/libs/SafeTransferLib.sol pragma solidity >=0.8.4; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// /// @dev Note: /// - For ETH transfers, please use `forceSafeTransferETH` for gas griefing protection. /// - For ERC20s, this implementation won't check that a token has code, /// responsibility is delegated to the caller. library SafeTransferLib { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ETH transfer has failed. error ETHTransferFailed(); /// @dev The ERC20 `transferFrom` has failed. error TransferFromFailed(); /// @dev The ERC20 `transfer` has failed. error TransferFailed(); /// @dev The ERC20 `approve` has failed. error ApproveFailed(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTANTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Suggested gas stipend for contract receiving ETH /// that disallows any storage writes. uint256 internal constant _GAS_STIPEND_NO_STORAGE_WRITES = 2300; /// @dev Suggested gas stipend for contract receiving ETH to perform a few /// storage reads and writes, but low enough to prevent griefing. /// Multiply by a small constant (e.g. 2), if needed. uint256 internal constant _GAS_STIPEND_NO_GRIEF = 100000; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ETH OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Sends `amount` (in wei) ETH to `to`. /// Reverts upon failure. /// /// Note: This implementation does NOT protect against gas griefing. /// Please use `forceSafeTransferETH` for gas griefing protection. function safeTransferETH(address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { // Transfer the ETH and check if it succeeded or not. if iszero(call(gas(), to, amount, 0, 0, 0, 0)) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } } } /// @dev Force sends `amount` (in wei) ETH to `to`, with a `gasStipend`. /// The `gasStipend` can be set to a low enough value to prevent /// storage writes or gas griefing. /// /// If sending via the normal procedure fails, force sends the ETH by /// creating a temporary contract which uses `SELFDESTRUCT` to force send the ETH. /// /// Reverts if the current contract has insufficient balance. function forceSafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal { /// @solidity memory-safe-assembly assembly { // If insufficient balance, revert. if lt(selfbalance(), amount) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } // Transfer the ETH and check if it succeeded or not. if iszero(call(gasStipend, to, amount, 0, 0, 0, 0)) { mstore(0x00, to) // Store the address in scratch space. mstore8(0x0b, 0x73) // Opcode `PUSH20`. mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`. // We can directly use `SELFDESTRUCT` in the contract creation. // Compatible with `SENDALL`: https://eips.ethereum.org/EIPS/eip-4758 if iszero(create(amount, 0x0b, 0x16)) { // To coerce gas estimation to provide enough gas for the `create` above. if iszero(gt(gas(), 1000000)) { revert(0, 0) } } } } } /// @dev Force sends `amount` (in wei) ETH to `to`, with a gas stipend /// equal to `_GAS_STIPEND_NO_GRIEF`. This gas stipend is a reasonable default /// for 99% of cases and can be overridden with the three-argument version of this /// function if necessary. /// /// If sending via the normal procedure fails, force sends the ETH by /// creating a temporary contract which uses `SELFDESTRUCT` to force send the ETH. /// /// Reverts if the current contract has insufficient balance. function forceSafeTransferETH(address to, uint256 amount) internal { // Manually inlined because the compiler doesn't inline functions with branches. /// @solidity memory-safe-assembly assembly { // If insufficient balance, revert. if lt(selfbalance(), amount) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } // Transfer the ETH and check if it succeeded or not. if iszero(call(_GAS_STIPEND_NO_GRIEF, to, amount, 0, 0, 0, 0)) { mstore(0x00, to) // Store the address in scratch space. mstore8(0x0b, 0x73) // Opcode `PUSH20`. mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`. // We can directly use `SELFDESTRUCT` in the contract creation. // Compatible with `SENDALL`: https://eips.ethereum.org/EIPS/eip-4758 if iszero(create(amount, 0x0b, 0x16)) { // To coerce gas estimation to provide enough gas for the `create` above. if iszero(gt(gas(), 1000000)) { revert(0, 0) } } } } } /// @dev Sends `amount` (in wei) ETH to `to`, with a `gasStipend`. /// The `gasStipend` can be set to a low enough value to prevent /// storage writes or gas griefing. /// /// Simply use `gasleft()` for `gasStipend` if you don't need a gas stipend. /// /// Note: Does NOT revert upon failure. /// Returns whether the transfer of ETH is successful instead. function trySafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal returns (bool success) { /// @solidity memory-safe-assembly assembly { // Transfer the ETH and check if it succeeded or not. success := call(gasStipend, to, amount, 0, 0, 0, 0) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ERC20 OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Sends `amount` of ERC20 `token` from `from` to `to`. /// Reverts upon failure. /// /// The `from` account must have at least `amount` approved for /// the current contract to manage. function safeTransferFrom(address token, address from, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { let m := mload(0x40) // Cache the free memory pointer. mstore(0x60, amount) // Store the `amount` argument. mstore(0x40, to) // Store the `to` argument. mstore(0x2c, shl(96, from)) // Store the `from` argument. // Store the function selector of `transferFrom(address,address,uint256)`. mstore(0x0c, 0x23b872dd000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x60, 0) // Restore the zero slot to zero. mstore(0x40, m) // Restore the free memory pointer. } } /// @dev Sends all of ERC20 `token` from `from` to `to`. /// Reverts upon failure. /// /// The `from` account must have their entire balance approved for /// the current contract to manage. function safeTransferAllFrom(address token, address from, address to) internal returns (uint256 amount) { /// @solidity memory-safe-assembly assembly { let m := mload(0x40) // Cache the free memory pointer. mstore(0x40, to) // Store the `to` argument. mstore(0x2c, shl(96, from)) // Store the `from` argument. // Store the function selector of `balanceOf(address)`. mstore(0x0c, 0x70a08231000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. gt(returndatasize(), 0x1f), // At least 32 bytes returned. staticcall(gas(), token, 0x1c, 0x24, 0x60, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } // Store the function selector of `transferFrom(address,address,uint256)`. mstore(0x00, 0x23b872dd) // The `amount` argument is already written to the memory word at 0x60. amount := mload(0x60) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x60, 0) // Restore the zero slot to zero. mstore(0x40, m) // Restore the free memory pointer. } } /// @dev Sends `amount` of ERC20 `token` from the current contract to `to`. /// Reverts upon failure. function safeTransfer(address token, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { mstore(0x14, to) // Store the `to` argument. mstore(0x34, amount) // Store the `amount` argument. // Store the function selector of `transfer(address,uint256)`. mstore(0x00, 0xa9059cbb000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that was overwritten. mstore(0x34, 0) } } /// @dev Sends all of ERC20 `token` from the current contract to `to`. /// Reverts upon failure. function safeTransferAll(address token, address to) internal returns (uint256 amount) { /// @solidity memory-safe-assembly assembly { mstore(0x00, 0x70a08231) // Store the function selector of `balanceOf(address)`. mstore(0x20, address()) // Store the address of the current contract. if iszero( and( // The arguments of `and` are evaluated from right to left. gt(returndatasize(), 0x1f), // At least 32 bytes returned. staticcall(gas(), token, 0x1c, 0x24, 0x34, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x14, to) // Store the `to` argument. // The `amount` argument is already written to the memory word at 0x34. amount := mload(0x34) // Store the function selector of `transfer(address,uint256)`. mstore(0x00, 0xa9059cbb000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that was overwritten. mstore(0x34, 0) } } /// @dev Sets `amount` of ERC20 `token` for `to` to manage on behalf of the current contract. /// Reverts upon failure. function safeApprove(address token, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { mstore(0x14, to) // Store the `to` argument. mstore(0x34, amount) // Store the `amount` argument. // Store the function selector of `approve(address,uint256)`. mstore(0x00, 0x095ea7b3000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `ApproveFailed()`. mstore(0x00, 0x3e3f8f73) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that was overwritten. mstore(0x34, 0) } } /// @dev Returns the amount of ERC20 `token` owned by `account`. /// Returns zero if the `token` does not exist. function balanceOf(address token, address account) internal view returns (uint256 amount) { /// @solidity memory-safe-assembly assembly { mstore(0x14, account) // Store the `account` argument. // Store the function selector of `balanceOf(address)`. mstore(0x00, 0x70a08231000000000000000000000000) amount := mul( mload(0x20), and( // The arguments of `and` are evaluated from right to left. gt(returndatasize(), 0x1f), // At least 32 bytes returned. staticcall(gas(), token, 0x10, 0x24, 0x20, 0x20) ) ) } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.3/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v4.9.3/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.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 Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/ArtMarketplace.sol pragma solidity ^0.8.21; contract ArtMarketplace is Ownable { uint256 private constant BPS = 10_000; uint256 private constant BID_INCREASE_THRESHOLD = 0.2 ether; uint256 private constant DEFAULT_SPLIT = 7_500; uint256 private constant EXTENSION_TIME = 10 minutes; uint256 private constant INIT_AUCTION_DURATION = 24 hours; uint256 private constant MIN_BID = 0.01 ether; uint256 private constant MIN_BID_INCREASE_PRE = 2_000; uint256 private constant MIN_BID_INCREASE_POST = 1_000; uint256 private constant SAFE_GAS_LIMIT = 30_000; address public beneficiary; bool public paused; struct Auction { uint24 offsetFromEnd; uint72 amount; address bidder; } struct AuctionConfig { address artist; uint16 split; uint80 buyNowStartTime; uint80 auctionStartTime; uint88 buyNowPrice; uint88 reservePrice; } mapping(uint256 => AuctionConfig) public auctionConfig; mapping(uint256 => Auction) public auctionIdToAuction; event BidMade( uint256 indexed auctionId, address indexed collectionAddress, uint256 indexed tokenId, address bidder, uint256 amount, uint256 timestamp ); event Settled( uint256 indexed auctionId, address indexed collectionAddress, uint256 indexed tokenId, uint256 timestamp ); function bid( uint256 auctionId ) external payable { require(!paused, 'Bidding is paused'); if (auctionConfig[auctionId].auctionStartTime == type(uint80).max) { auctionConfig[auctionId].auctionStartTime = uint80(block.timestamp); } require( isAuctionActive(auctionId) && block.timestamp >= auctionConfig[auctionId].buyNowStartTime, 'Auction Inactive' ); Auction memory highestBid = auctionIdToAuction[auctionId]; uint256 bidIncrease = highestBid.amount >= BID_INCREASE_THRESHOLD ? MIN_BID_INCREASE_POST : MIN_BID_INCREASE_PRE; require( msg.value >= (highestBid.amount * (BPS + bidIncrease) / BPS) && msg.value >= reservePrice(auctionId), 'Bid not high enough' ); uint256 refundAmount; address refundBidder; uint256 offset = highestBid.offsetFromEnd; uint256 endTime = getAuctionEndTime(auctionId); if (highestBid.amount > 0) { refundAmount = highestBid.amount; refundBidder = highestBid.bidder; } if (endTime - block.timestamp < EXTENSION_TIME) { offset += block.timestamp + EXTENSION_TIME - endTime; } auctionIdToAuction[auctionId] = Auction(uint24(offset), uint72(msg.value), msg.sender); emit BidMade( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), msg.sender, msg.value, block.timestamp ); if (refundAmount > 0) { SafeTransferLib.forceSafeTransferETH(refundBidder, refundAmount, SAFE_GAS_LIMIT); } } function bidOnFavs( uint256[] calldata favorites, uint256[] calldata expectedPrices ) external payable { require(!paused, 'Bidding is paused'); require(favorites.length == expectedPrices.length); uint256 totalFailed; uint256 expectedTotal; for(uint256 i; i < favorites.length; ++i) { uint256 auctionId = favorites[i]; uint256 expectedPrice = expectedPrices[i]; expectedTotal += expectedPrice; AuctionConfig memory config = auctionConfig[auctionId]; if (config.auctionStartTime == type(uint80).max) { auctionConfig[auctionId].auctionStartTime = uint80(block.timestamp); } if(!isAuctionActive(auctionId) || block.timestamp < config.buyNowStartTime) { totalFailed += expectedPrice; continue; } Auction memory highestBid = auctionIdToAuction[auctionId]; uint256 bidIncrease = highestBid.amount >= BID_INCREASE_THRESHOLD ? MIN_BID_INCREASE_POST : MIN_BID_INCREASE_PRE; if ( expectedPrice >= (highestBid.amount * (BPS + bidIncrease) / BPS) && expectedPrice >= reservePrice(auctionId) ) { uint256 refundAmount; address refundBidder; uint256 offset = highestBid.offsetFromEnd; uint256 endTime = getAuctionEndTime(auctionId); if (highestBid.amount > 0) { refundAmount = highestBid.amount; refundBidder = highestBid.bidder; } if (endTime - block.timestamp < EXTENSION_TIME) { offset += block.timestamp + EXTENSION_TIME - endTime; } auctionIdToAuction[auctionId] = Auction(uint24(offset), uint72(expectedPrice), msg.sender); emit BidMade( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), msg.sender, expectedPrice, block.timestamp ); if (refundAmount > 0) { SafeTransferLib.forceSafeTransferETH(refundBidder, refundAmount, SAFE_GAS_LIMIT); } } else{ totalFailed += expectedPrice; } } require(msg.value == expectedTotal, 'Incorrect amount of ETH sent'); if (totalFailed > 0) { SafeTransferLib.forceSafeTransferETH(msg.sender, totalFailed, SAFE_GAS_LIMIT); } } function buyNow( uint256 auctionId ) external payable { AuctionConfig memory config = auctionConfig[auctionId]; uint256 amountToPay = config.buyNowPrice; require(!paused, 'Buying is paused'); require(block.timestamp >= config.buyNowStartTime, 'Can not buy now yet.'); require(config.auctionStartTime > block.timestamp, 'Auction already started.'); require(amountToPay != 0 && msg.value == amountToPay, 'Incorrect ETH sent.'); auctionConfig[auctionId].auctionStartTime = uint80(block.timestamp - INIT_AUCTION_DURATION); auctionIdToAuction[auctionId] = Auction(0, uint72(msg.value), msg.sender); _mint(msg.sender, auctionId); emit Settled( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), block.timestamp ); uint256 split = config.split; if (split == 0) { split = DEFAULT_SPLIT; } uint256 amountForArtist = amountToPay * split / 10_000; SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT); SafeTransferLib.forceSafeTransferETH(beneficiary, amountToPay - amountForArtist, SAFE_GAS_LIMIT); } function buyNowMultiple( uint256[] calldata auctionIds ) external payable { require(!paused, 'Buying is paused'); uint256 totalFailed; uint256 totalPrice; for(uint256 i; i < auctionIds.length; ++i) { uint256 auctionId = auctionIds[i]; AuctionConfig memory config = auctionConfig[auctionId]; uint256 amountToPay = config.buyNowPrice; if ( (block.timestamp < config.buyNowStartTime) ||(config.auctionStartTime <= block.timestamp) || amountToPay == 0 ) { totalFailed += amountToPay; continue; } auctionConfig[auctionId].auctionStartTime = uint80(block.timestamp - INIT_AUCTION_DURATION); auctionIdToAuction[auctionId] = Auction(0, uint72(amountToPay), msg.sender); totalPrice += amountToPay; _mint(msg.sender, auctionId); emit Settled( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), block.timestamp ); uint256 split = config.split; if (split == 0) { split = DEFAULT_SPLIT; } uint256 amountForArtist = amountToPay * split / 10_000; SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT); SafeTransferLib.forceSafeTransferETH(beneficiary, amountToPay - amountForArtist, SAFE_GAS_LIMIT); } require(totalPrice == msg.value, 'Incorrect ETH amount sent.'); if (totalFailed > 0) { SafeTransferLib.forceSafeTransferETH(msg.sender, totalFailed, SAFE_GAS_LIMIT); } } function settleAuction( uint256 auctionId ) external payable { Auction memory highestBid = auctionIdToAuction[auctionId]; AuctionConfig memory config = auctionConfig[auctionId]; require(isAuctionOver(auctionId), 'Auction is still active'); uint256 amountToPay = highestBid.amount; if (amountToPay > 0) { _mint(highestBid.bidder, auctionId); } else { require(msg.value == reservePrice(auctionId), 'Incorrect funds sent for unclaimed'); amountToPay = msg.value; _mint(owner(), auctionId); } emit Settled( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), block.timestamp ); uint256 split = config.split; if (split == 0) { split = DEFAULT_SPLIT; } uint256 amountForArtist = amountToPay * split / 10_000; SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT); SafeTransferLib.forceSafeTransferETH(beneficiary, amountToPay - amountForArtist, SAFE_GAS_LIMIT); } function settleMultipleAuctions( uint256[] calldata auctionIds ) external payable { uint256 unclaimedCost; uint256 amountForBene; for (uint256 i; i < auctionIds.length; ++i) { uint256 auctionId = auctionIds[i]; Auction memory highestBid = auctionIdToAuction[auctionId]; require(isAuctionOver(auctionId), 'Auction is still active'); uint256 amountToPay = highestBid.amount; if (amountToPay > 0) { _mint(highestBid.bidder, auctionId); } else { amountToPay = reservePrice(auctionId); unclaimedCost += amountToPay; _mint(owner(), auctionId); } emit Settled( auctionId, getCollectionFromId(auctionId), getArtTokenIdFromId(auctionId), block.timestamp ); AuctionConfig memory config = auctionConfig[auctionId]; uint256 split = config.split; if (split == 0) { split = DEFAULT_SPLIT; } uint256 amountForArtist = amountToPay * split / 10_000; SafeTransferLib.forceSafeTransferETH(config.artist, amountForArtist, SAFE_GAS_LIMIT); amountForBene += amountToPay - amountForArtist; } require(msg.value == unclaimedCost, 'Incorrect funds sent for unclaimed'); SafeTransferLib.forceSafeTransferETH(beneficiary, amountForBene, SAFE_GAS_LIMIT); } function _mint( address to, uint256 auctionId ) internal { address collection = getCollectionFromId(auctionId); uint256 tokenId = getArtTokenIdFromId(auctionId); try INFT(collection).ownerOf(tokenId) returns (address _owner) { if (_owner == address(0)) { INFT(collection).mint(to, tokenId); } else { INFT(collection).transferFrom(_owner, to, tokenId); } } catch { INFT(collection).mint(to, tokenId); } } function _changePrices( address collectionAddress, uint256 tokenId, uint256 newBuyNowPrice, uint256 newReservePrice ) internal { uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId); require(auctionConfig[auctionId].auctionStartTime > block.timestamp); auctionConfig[auctionId].buyNowPrice = uint88(newBuyNowPrice); auctionConfig[auctionId].reservePrice = uint88(newReservePrice); } function _changeSplit( address collectionAddress, uint256 tokenId, address artist, uint256 newSplit ) internal { uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId); if (artist != address(0)) { auctionConfig[auctionId].artist = artist; } auctionConfig[auctionId].split = uint16(newSplit); } function _reschedule( address collectionAddress, uint256 tokenId, uint256 newBuyNowStartTime, uint256 newAuctionStartTime ) internal { uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId); require(auctionConfig[auctionId].auctionStartTime > block.timestamp); require(newBuyNowStartTime <= newAuctionStartTime); auctionConfig[auctionId].buyNowStartTime = uint80(newBuyNowStartTime); auctionConfig[auctionId].auctionStartTime = uint80(newAuctionStartTime); } function _schedule( address collectionAddress, uint256 tokenId, uint256 buyNowStartTime, uint256 auctionStartTime, address artist, uint256 split, uint256 buyNowPrice, uint256 reserve ) internal { uint256 auctionId = artTokentoAuctionId(collectionAddress, tokenId); require(auctionConfig[auctionId].auctionStartTime == 0); uint256 adjAucStartTime = auctionStartTime; if (adjAucStartTime == 0) { adjAucStartTime = type(uint80).max; } auctionConfig[auctionId] = AuctionConfig( artist, uint16(split), uint80(buyNowStartTime), uint80(adjAucStartTime), uint88(buyNowPrice), uint88(reserve) ); } // ONLY OWNER function changePrices( address collectionAddress, uint256 tokenId, uint256 newBuyNowPrice, uint256 newReservePrice ) external onlyOwner { _changePrices(collectionAddress, tokenId, newBuyNowPrice, newReservePrice); } function changePricesMultiple( address[] calldata collections, uint256[] calldata tokenIds, uint256[] calldata newBuyNowPrices, uint256[] calldata newReservePrices ) external onlyOwner { require( collections.length == tokenIds.length && tokenIds.length == newBuyNowPrices.length && newBuyNowPrices.length == newReservePrices.length, 'Array length mismatch' ); for(uint256 i; i < collections.length; ++i) { _changePrices(collections[i], tokenIds[i], newBuyNowPrices[i], newReservePrices[i]); } } function changeSplit( address collectionAddress, uint256 tokenId, address artist, uint256 split ) external onlyOwner { _changeSplit(collectionAddress, tokenId, artist, split); } function changeSplitMultiple( address[] calldata collections, uint256[] calldata tokenIds, address[] calldata artists, uint256[] calldata splits ) external onlyOwner { require( collections.length == tokenIds.length && tokenIds.length == artists.length && artists.length == splits.length, 'Array length mismatch' ); for(uint256 i; i < collections.length; ++i) { _changeSplit(collections[i], tokenIds[i], artists[i], splits[i]); } } function reschedule( address collectionAddress, uint256 tokenId, uint256 newBuyNowStartTime, uint256 newAuctionStartTime ) external onlyOwner { _reschedule(collectionAddress, tokenId, newBuyNowStartTime, newAuctionStartTime); } function rescheduleMultiple( address[] calldata collections, uint256[] calldata tokenIds, uint256[] calldata newBuyNowStartTimes, uint256[] calldata newAuctionStartTimes ) external onlyOwner { require( collections.length == tokenIds.length && tokenIds.length == newBuyNowStartTimes.length && newBuyNowStartTimes.length == newAuctionStartTimes.length, 'Array length mismatch' ); for(uint256 i; i < collections.length; ++i) { _reschedule(collections[i], tokenIds[i], newBuyNowStartTimes[i], newAuctionStartTimes[i]); } } function schedule( address collectionAddress, uint256 tokenId, uint256 buyNowStartTime, uint256 auctionStartTime, address artist, uint256 split, uint256 buyNowPrice, uint256 reserve ) external onlyOwner { _schedule( collectionAddress, tokenId, buyNowStartTime, auctionStartTime, artist, split, buyNowPrice, reserve ); } function scheduleMultiple( address[] calldata collections, uint256[] calldata tokenIds, uint256[] calldata buyNowStartTimes, uint256[] calldata auctionStartTimes, address[] calldata artists, uint256[] calldata splits, uint256[] calldata buyNowPrices, uint256[] calldata reservePrices ) external onlyOwner { require( collections.length == tokenIds.length && tokenIds.length == buyNowStartTimes.length && buyNowStartTimes.length == auctionStartTimes.length && auctionStartTimes.length == artists.length && artists.length == splits.length && splits.length == buyNowPrices.length && buyNowPrices.length == reservePrices.length, 'Array length mismatch' ); for(uint256 i; i < collections.length; ++i) { _schedule( collections[i], tokenIds[i], buyNowStartTimes[i], auctionStartTimes[i], artists[i], splits[i], buyNowPrices[i], reservePrices[i] ); } } function setBeneficiary( address _beneficiary ) external onlyOwner { beneficiary = _beneficiary; } function setPaused( bool _paused ) external onlyOwner { paused = _paused; } // GETTERS function artTokentoAuctionId( address collection, uint256 tokenId ) public pure returns (uint256) { return (uint256(uint160(collection)) << 96) | uint96(tokenId); } function isAuctionActive( uint256 auctionId ) public view returns (bool) { uint256 startTime = auctionConfig[auctionId].auctionStartTime; uint256 endTime = getAuctionEndTime(auctionId); return (startTime > 0 && block.timestamp >= startTime && block.timestamp < endTime); } function isAuctionOver( uint256 auctionId ) public view returns (bool) { uint256 startTime = auctionConfig[auctionId].auctionStartTime; uint256 endTime = getAuctionEndTime(auctionId); return (startTime > 0 && block.timestamp >= endTime); } function getAuctionEndTime( uint256 auctionId ) public view returns (uint256) { return auctionConfig[auctionId].auctionStartTime + INIT_AUCTION_DURATION + auctionIdToAuction[auctionId].offsetFromEnd; } function getAuctionStartTime( uint256 auctionId ) external view returns (uint256) { return auctionConfig[auctionId].auctionStartTime; } function getCollectionFromId( uint256 id ) public pure returns (address) { return address(uint160(id >> 96)); } function getArtTokenIdFromId( uint256 id ) public pure returns (uint256) { return uint256(uint96(id)); } function reservePrice( uint256 auctionId ) public view returns (uint256) { uint256 reserve = auctionConfig[auctionId].reservePrice; return reserve != 0 ? reserve : MIN_BID; } } interface INFT { function mint(address to, uint256 tokenId) external; function ownerOf(uint256 tokenId) external view returns (address); function transferFrom(address from, address to, uint256 tokenId) external; }
{ "optimizer": { "enabled": true, "runs": 200 }, "viaIR": true, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "shanghai", "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"bidder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BidMade","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":true,"internalType":"uint256","name":"auctionId","type":"uint256"},{"indexed":true,"internalType":"address","name":"collectionAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Settled","type":"event"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"artTokentoAuctionId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionConfig","outputs":[{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint16","name":"split","type":"uint16"},{"internalType":"uint80","name":"buyNowStartTime","type":"uint80"},{"internalType":"uint80","name":"auctionStartTime","type":"uint80"},{"internalType":"uint88","name":"buyNowPrice","type":"uint88"},{"internalType":"uint88","name":"reservePrice","type":"uint88"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"auctionIdToAuction","outputs":[{"internalType":"uint24","name":"offsetFromEnd","type":"uint24"},{"internalType":"uint72","name":"amount","type":"uint72"},{"internalType":"address","name":"bidder","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"favorites","type":"uint256[]"},{"internalType":"uint256[]","name":"expectedPrices","type":"uint256[]"}],"name":"bidOnFavs","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"buyNow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"auctionIds","type":"uint256[]"}],"name":"buyNowMultiple","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"newBuyNowPrice","type":"uint256"},{"internalType":"uint256","name":"newReservePrice","type":"uint256"}],"name":"changePrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"newBuyNowPrices","type":"uint256[]"},{"internalType":"uint256[]","name":"newReservePrices","type":"uint256[]"}],"name":"changePricesMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint256","name":"split","type":"uint256"}],"name":"changeSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address[]","name":"artists","type":"address[]"},{"internalType":"uint256[]","name":"splits","type":"uint256[]"}],"name":"changeSplitMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getArtTokenIdFromId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"getAuctionEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"getAuctionStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getCollectionFromId","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"isAuctionActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"isAuctionOver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"newBuyNowStartTime","type":"uint256"},{"internalType":"uint256","name":"newAuctionStartTime","type":"uint256"}],"name":"reschedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"newBuyNowStartTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"newAuctionStartTimes","type":"uint256[]"}],"name":"rescheduleMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"reservePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collectionAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"buyNowStartTime","type":"uint256"},{"internalType":"uint256","name":"auctionStartTime","type":"uint256"},{"internalType":"address","name":"artist","type":"address"},{"internalType":"uint256","name":"split","type":"uint256"},{"internalType":"uint256","name":"buyNowPrice","type":"uint256"},{"internalType":"uint256","name":"reserve","type":"uint256"}],"name":"schedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"collections","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"buyNowStartTimes","type":"uint256[]"},{"internalType":"uint256[]","name":"auctionStartTimes","type":"uint256[]"},{"internalType":"address[]","name":"artists","type":"address[]"},{"internalType":"uint256[]","name":"splits","type":"uint256[]"},{"internalType":"uint256[]","name":"buyNowPrices","type":"uint256[]"},{"internalType":"uint256[]","name":"reservePrices","type":"uint256[]"}],"name":"scheduleMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"setBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"auctionId","type":"uint256"}],"name":"settleAuction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"auctionIds","type":"uint256[]"}],"name":"settleMultipleAuctions","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080806040523461005a575f8054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a3612406908161005f8239f35b5f80fdfe6102a0806040526004361015610013575f80fd5b5f3560e01c9081630254837614611a045750806302ffbaba1461180e578063089c584b146117ec57806308a0f32f146115c65780631033a663146111e15780631107a8fc1461116a57806316c38b3c146111255780631ae03271146110885780631c31f71014611045578063210bb50214610fb45780632c104a9214610f965780632e99361114610dff57806337fee62514610d6657806338af3eed14610d3e578063454a2ab314610a63578063469847fd1461074e57806359aab2421461072c5780635c975abb146107075780636892b714146104805780637100dd871461043c578063715018a6146103e55780638624e7df1461039f5780638c77cc09146103795780638da5cb5b14610352578063919e84f51461031c578063930e79f1146102fe57806395657db0146102de578063e361c5a8146102b8578063e71f7b1514610290578063f2fde38b146101cf5763ff6f95bc14610172575f80fd5b346101cb576101003660031901126101cb5761018c611a7b565b608435906001600160a01b03821682036101cb576101c9916101ac611b40565b60e4359160c4359160a4359160643590604435906024359061214b565b005b5f80fd5b346101cb5760203660031901126101cb576101e8611a7b565b6101f0611b40565b6001600160a01b0390811690811561023c575f54826001600160601b0360a01b8216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346101cb5760203660031901126101cb5760206102ae6004356122cb565b6040519015158152f35b346101cb5760203660031901126101cb5760206102d66004356123a7565b604051908152f35b346101cb5760203660031901126101cb57602060405160043560601c8152f35b346101cb5760203660031901126101cb5760206102d660043561234a565b346101cb5760203660031901126101cb576004355f52600260205260206001600160501b03600160405f20015416604051908152f35b346101cb575f3660031901126101cb575f546040516001600160a01b039091168152602090f35b346101cb5760203660031901126101cb5760206040516001600160601b03600435168152f35b346101cb5760803660031901126101cb576103b8611a7b565b604435906001600160a01b03821682036101cb576101c9916103d8611b40565b606435916024359061204c565b346101cb575f3660031901126101cb576103fd611b40565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101cb5760403660031901126101cb576020610457611a7b565b60405160609190911b6bffffffffffffffffffffffff19166024356001600160601b0316178152f35b346101cb576101003660031901126101cb5767ffffffffffffffff6004358181116101cb576104b3903690600401611a4a565b61018052610160526024358181116101cb576104d3903690600401611a4a565b6102005260c0526044358181116101cb576104f2903690600401611a4a565b6101e052610120526064358181116101cb57610512903690600401611a4a565b6101c05260a0526084358181116101cb57610531903690600401611a4a565b6102805260e05260a4358181116101cb57610550903690600401611a4a565b610240526101005260c4358181116101cb57610570903690600401611a4a565b610260526101405260e435116101cb5761058f3660e435600401611a4a565b610220526101a05261059f611b40565b610200516101805114806106f8575b806106e9575b806106da575b806106cb575b806106bc575b806106ad575b6105d590611ff4565b5f6080525b61018051608051106105e857005b61069a6106066106016080516101805161016051611cc6565b612038565b6106186080516102005160c051611cc6565b3561062c6080516101e05161012051611cc6565b3561063f6080516101c05160a051611cc6565b356106556106016080516102805160e051611cc6565b906106696080516102405161010051611cc6565b359261067e6080516102605161014051611cc6565b3594610693608051610220516101a051611cc6565b359661214b565b6106a5608051611cb8565b6080526105da565b506102205161026051146105cc565b506102605161024051146105c6565b506102405161028051146105c0565b50610280516101c051146105ba565b506101c0516101e051146105b4565b506101e05161020051146105ae565b346101cb575f3660031901126101cb57602060ff60015460a01c166040519015158152f35b346101cb576101c961073d36611a91565b92610749929192611b40565b6120d0565b60203660031901126101cb5760043567ffffffffffffffff81116101cb5761077a903690600401611a4a565b9061078d60ff60015460a01c1615611cea565b5f9182918291426201517f1901905b80841061080157858534036107bc57806107b257005b6101c99033611c64565b60405162461bcd60e51b815260206004820152601a60248201527f496e636f72726563742045544820616d6f756e742073656e742e0000000000006044820152606490fd5b90919293610810858386611cc6565b3594855f52600260205260405f206040519061082b82611c07565b60018154818060a01b038116845261ffff8160a01c16602085015260b01c918260408501520154906001600160501b038216908160608501526001600160581b038360501c1660808501528260a81c60a08501524210908115610a58575b508015610a44575b610a1e57428611610a0a576109ee6109f49261094a6109f9968b5f526002602052600160405f20016001600160501b038b166001600160501b03198254161790556040516108de81611bd7565b5f81528c602082016001600160481b038860501c16815260408301913383525f5260036020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b1691171790556001600160581b038560501c1690611c37565b996109558133611dcc565b6040514281526001600160601b038216917f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a4160208260601c93a461ffff6020820151168015610a01575b6127106109bb6109d0926001600160581b038760501c16611c44565b925192049182906001600160a01b0316611c64565b6001546001600160a01b03169260501c6001600160581b0316611c57565b90611c64565b611cb8565b92919061079c565b50611d4c61099f565b634e487b7160e01b5f52601160045260245ffd5b6109f9939750610a3e929891506001600160581b039060501c1690611c37565b95611cb8565b506001600160581b038160501c1615610891565b90504210158a610889565b6020806003193601126101cb5760043590610a8660ff60015460a01c1615611b97565b815f5260028152600160405f200180546001600160501b038080831614610d26575b505050610ab4826122cb565b80610d0e575b15610cd757815f526003815260405f209160405192610ad884611bd7565b5462ffffff9283821685526001600160481b03808360181c169482870195808752604088019460601c85526702c68af0bb1400008110155f14610cce576103e8905b612710918201808311610a0a57610b3091611c44565b0434101580610cbc575b15610c81575f95815f9851169483610b518861234a565b92511680610c6b575b505061025880610b6a4284611c57565b10610c36575b5050806bffffffffffffffffff0000009160405195610b8e87611bd7565b168552838501923416835260036040860194338652875f525260405f20945116915160181b16916001600160601b0319905160601b1691171790556040516001600160601b038216917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b8160601c9280610c2342343384604091949392606082019560018060a01b0316825260208201520152565b0390a480610c2d57005b6101c991611c64565b949194420191824211610a0a57610c5d610c63926bffffffffffffffffff00000094611c57565b90611c37565b939088610b70565b90516001600160a01b0316985096508880610b5a565b60405162461bcd60e51b8152600481018490526013602482015272084d2c840dcdee840d0d2ced040cadcdeeaced606b1b6044820152606490fd5b50610cc6856123a7565b341015610b3a565b6107d090610b1a565b6064906040519062461bcd60e51b82526004820152601060248201526f41756374696f6e20496e61637469766560801b6044820152fd5b50815f526002815260405f205460b01c421015610aba565b4216906001600160501b031916179055828080610aa8565b346101cb575f3660031901126101cb576001546040516001600160a01b039091168152602090f35b346101cb57610d7436611abf565b9596610d8595949593929193611b40565b85881480610df6575b80610ded575b610d9d90611ff4565b5f5b888110610da857005b806109f4610dbd610601610de8948d87611cc6565b8a610dc9848c8c611cc6565b35610de185610dd9818b8d611cc6565b35938c611cc6565b35926120d0565b610d9f565b50818714610d94565b50818614610d8e565b6020806003193601126101cb576101c990600435805f526003825260405f2060405190610e2b82611bd7565b549162ffffff831682526001600160481b03604085840193828660181c168552019360601c8452815f526002855260405f209460405192610e6b84611c07565b86549260018060a01b03958685168652600161ffff99858801968b8160a01c16885260b01c604089015201546001600160501b03811660608801526001600160581b038160501c16608088015260a81c60a0870152610ed1610ecc84612313565b611d29565b5116958615610f61579285949282610ef46109ee999a9488610f4e985116611dcc565b604051904282527f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a416001600160601b038216938260601c93a451168015610f58575b610f436127109188611c44565b049384915116611c64565b6001541692611c57565b50611d4c610f36565b50956109ee9550610f4e92859492610f82610f7b8a6123a7565b3414611d75565b3498610f9181885f5416611dcc565b610ef4565b346101cb5760203660031901126101cb5760206102ae600435612313565b346101cb57610fc236611abf565b9596610fd395949593929193611b40565b8588148061103c575b80611033575b610feb90611ff4565b5f5b888110610ff657005b806109f461100b61060161102e948d87611cc6565b8a611017848c8c611cc6565b3561102785610dd9818b8d611cc6565b3592611f61565b610fed565b50818714610fe2565b50818614610fdc565b346101cb5760203660031901126101cb5761105e611a7b565b611066611b40565b600180546001600160a01b0319166001600160a01b0392909216919091179055005b346101cb5761109636611abf565b9594939092916110a4611b40565b8186148061111c575b80611113575b6110bc90611ff4565b5f5b8681106110c757005b806109f4878a87611107858f6106018f998b6110f9828f6110f361110e9f83610601916111009a611cc6565b9b611cc6565b3596611cc6565b938c611cc6565b359261204c565b6110be565b508087146110b3565b508082146110ad565b346101cb5760203660031901126101cb576004358015158091036101cb5761114b611b40565b6001805460ff60a01b191660a09290921b60ff60a01b16919091179055005b346101cb5760203660031901126101cb576004355f52600260205260c060405f20600181549101546040519160018060a01b038116835261ffff8160a01c16602084015260b01c60408301526001600160501b03811660608301526001600160581b038160501c16608083015260a81c60a0820152f35b60403660031901126101cb5767ffffffffffffffff6004358181116101cb5761120e903690600401611a4a565b916024359081116101cb57611227903690600401611a4a565b929061123b60ff60015460a01c1615611b97565b8382036101cb575f935f925f5b8181106112a3578685340361125e57806107b257005b60405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606490fd5b6112ae818388611cc6565b35906112c66112be828688611cc6565b358097611c37565b95825f5260028060205260405f20906001600160501b036001604051936112ec85611c07565b8054828060a01b038116865261ffff8160a01c16602087015260b01c60408601520154818116908160608601526001600160581b038160501c16608086015260a81c60a08501521461159a575b50611343846122cb565b15908115611583575b5061157457825f52600360205260405f20926040519361136b85611bd7565b5462ffffff81168552601881901c6001600160481b031660208601819052606082901c60408701526702c68af0bb1400001161156c576103e85b61271001908161271011610a0a57612710916001600160481b036113cc9260181c16611c44565b048210158061155a575b15611544575f905f9262ffffff8651166113ef8361234a565b966001600160481b036020820151168061152a575b505061025896876114154283611c57565b10611508575b506114f3965062ffffff6040519161143283611bd7565b168152602081016001600160481b03831681526040820190338252845f5260036020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055604051917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b6001600160601b03821693806114e38460601c9542903384604091949392606082019560018060a01b0316825260208201520152565b0390a4806114f8575b5050611cb8565b611248565b61150191611c64565b88806114ec565b908742014211610a0a57610c5d611524926114f3994201611c57565b8d61141b565b6040909101516001600160a01b0316955093508d80611404565b506114f392506115549198611c37565b96611cb8565b50611564816123a7565b8210156113d6565b6107d06113a5565b6114f392506115549198611c37565b6001600160501b039150604001511642108a61134c565b845f52602052600160405f20016001600160501b0342166001600160501b03198254161790558a611339565b6020806003193601126101cb57600435805f526002825260405f2090604051916115ef83611c07565b80549060018060a01b0391828116855261ffff94600187820193878460a01c168552604083019360b01c84520154956001600160501b0392836060840191818a1683526001600160581b038a60501c16998a608087015260a81c60a086015261166060ff60015460a01c1615611cea565b511642106117b0578342915116111561176b5786151580611762575b15611727576201517f19420193428511610a0a576101c998878796610f4e966109ee9a5f5260028452600160405f200191166001600160501b03198254161790556040516116c981611bd7565b5f81528281016001600160481b03341681526040820190338252835f52600385526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055610ef48133611dcc565b60405162461bcd60e51b815260048101899052601360248201527224b731b7b93932b1ba1022aa241039b2b73a1760691b6044820152606490fd5b5086341461167c565b60405162461bcd60e51b815260048101899052601860248201527f41756374696f6e20616c726561647920737461727465642e00000000000000006044820152606490fd5b60405162461bcd60e51b8152600481018a9052601460248201527321b0b7103737ba10313abc903737bb903cb2ba1760611b6044820152606490fd5b346101cb576101c96117fd36611a91565b92611809929192611b40565b611f61565b6020806003193601126101cb5760043567ffffffffffffffff81116101cb5761183b903690600401611a4a565b5f92915f925f925b80841061186a576101c985611859883414611d75565b6001546001600160a01b0316611c64565b90919293611879858386611cc6565b35805f526003845260405f20906040519161189383611bd7565b549062ffffff821683526001600160481b03868401818460181c16815260406060950193851c84526118c7610ecc84612313565b51169182156119c857926119b79492826118f1610c5d946119b19760018060a01b03905116611dcc565b6040514281526001600160601b03821690827f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a418c82881c93a45f52600288526119ac60405f2092896040519161194683611c07565b8554906001808060a01b0397888416865260a09361ffff81861c16809688015260b01c60408701520154906001600160501b038216908501526001600160581b038160501c16608085015260a81c9083015280156119bf575b610f436127109185611c44565b611c57565b94611cb8565b929190611843565b50611d4c61199f565b50976119b79391506119b192610c5d916119eb6119e48c6123a7565b8092611c37565b9a6119ff8160018060a01b035f5416611dcc565b6118f1565b346101cb5760203660031901126101cb576060906004355f52600360205260405f205462ffffff811682526001600160481b038160181c166020830152821c6040820152f35b9181601f840112156101cb5782359167ffffffffffffffff83116101cb576020808501948460051b0101116101cb57565b600435906001600160a01b03821682036101cb57565b60809060031901126101cb576004356001600160a01b03811681036101cb5790602435906044359060643590565b60806003198201126101cb5767ffffffffffffffff906004358281116101cb5781611aec91600401611a4a565b939093926024358181116101cb5783611b0791600401611a4a565b939093926044358381116101cb5782611b2291600401611a4a565b939093926064359182116101cb57611b3c91600401611a4a565b9091565b5f546001600160a01b03163303611b5357565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b15611b9e57565b60405162461bcd60e51b8152602060048201526011602482015270109a59191a5b99c81a5cc81c185d5cd959607a1b6044820152606490fd5b6060810190811067ffffffffffffffff821117611bf357604052565b634e487b7160e01b5f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117611bf357604052565b67ffffffffffffffff8111611bf357604052565b91908201809211610a0a57565b81810292918115918404141715610a0a57565b91908203918211610a0a57565b90804710611cab575f91828080808585617530f115611c8257505050565b601691600b9184526073825360ff602053f015611c9d575b50565b620f42405a11611c9a575b80fd5b63b12d13eb5f526004601cfd5b5f198114610a0a5760010190565b9190811015611cd65760051b0190565b634e487b7160e01b5f52603260045260245ffd5b15611cf157565b60405162461bcd60e51b815260206004820152601060248201526f109d5e5a5b99c81a5cc81c185d5cd95960821b6044820152606490fd5b15611d3057565b60405162461bcd60e51b815260206004820152601760248201527f41756374696f6e206973207374696c6c206163746976650000000000000000006044820152606490fd5b15611d7c57565b60405162461bcd60e51b815260206004820152602260248201527f496e636f72726563742066756e64732073656e7420666f7220756e636c61696d604482015261195960f21b6064820152608490fd5b6001600160601b038260601c92169060409182516331a9108f60e11b8152816004820152602081602481885afa80915f91611ef3575b5090611e645750833b156101cb5782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f908390818381604481015b03925af1908115611e5b5750611e5257505b565b611e5090611c23565b513d5f823e3d90fd5b6001600160a01b0390811680611eaf575050833b156101cb5782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f90839081838160448101611e3e565b8591959392933b156101cb575f6064928195875198899687956323b872dd60e01b8752600487015216602485015260448401525af1908115611e5b5750611e525750565b60203d8111611f5a575b601f8101601f1916820167ffffffffffffffff811183821017611f46576020918391895281010312611f425751906001600160a01b0382168203611ca857505f611e02565b5080fd5b634e487b7160e01b84526041600452602484fd5b503d611efd565b906001600160601b0316906001600160601b03199060601b16175f526002602052600160405f2001906001600160501b038254164210156101cb5781546affffffffffffffffffffff60501b191660509190911b6affffffffffffffffffffff60501b16178155611e50916001600160581b039082546001600160a81b0316911660a81b6001600160a81b031916179055565b15611ffb57565b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b356001600160a01b03811681036101cb5790565b9161ffff926001600160601b03611e50959316906001600160601b03199060601b16179060018060a01b0316806120ac575b505f908152600260205260409020805461ffff60a01b19169290911660a01b61ffff60a01b16919091179055565b815f52600260205260405f20906001600160601b0360a01b8254161790555f61207e565b929091926001600160601b035f9316906001600160601b03199060601b1617825260026020526040822060018101936001600160501b039384865416421015611ca857838211611ca8575081546001600160b01b031690841660b01b6001600160b01b031916179055166001600160501b0319825416179055565b60601b6bffffffffffffffffffffffff19166001600160601b03909116175f818152600260205260408120600101546001600160501b0398919791969295919493929089166122c7579188939291849284156122be575b61ffff916001600160581b039a8b99604051976121be89611c07565b600160a01b6001900380941689528560208a01951685528760408a0197168752606089019e8f911690528a608089019a168a528a60a089019c168c5281526002602052604090209551166001600160601b0360a01b865416178555511661223d90849081549061ffff60a01b9060a01b169061ffff60a01b1916179055565b5182546001600160b01b0316911660b01b6001600160b01b0319161781556001019551166001600160501b0319865416178555511661229e9084908154906001600160581b0360501b9060501b16906001600160581b0360501b1916179055565b5182546001600160a81b0316911660a81b6001600160a81b031916179055565b935082936121a2565b8780fd5b805f5260026020526122ed6001600160501b03600160405f200154169161234a565b8115159182612308575b5081612301575090565b9050421090565b42101591505f6122f7565b805f5260026020526123356001600160501b03600160405f200154169161234a565b9015159081612342575090565b905042101590565b905f9180835260026020526001600160501b03600160408520015416906201518082018092116123935760408462ffffff92612390959652600360205220541690611c37565b90565b634e487b7160e01b84526011600452602484fd5b5f9081526002602052604090206001015460a81c80156123c45790565b50662386f26fc100009056fea26469706673582212209eb44b425fef9950b2d08a3557d06e8d2e4de1647775c6834c49146f12492c2464736f6c63430008150033
Deployed Bytecode
0x6102a0806040526004361015610013575f80fd5b5f3560e01c9081630254837614611a045750806302ffbaba1461180e578063089c584b146117ec57806308a0f32f146115c65780631033a663146111e15780631107a8fc1461116a57806316c38b3c146111255780631ae03271146110885780631c31f71014611045578063210bb50214610fb45780632c104a9214610f965780632e99361114610dff57806337fee62514610d6657806338af3eed14610d3e578063454a2ab314610a63578063469847fd1461074e57806359aab2421461072c5780635c975abb146107075780636892b714146104805780637100dd871461043c578063715018a6146103e55780638624e7df1461039f5780638c77cc09146103795780638da5cb5b14610352578063919e84f51461031c578063930e79f1146102fe57806395657db0146102de578063e361c5a8146102b8578063e71f7b1514610290578063f2fde38b146101cf5763ff6f95bc14610172575f80fd5b346101cb576101003660031901126101cb5761018c611a7b565b608435906001600160a01b03821682036101cb576101c9916101ac611b40565b60e4359160c4359160a4359160643590604435906024359061214b565b005b5f80fd5b346101cb5760203660031901126101cb576101e8611a7b565b6101f0611b40565b6001600160a01b0390811690811561023c575f54826001600160601b0360a01b8216175f55167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a3005b60405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608490fd5b346101cb5760203660031901126101cb5760206102ae6004356122cb565b6040519015158152f35b346101cb5760203660031901126101cb5760206102d66004356123a7565b604051908152f35b346101cb5760203660031901126101cb57602060405160043560601c8152f35b346101cb5760203660031901126101cb5760206102d660043561234a565b346101cb5760203660031901126101cb576004355f52600260205260206001600160501b03600160405f20015416604051908152f35b346101cb575f3660031901126101cb575f546040516001600160a01b039091168152602090f35b346101cb5760203660031901126101cb5760206040516001600160601b03600435168152f35b346101cb5760803660031901126101cb576103b8611a7b565b604435906001600160a01b03821682036101cb576101c9916103d8611b40565b606435916024359061204c565b346101cb575f3660031901126101cb576103fd611b40565b5f80546001600160a01b0319811682556001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b346101cb5760403660031901126101cb576020610457611a7b565b60405160609190911b6bffffffffffffffffffffffff19166024356001600160601b0316178152f35b346101cb576101003660031901126101cb5767ffffffffffffffff6004358181116101cb576104b3903690600401611a4a565b61018052610160526024358181116101cb576104d3903690600401611a4a565b6102005260c0526044358181116101cb576104f2903690600401611a4a565b6101e052610120526064358181116101cb57610512903690600401611a4a565b6101c05260a0526084358181116101cb57610531903690600401611a4a565b6102805260e05260a4358181116101cb57610550903690600401611a4a565b610240526101005260c4358181116101cb57610570903690600401611a4a565b610260526101405260e435116101cb5761058f3660e435600401611a4a565b610220526101a05261059f611b40565b610200516101805114806106f8575b806106e9575b806106da575b806106cb575b806106bc575b806106ad575b6105d590611ff4565b5f6080525b61018051608051106105e857005b61069a6106066106016080516101805161016051611cc6565b612038565b6106186080516102005160c051611cc6565b3561062c6080516101e05161012051611cc6565b3561063f6080516101c05160a051611cc6565b356106556106016080516102805160e051611cc6565b906106696080516102405161010051611cc6565b359261067e6080516102605161014051611cc6565b3594610693608051610220516101a051611cc6565b359661214b565b6106a5608051611cb8565b6080526105da565b506102205161026051146105cc565b506102605161024051146105c6565b506102405161028051146105c0565b50610280516101c051146105ba565b506101c0516101e051146105b4565b506101e05161020051146105ae565b346101cb575f3660031901126101cb57602060ff60015460a01c166040519015158152f35b346101cb576101c961073d36611a91565b92610749929192611b40565b6120d0565b60203660031901126101cb5760043567ffffffffffffffff81116101cb5761077a903690600401611a4a565b9061078d60ff60015460a01c1615611cea565b5f9182918291426201517f1901905b80841061080157858534036107bc57806107b257005b6101c99033611c64565b60405162461bcd60e51b815260206004820152601a60248201527f496e636f72726563742045544820616d6f756e742073656e742e0000000000006044820152606490fd5b90919293610810858386611cc6565b3594855f52600260205260405f206040519061082b82611c07565b60018154818060a01b038116845261ffff8160a01c16602085015260b01c918260408501520154906001600160501b038216908160608501526001600160581b038360501c1660808501528260a81c60a08501524210908115610a58575b508015610a44575b610a1e57428611610a0a576109ee6109f49261094a6109f9968b5f526002602052600160405f20016001600160501b038b166001600160501b03198254161790556040516108de81611bd7565b5f81528c602082016001600160481b038860501c16815260408301913383525f5260036020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b1691171790556001600160581b038560501c1690611c37565b996109558133611dcc565b6040514281526001600160601b038216917f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a4160208260601c93a461ffff6020820151168015610a01575b6127106109bb6109d0926001600160581b038760501c16611c44565b925192049182906001600160a01b0316611c64565b6001546001600160a01b03169260501c6001600160581b0316611c57565b90611c64565b611cb8565b92919061079c565b50611d4c61099f565b634e487b7160e01b5f52601160045260245ffd5b6109f9939750610a3e929891506001600160581b039060501c1690611c37565b95611cb8565b506001600160581b038160501c1615610891565b90504210158a610889565b6020806003193601126101cb5760043590610a8660ff60015460a01c1615611b97565b815f5260028152600160405f200180546001600160501b038080831614610d26575b505050610ab4826122cb565b80610d0e575b15610cd757815f526003815260405f209160405192610ad884611bd7565b5462ffffff9283821685526001600160481b03808360181c169482870195808752604088019460601c85526702c68af0bb1400008110155f14610cce576103e8905b612710918201808311610a0a57610b3091611c44565b0434101580610cbc575b15610c81575f95815f9851169483610b518861234a565b92511680610c6b575b505061025880610b6a4284611c57565b10610c36575b5050806bffffffffffffffffff0000009160405195610b8e87611bd7565b168552838501923416835260036040860194338652875f525260405f20945116915160181b16916001600160601b0319905160601b1691171790556040516001600160601b038216917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b8160601c9280610c2342343384604091949392606082019560018060a01b0316825260208201520152565b0390a480610c2d57005b6101c991611c64565b949194420191824211610a0a57610c5d610c63926bffffffffffffffffff00000094611c57565b90611c37565b939088610b70565b90516001600160a01b0316985096508880610b5a565b60405162461bcd60e51b8152600481018490526013602482015272084d2c840dcdee840d0d2ced040cadcdeeaced606b1b6044820152606490fd5b50610cc6856123a7565b341015610b3a565b6107d090610b1a565b6064906040519062461bcd60e51b82526004820152601060248201526f41756374696f6e20496e61637469766560801b6044820152fd5b50815f526002815260405f205460b01c421015610aba565b4216906001600160501b031916179055828080610aa8565b346101cb575f3660031901126101cb576001546040516001600160a01b039091168152602090f35b346101cb57610d7436611abf565b9596610d8595949593929193611b40565b85881480610df6575b80610ded575b610d9d90611ff4565b5f5b888110610da857005b806109f4610dbd610601610de8948d87611cc6565b8a610dc9848c8c611cc6565b35610de185610dd9818b8d611cc6565b35938c611cc6565b35926120d0565b610d9f565b50818714610d94565b50818614610d8e565b6020806003193601126101cb576101c990600435805f526003825260405f2060405190610e2b82611bd7565b549162ffffff831682526001600160481b03604085840193828660181c168552019360601c8452815f526002855260405f209460405192610e6b84611c07565b86549260018060a01b03958685168652600161ffff99858801968b8160a01c16885260b01c604089015201546001600160501b03811660608801526001600160581b038160501c16608088015260a81c60a0870152610ed1610ecc84612313565b611d29565b5116958615610f61579285949282610ef46109ee999a9488610f4e985116611dcc565b604051904282527f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a416001600160601b038216938260601c93a451168015610f58575b610f436127109188611c44565b049384915116611c64565b6001541692611c57565b50611d4c610f36565b50956109ee9550610f4e92859492610f82610f7b8a6123a7565b3414611d75565b3498610f9181885f5416611dcc565b610ef4565b346101cb5760203660031901126101cb5760206102ae600435612313565b346101cb57610fc236611abf565b9596610fd395949593929193611b40565b8588148061103c575b80611033575b610feb90611ff4565b5f5b888110610ff657005b806109f461100b61060161102e948d87611cc6565b8a611017848c8c611cc6565b3561102785610dd9818b8d611cc6565b3592611f61565b610fed565b50818714610fe2565b50818614610fdc565b346101cb5760203660031901126101cb5761105e611a7b565b611066611b40565b600180546001600160a01b0319166001600160a01b0392909216919091179055005b346101cb5761109636611abf565b9594939092916110a4611b40565b8186148061111c575b80611113575b6110bc90611ff4565b5f5b8681106110c757005b806109f4878a87611107858f6106018f998b6110f9828f6110f361110e9f83610601916111009a611cc6565b9b611cc6565b3596611cc6565b938c611cc6565b359261204c565b6110be565b508087146110b3565b508082146110ad565b346101cb5760203660031901126101cb576004358015158091036101cb5761114b611b40565b6001805460ff60a01b191660a09290921b60ff60a01b16919091179055005b346101cb5760203660031901126101cb576004355f52600260205260c060405f20600181549101546040519160018060a01b038116835261ffff8160a01c16602084015260b01c60408301526001600160501b03811660608301526001600160581b038160501c16608083015260a81c60a0820152f35b60403660031901126101cb5767ffffffffffffffff6004358181116101cb5761120e903690600401611a4a565b916024359081116101cb57611227903690600401611a4a565b929061123b60ff60015460a01c1615611b97565b8382036101cb575f935f925f5b8181106112a3578685340361125e57806107b257005b60405162461bcd60e51b815260206004820152601c60248201527f496e636f727265637420616d6f756e74206f66204554482073656e74000000006044820152606490fd5b6112ae818388611cc6565b35906112c66112be828688611cc6565b358097611c37565b95825f5260028060205260405f20906001600160501b036001604051936112ec85611c07565b8054828060a01b038116865261ffff8160a01c16602087015260b01c60408601520154818116908160608601526001600160581b038160501c16608086015260a81c60a08501521461159a575b50611343846122cb565b15908115611583575b5061157457825f52600360205260405f20926040519361136b85611bd7565b5462ffffff81168552601881901c6001600160481b031660208601819052606082901c60408701526702c68af0bb1400001161156c576103e85b61271001908161271011610a0a57612710916001600160481b036113cc9260181c16611c44565b048210158061155a575b15611544575f905f9262ffffff8651166113ef8361234a565b966001600160481b036020820151168061152a575b505061025896876114154283611c57565b10611508575b506114f3965062ffffff6040519161143283611bd7565b168152602081016001600160481b03831681526040820190338252845f5260036020526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055604051917fe55fea5e734015d5114a28644bd784f4484c9d4fa2d29dee5aff56034294e21b6001600160601b03821693806114e38460601c9542903384604091949392606082019560018060a01b0316825260208201520152565b0390a4806114f8575b5050611cb8565b611248565b61150191611c64565b88806114ec565b908742014211610a0a57610c5d611524926114f3994201611c57565b8d61141b565b6040909101516001600160a01b0316955093508d80611404565b506114f392506115549198611c37565b96611cb8565b50611564816123a7565b8210156113d6565b6107d06113a5565b6114f392506115549198611c37565b6001600160501b039150604001511642108a61134c565b845f52602052600160405f20016001600160501b0342166001600160501b03198254161790558a611339565b6020806003193601126101cb57600435805f526002825260405f2090604051916115ef83611c07565b80549060018060a01b0391828116855261ffff94600187820193878460a01c168552604083019360b01c84520154956001600160501b0392836060840191818a1683526001600160581b038a60501c16998a608087015260a81c60a086015261166060ff60015460a01c1615611cea565b511642106117b0578342915116111561176b5786151580611762575b15611727576201517f19420193428511610a0a576101c998878796610f4e966109ee9a5f5260028452600160405f200191166001600160501b03198254161790556040516116c981611bd7565b5f81528281016001600160481b03341681526040820190338252835f52600385526bffffffffffffffffff00000062ffffff60405f20945116915160181b16916001600160601b0319905160601b169117179055610ef48133611dcc565b60405162461bcd60e51b815260048101899052601360248201527224b731b7b93932b1ba1022aa241039b2b73a1760691b6044820152606490fd5b5086341461167c565b60405162461bcd60e51b815260048101899052601860248201527f41756374696f6e20616c726561647920737461727465642e00000000000000006044820152606490fd5b60405162461bcd60e51b8152600481018a9052601460248201527321b0b7103737ba10313abc903737bb903cb2ba1760611b6044820152606490fd5b346101cb576101c96117fd36611a91565b92611809929192611b40565b611f61565b6020806003193601126101cb5760043567ffffffffffffffff81116101cb5761183b903690600401611a4a565b5f92915f925f925b80841061186a576101c985611859883414611d75565b6001546001600160a01b0316611c64565b90919293611879858386611cc6565b35805f526003845260405f20906040519161189383611bd7565b549062ffffff821683526001600160481b03868401818460181c16815260406060950193851c84526118c7610ecc84612313565b51169182156119c857926119b79492826118f1610c5d946119b19760018060a01b03905116611dcc565b6040514281526001600160601b03821690827f7f5920f48fa11434ef5ffb7b29c2915859ad72e6f9987cfafb6e204e22ca3a418c82881c93a45f52600288526119ac60405f2092896040519161194683611c07565b8554906001808060a01b0397888416865260a09361ffff81861c16809688015260b01c60408701520154906001600160501b038216908501526001600160581b038160501c16608085015260a81c9083015280156119bf575b610f436127109185611c44565b611c57565b94611cb8565b929190611843565b50611d4c61199f565b50976119b79391506119b192610c5d916119eb6119e48c6123a7565b8092611c37565b9a6119ff8160018060a01b035f5416611dcc565b6118f1565b346101cb5760203660031901126101cb576060906004355f52600360205260405f205462ffffff811682526001600160481b038160181c166020830152821c6040820152f35b9181601f840112156101cb5782359167ffffffffffffffff83116101cb576020808501948460051b0101116101cb57565b600435906001600160a01b03821682036101cb57565b60809060031901126101cb576004356001600160a01b03811681036101cb5790602435906044359060643590565b60806003198201126101cb5767ffffffffffffffff906004358281116101cb5781611aec91600401611a4a565b939093926024358181116101cb5783611b0791600401611a4a565b939093926044358381116101cb5782611b2291600401611a4a565b939093926064359182116101cb57611b3c91600401611a4a565b9091565b5f546001600160a01b03163303611b5357565b606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b15611b9e57565b60405162461bcd60e51b8152602060048201526011602482015270109a59191a5b99c81a5cc81c185d5cd959607a1b6044820152606490fd5b6060810190811067ffffffffffffffff821117611bf357604052565b634e487b7160e01b5f52604160045260245ffd5b60c0810190811067ffffffffffffffff821117611bf357604052565b67ffffffffffffffff8111611bf357604052565b91908201809211610a0a57565b81810292918115918404141715610a0a57565b91908203918211610a0a57565b90804710611cab575f91828080808585617530f115611c8257505050565b601691600b9184526073825360ff602053f015611c9d575b50565b620f42405a11611c9a575b80fd5b63b12d13eb5f526004601cfd5b5f198114610a0a5760010190565b9190811015611cd65760051b0190565b634e487b7160e01b5f52603260045260245ffd5b15611cf157565b60405162461bcd60e51b815260206004820152601060248201526f109d5e5a5b99c81a5cc81c185d5cd95960821b6044820152606490fd5b15611d3057565b60405162461bcd60e51b815260206004820152601760248201527f41756374696f6e206973207374696c6c206163746976650000000000000000006044820152606490fd5b15611d7c57565b60405162461bcd60e51b815260206004820152602260248201527f496e636f72726563742066756e64732073656e7420666f7220756e636c61696d604482015261195960f21b6064820152608490fd5b6001600160601b038260601c92169060409182516331a9108f60e11b8152816004820152602081602481885afa80915f91611ef3575b5090611e645750833b156101cb5782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f908390818381604481015b03925af1908115611e5b5750611e5257505b565b611e5090611c23565b513d5f823e3d90fd5b6001600160a01b0390811680611eaf575050833b156101cb5782516340c10f1960e01b81526001600160a01b0390921660048301526024820152915f90839081838160448101611e3e565b8591959392933b156101cb575f6064928195875198899687956323b872dd60e01b8752600487015216602485015260448401525af1908115611e5b5750611e525750565b60203d8111611f5a575b601f8101601f1916820167ffffffffffffffff811183821017611f46576020918391895281010312611f425751906001600160a01b0382168203611ca857505f611e02565b5080fd5b634e487b7160e01b84526041600452602484fd5b503d611efd565b906001600160601b0316906001600160601b03199060601b16175f526002602052600160405f2001906001600160501b038254164210156101cb5781546affffffffffffffffffffff60501b191660509190911b6affffffffffffffffffffff60501b16178155611e50916001600160581b039082546001600160a81b0316911660a81b6001600160a81b031916179055565b15611ffb57565b60405162461bcd60e51b8152602060048201526015602482015274082e4e4c2f240d8cadccee8d040dad2e6dac2e8c6d605b1b6044820152606490fd5b356001600160a01b03811681036101cb5790565b9161ffff926001600160601b03611e50959316906001600160601b03199060601b16179060018060a01b0316806120ac575b505f908152600260205260409020805461ffff60a01b19169290911660a01b61ffff60a01b16919091179055565b815f52600260205260405f20906001600160601b0360a01b8254161790555f61207e565b929091926001600160601b035f9316906001600160601b03199060601b1617825260026020526040822060018101936001600160501b039384865416421015611ca857838211611ca8575081546001600160b01b031690841660b01b6001600160b01b031916179055166001600160501b0319825416179055565b60601b6bffffffffffffffffffffffff19166001600160601b03909116175f818152600260205260408120600101546001600160501b0398919791969295919493929089166122c7579188939291849284156122be575b61ffff916001600160581b039a8b99604051976121be89611c07565b600160a01b6001900380941689528560208a01951685528760408a0197168752606089019e8f911690528a608089019a168a528a60a089019c168c5281526002602052604090209551166001600160601b0360a01b865416178555511661223d90849081549061ffff60a01b9060a01b169061ffff60a01b1916179055565b5182546001600160b01b0316911660b01b6001600160b01b0319161781556001019551166001600160501b0319865416178555511661229e9084908154906001600160581b0360501b9060501b16906001600160581b0360501b1916179055565b5182546001600160a81b0316911660a81b6001600160a81b031916179055565b935082936121a2565b8780fd5b805f5260026020526122ed6001600160501b03600160405f200154169161234a565b8115159182612308575b5081612301575090565b9050421090565b42101591505f6122f7565b805f5260026020526123356001600160501b03600160405f200154169161234a565b9015159081612342575090565b905042101590565b905f9180835260026020526001600160501b03600160408520015416906201518082018092116123935760408462ffffff92612390959652600360205220541690611c37565b90565b634e487b7160e01b84526011600452602484fd5b5f9081526002602052604090206001015460a81c80156123c45790565b50662386f26fc100009056fea26469706673582212209eb44b425fef9950b2d08a3557d06e8d2e4de1647775c6834c49146f12492c2464736f6c63430008150033
Deployed Bytecode Sourcemap
20452:18230:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;35886:7;18830:62;;;:::i;:::-;20452:18230;;;;;;;;;;;;;;;;;35886:7;;:::i;:::-;20452:18230;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;:::i;:::-;18830:62;;:::i;:::-;-1:-1:-1;;;;;20452:18230:0;;;;19929:22;;20452:18230;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;20333:40;20452:18230;20333:40;;20452:18230;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;38357:2;20452:18230;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;38193:13;20452:18230;;;-1:-1:-1;;;;;20452:18230:0;;;;38193:41;20452:18230;;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;34147:5;18830:62;;;:::i;:::-;20452:18230;;;;;34147:5;;:::i;20452:18230::-;;;;;;-1:-1:-1;;20452:18230:0;;;;18830:62;;:::i;:::-;20452:18230;;;-1:-1:-1;;;;;;20452:18230:0;;;;-1:-1:-1;;;;;20452:18230:0;20333:40;20452:18230;;20333:40;20452:18230;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;:::i;:::-;;;37286:2;20452:18230;;;;-1:-1:-1;;20452:18230:0;;;-1:-1:-1;;;;;20452:18230:0;37253:54;20452:18230;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;;;18830:62;;:::i;:::-;36268:37;;;;;:83;;;20452:18230;36268:144;;;20452:18230;36268:190;;;20452:18230;36268:231;;;20452:18230;36268:271;;;20452:18230;36268:324;;;20452:18230;36253:376;;;:::i;:::-;20452:18230;36639:9;;36650:22;;;;;;;;20452:18230;36674:3;36874:16;36706:14;;;;;;;;;:::i;:::-;;:::i;:::-;36730:11;;;;;;;;:::i;:::-;20452:18230;36751:19;;;;;;;;:::i;:::-;20452:18230;36780:20;;;;;;;;:::i;:::-;20452:18230;36810:10;;;;;;;;;:::i;:::-;36830:9;;;;;;;;;:::i;:::-;20452:18230;36849:15;;;;;;;;;:::i;:::-;20452:18230;36874:16;;;;;;;;;:::i;:::-;20452:18230;36874:16;;:::i;:::-;36674:3;;;;:::i;:::-;;;36639:9;;36268:324;-1:-1:-1;36572:20:0;;36549:43;;;36268:324;;:271;36520:19;;;36503:36;;;36268:271;;:231;36486:13;;;36468:31;;;36268:231;;:190;36444:14;;;36416:42;;;36268:190;;:144;36388:24;;;36361:51;;;36268:144;;:83;36328:23;;;36309:42;;;36268:83;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;;;;21009:18;20452:18230;;;;;;;;;;;;;;;;34882:19;20452:18230;;;:::i;:::-;18830:62;;;;;;:::i;:::-;34882:19;:::i;20452:18230::-;;;-1:-1:-1;;20452:18230:0;;;;;;;;;;;;;;;;;;:::i;:::-;;26817:36;20452:18230;26826:6;20452:18230;;;;26825:7;26817:36;:::i;:::-;20452:18230;;;;;;27122:15;-1:-1:-1;;20522:6:0;;26920:21;;;;;;28115:9;;;28101:23;20452:18230;;28165:15;28161:113;;20452:18230;28161:113;28252:14;27489:10;;28252:14;:::i;20452:18230::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;26943:3;26976:13;;;;;;;;;:::i;:::-;20452:18230;;;;;27027:13;20452:18230;;;;;;;;;;;:::i;:::-;26826:6;20452:18230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;27122:15;:40;27121:97;;;;;26943:3;27121:125;;;;;26943:3;27108:210;;27122:15;20522:6;;;;28034:29;28065:14;20452:18230;27508:25;26943:3;20452:18230;;;;27027:13;20452:18230;;26826:6;20452:18230;;;27326:41;-1:-1:-1;;;;;20452:18230:0;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;:::i;:::-;;;;27457:43;20452:18230;27457:43;;-1:-1:-1;;;;;20452:18230:0;;;;;;;27457:43;;27489:10;;20452:18230;;;;27425:18;20452:18230;;20687:10;20452:18230;;;;20522:6;;20452:18230;;;20687:10;;;;-1:-1:-1;;;;;20687:10:0;20522:6;;20452:18230;20687:10;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;27508:25;;:::i;:::-;27489:10;27559:9;27489:10;;27559:9;:::i;:::-;20452:18230;;27122:15;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;27583:139;20452:18230;;;;27583:139;;20452:18230;;;;20750:8;20452:18230;27771:10;;27767:56;;26943:3;27878:6;27856:19;27961:14;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;;27856:19;:::i;:::-;20522:6;;;;;;;-1:-1:-1;;;;;20452:18230:0;27961:14;:::i;:::-;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;;-1:-1:-1;;;;;20452:18230:0;28034:29;:::i;:::-;28065:14;;:::i;:::-;26943:3;:::i;:::-;26909:9;;;;;27767:56;-1:-1:-1;20636:5:0;27767:56;;20522:6;;;;20452:18230;20522:6;;20452:18230;20522:6;;20452:18230;20522:6;27108:210;26943:3;20452:18230;;;27265:26;20452:18230;;;;-1:-1:-1;;;;;20452:18230:0;;;;27265:26;;:::i;:::-;27301:8;26943:3;:::i;27121:125::-;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;;27230:16;27121:125;;:97;27122:15;;;-1:-1:-1;27175:42:0;27121:97;;;20452:18230;;;;;;;;;;;;;21804:37;20452:18230;;;;;;21812:7;21804:37;:::i;:::-;20452:18230;;;21852:13;20452:18230;;;;;;21852:41;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;;21852:61;21848:149;;20452:18230;22018:26;;;;;;:::i;:::-;:95;;;20452:18230;;;;;;;22180:18;20452:18230;;;;;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;;20582:9;22237:43;;;:96;20582:9;;;20917:5;22237:96;;20522:6;;;;;;;;;22369:39;;;:::i;:::-;20522:6;22355:9;:60;;:106;;;22237:96;20522:6;;;20452:18230;22529:20;;20452:18230;20522:6;;20452:18230;22620:28;;;;;:::i;:::-;20452:18230;;;22659:21;22655:114;;22237:96;20687:10;;;22789:15;22779:25;22789:15;22779:25;;:::i;:::-;:42;22775:115;;22237:96;20452:18230;;;20687:10;20452:18230;;;;;;;:::i;:::-;;;;22928:54;;;22355:9;;20452:18230;;;22180:18;20452:18230;22928:54;;22971:10;;20452:18230;;;;;;;;;20522:6;;20452:18230;;;;20687:10;;;-1:-1:-1;;;;;20687:10:0;20522:6;;20452:18230;20687:10;;;;;;;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;22994:164;20452:18230;;;22789:15;;22994:164;22789:15;22355:9;22971:10;22994:164;20687:10;;;;;;;;20452:18230;;;;;;;;;20687:10;;;20452:18230;20687:10;20452:18230;20687:10;22994:164;;;;23169:16;23165:117;;20452:18230;23165:117;23260:14;;;:::i;22775:115::-;22789:15;;;;20522:6;22789:15;;;20522:6;;;22841:42;22831:52;22841:42;20687:10;22841:42;;:::i;:::-;22831:52;;:::i;:::-;22775:115;;;;;22655:114;20522:6;;-1:-1:-1;;;;;20452:18230:0;;-1:-1:-1;22690:32:0;-1:-1:-1;22655:114:0;;;;20522:6;20452:18230;;-1:-1:-1;;;20522:6:0;;20452:18230;20522:6;;;;;;;;;20452:18230;-1:-1:-1;;;20452:18230:0;;;20522:6;;;;22355:106;22438:23;;;;:::i;:::-;22355:9;22425:36;;22355:106;;22237:96;20859:5;22237:96;;;20452:18230;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;22018:95;20452:18230;;;;21852:13;20452:18230;;;;;;;;22054:15;:59;;22018:95;;21848:149;21974:15;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;;;21848:149;;;;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;:::i;:::-;18830:62;;;;;;;;;;;:::i;:::-;35141:37;;;:86;;;20452:18230;35141:153;;;20452:18230;35126:205;;;:::i;:::-;20452:18230;35352:22;;;;;;20452:18230;35376:3;35401:14;35454:23;35401:14;;35376:3;35401:14;;;;:::i;:::-;35417:11;;;;;;:::i;:::-;20452:18230;35454:23;35430:22;;;;;;:::i;:::-;20452:18230;35454:23;;;:::i;:::-;20452:18230;35454:23;;:::i;35376:3::-;35341:9;;35141:153;-1:-1:-1;35237:57:0;;;35141:153;;:86;35182:45;;;;35141:86;;20452:18230;;;;;;;;;;29299:14;20452:18230;;;;;;28383:18;20452:18230;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;;28448:13;20452:18230;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;28478:60;28486:24;;;:::i;:::-;28478:60;:::i;:::-;20452:18230;;;28594:15;;;;20522:6;;;;;28644:9;29268:29;20522:6;;;;29197:14;20522:6;;20452:18230;28644:9;:::i;:::-;20452:18230;;28949:15;;20452:18230;;28841:129;-1:-1:-1;;;;;20452:18230:0;;;;;;28841:129;;20750:8;20452:18230;29015:10;;29011:52;;28590:240;29094:19;29116:6;29094:19;;;:::i;:::-;20522:6;;;;;20452:18230;29197:14;:::i;:::-;20452:18230;;;29268:29;;:::i;29011:52::-;-1:-1:-1;20636:5:0;29011:52;;28590:240;28696:23;;29268:29;28696:23;;29197:14;28696:23;;;;28675:83;28696:23;;;:::i;:::-;28683:9;:36;28675:83;:::i;:::-;28683:9;20452:18230;28813:9;20452:18230;;;;;28813:9;:::i;:::-;28590:240;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;18830:62;;;;;;;;;;;:::i;:::-;33623:37;;;:82;;;20452:18230;33623:141;;;20452:18230;33608:193;;;:::i;:::-;20452:18230;33822:22;;;;;;20452:18230;33846:3;33873:14;33922:19;33873:14;;33846:3;33873:14;;;;:::i;:::-;33889:11;;;;;;:::i;:::-;20452:18230;33922:19;33902:18;;;;;;:::i;33922:19::-;20452:18230;33922:19;;:::i;33846:3::-;33811:9;;33623:141;-1:-1:-1;33715:49:0;;;33623:141;;:82;33664:41;;;;33623:82;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;;;;:::i;:::-;18830:62;;:::i;:::-;20452:18230;;;-1:-1:-1;;;;;;20452:18230:0;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;;;:::i;:::-;18830:62;;;;;;;;:::i;:::-;34367:37;;;:74;;;20452:18230;34367:115;;;20452:18230;34352:167;;;:::i;:::-;20452:18230;34540:22;;;;;;20452:18230;34564:3;34590:14;34631:9;34590:14;;;34631:9;34590:14;;34619:10;34590:14;;;34606:11;34590:14;;;34564:3;34590:14;;;;34619:10;34590:14;;:::i;:::-;34606:11;;:::i;:::-;20452:18230;34619:10;;:::i;:::-;34631:9;;;:::i;:::-;20452:18230;34631:9;;:::i;34564:3::-;34529:9;;34367:115;-1:-1:-1;34451:31:0;;;34367:115;;:74;34408:33;;;;34367:74;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;;;;;;18830:62;;:::i;:::-;37093:16;20452:18230;;-1:-1:-1;;;;20452:18230:0;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;21295:54;20452:18230;;;;;;;;;21295:54;;20452:18230;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;;;23409:37;20452:18230;23418:6;20452:18230;;;;23417:7;23409:37;:::i;:::-;23460:41;;;20452:18230;;;23530:21;20452:18230;23561:9;20452:18230;23572:20;;;;;;25386:9;;;:26;20452:18230;;25455:15;25451:113;;20452:18230;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;23594:3;23627:12;;;;;:::i;:::-;20452:18230;23671:17;23696:30;23671:17;;;;;:::i;:::-;20452:18230;23696:30;;;:::i;:::-;20452:18230;;;;23764:13;20452:18230;;;;;;;-1:-1:-1;;;;;23418:6:0;20452:18230;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;23801:43;23797:135;;23594:3;23944:26;;;;:::i;:::-;23943:27;20452:18230;;;23943:71;;23594:3;23940:141;;;20452:18230;;;24117:18;20452:18230;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;20582:9;-1:-1:-1;20582:9:0;;20917:5;24176:98;20522:6;;;;;;;;;20452:18230;-1:-1:-1;;;;;24314:39:0;20452:18230;;;;24314:39;:::i;:::-;20522:6;24296:64;;;:116;;;24176:98;24283:1083;;;20452:18230;24461:20;20452:18230;20522:6;20452:18230;20522:6;;20452:18230;24560:28;;;:::i;:::-;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;;;24603:21;24599:126;;24283:1083;20687:10;;;24749:15;;24739:25;24749:15;24739:25;;:::i;:::-;:42;24735:123;;24283:1083;20452:18230;23594:3;20452:18230;;;;;;;;;:::i;:::-;;;;;24900:58;;-1:-1:-1;;;;;20452:18230:0;;;;;24900:58;;24947:10;;20452:18230;;;;;24117:18;20452:18230;;20687:10;20452:18230;;;;20522:6;;20452:18230;;;;20687:10;;;-1:-1:-1;;;;;20687:10:0;20522:6;;20452:18230;20687:10;;;;;;;20452:18230;;;24974:196;-1:-1:-1;;;;;20452:18230:0;;;;24974:196;20452:18230;;;24749:15;;24947:10;;24974:196;20687:10;;;;;;;;20452:18230;;;;;;;;;20687:10;;;20452:18230;20687:10;20452:18230;20687:10;24974:196;;;;25185:16;25181:125;;24283:1083;;;23594:3;:::i;:::-;23561:9;;25181:125;25280:14;;;:::i;:::-;25181:125;;;;24735:123;24749:15;;;20522:6;24749:15;20522:6;;;24805:42;24795:52;24749:15;23594:3;24749:15;;20522:6;24805:42;:::i;24795:52::-;24735:123;;;24599:126;20452:18230;;;;20522:6;-1:-1:-1;;;;;20452:18230:0;;-1:-1:-1;24638:32:0;-1:-1:-1;24599:126:0;;;;24283:1083;25329:28;23594:3;25329:28;;;;;;:::i;:::-;24283:1083;26943:3;:::i;24296:116::-;24389:23;;;;:::i;:::-;24372:40;;;24296:116;;24176:98;20859:5;24176:98;;23940:141;23594:3;24026:28;;;;;;:::i;23943:71::-;-1:-1:-1;;;;;20452:18230:0;;;;;;23974:15;:40;23943:71;;;23797:135;20452:18230;;;;;23418:6;20452:18230;;;23856:41;-1:-1:-1;;;;;23907:15:0;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;;;;;23797:135;;;20452:18230;;;;;;;;;;;;;;;25668:13;20452:18230;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;25744:36;20452:18230;;;;;;25752:7;25744:36;:::i;:::-;20452:18230;;25794:15;:41;20452:18230;;25794:15;;20452:18230;;;25874:41;20452:18230;;;25958:16;;;:44;;;20452:18230;;;;20522:6;;25794:15;20522:6;25794:15;;20522:6;;;;26707:14;20452:18230;;;;26605:14;20452:18230;26676:29;20452:18230;;;25668:13;20452:18230;;;;;;26033:41;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;:::i;:::-;;;;26162:41;;;-1:-1:-1;;;;;26180:9:0;20452:18230;;;;26162:41;;26192:10;;20452:18230;;;;;26130:18;20452:18230;;20687:10;20452:18230;;;;20522:6;;20452:18230;;;20687:10;;;;-1:-1:-1;;;;;20687:10:0;20522:6;;20452:18230;20687:10;;;;;;;26227:9;26192:10;;26227:9;:::i;20452:18230::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;25958:44;25978:9;;;:24;25958:44;;20452:18230;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;33374:15;20452:18230;;;:::i;:::-;18830:62;;;;;;:::i;:::-;33374:15;:::i;20452:18230::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29417:21;;20452:18230;29472:9;20452:18230;29467:1014;29483:21;;;;;;30631:14;30495:9;30487:73;30495:9;;:26;30487:73;:::i;:::-;20452:18230;;-1:-1:-1;;;;;20452:18230:0;30631:14;:::i;29506:3::-;29539:13;;;;;;;;;:::i;:::-;20452:18230;;;;29588:18;20452:18230;;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;;;;29625:60;29633:24;;;:::i;29625:60::-;20452:18230;;;29745:15;;;;20452:18230;29506:3;20452:18230;;;29797:9;30445:29;20452:18230;30428:46;20452:18230;;;;;;20522:6;;20452:18230;29797:9;:::i;:::-;20452:18230;;30080:15;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;;29964:139;20452:18230;;;;29964:139;;20452:18230;;30142:13;20452:18230;;30404:14;20452:18230;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;30174:28;30214:10;30210:56;;29741:210;30299:19;30321:6;30299:19;;;:::i;30404:14::-;30445:29;:::i;30428:46::-;29506:3;;:::i;:::-;29472:9;;;;;30210:56;-1:-1:-1;20636:5:0;30210:56;;29741:210;29846:23;;29506:3;29846:23;;;30428:46;29846:23;30445:29;29846:23;29879:28;29846:23;;;:::i;:::-;29879:28;;;:::i;:::-;20452:18230;29932:9;20452:18230;;;;;;;;;29932:9;:::i;:::-;29741:210;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;;;;;;;;21353:53;20452:18230;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;:::o;:::-;;-1:-1:-1;;20452:18230:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;19126:130::-;19040:6;20452:18230;-1:-1:-1;;;;;20452:18230:0;17597:10;19189:23;20452:18230;;19126:130::o;20452:18230::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;20522:6;;;20452:18230;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;:::o;20522:6::-;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;:::o;3386:1204::-;;3526:1058;;;;;;;;;;;;;20968:6;3526:1058;;;;3386:1204;;;:::o;3526:1058::-;;;;;;;;;;;;;;;;;;3386:1204;:::o;3526:1058::-;;;;;;;;;;;;;;;;20452:18230;-1:-1:-1;;20452:18230:0;;;;;;;:::o;:::-;;;;;;;;;;;;:::o;:::-;20522:6;;;20452:18230;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;30655:475;-1:-1:-1;;;;;20452:18230:0;38357:2;20452:18230;;;;;;;;;;;30843:33;;;;;;20452:18230;30843:33;;20452:18230;30843:33;;;;;;-1:-1:-1;30843:33:0;;;30655:475;-1:-1:-1;30839:287:0;;;31085:34;;;;;;20452:18230;;-1:-1:-1;;;31085:34:0;;-1:-1:-1;;;;;20452:18230:0;;;30843:33;31085:34;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;-1:-1:-1;20452:18230:0;;;;31085:34;;;;;;;;;;;;;30839:287;;30655:475::o;31085:34::-;;;;:::i;:::-;20452:18230;;-1:-1:-1;20452:18230:0;;;;;30839:287;-1:-1:-1;;;;;20452:18230:0;;;30914:20;20452:18230;;30946:34;;;;;;;20452:18230;;-1:-1:-1;;;30946:34:0;;-1:-1:-1;;;;;20452:18230:0;;;30843:33;30946:34;;20452:18230;;;;;;-1:-1:-1;;20452:18230:0;;;-1:-1:-1;20452:18230:0;;;;30946:34;20452:18230;30910:154;31005:50;;;;;;;;;;-1:-1:-1;20452:18230:0;;;;;;;;;;;;;;31005:50;;30843:33;31005:50;;20452:18230;;;;;;;;;;31005:50;;;;;;;;;;30910:154;30655:475::o;30843:33::-;;;;;;;;20452:18230;;;-1:-1:-1;;20452:18230:0;;;;;;;;;;;;30843:33;20452:18230;;;;;30843:33;;20452:18230;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;30843:33;;;;20452:18230;;;;;-1:-1:-1;;;20452:18230:0;;;30843:33;20452:18230;;20522:6;20452:18230;30843:33;;;;;31134:434;;-1:-1:-1;;;;;20452:18230:0;20687:10;-1:-1:-1;;;;;20687:10:0;20452:18230;37286:2;20452:18230;;37253:54;-1:-1:-1;20452:18230:0;31366:13;20452:18230;;31366:41;20452:18230;-1:-1:-1;20452:18230:0;31366:41;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;31410:15;-1:-1:-1;20452:18230:0;;;;;-1:-1:-1;;;;20452:18230:0;;;;;;-1:-1:-1;;;20452:18230:0;;;;31500:63;;-1:-1:-1;;;;;20452:18230:0;;;-1:-1:-1;;;;;20452:18230:0;;;;;-1:-1:-1;;;;;;20452:18230:0;;;;;;;;;:::o;:::-;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;:::o;31572:348::-;;20452:18230;31572:348;-1:-1:-1;;;;;31866:49:0;31572:348;;20452:18230;20687:10;-1:-1:-1;;;;;20687:10:0;20452:18230;37286:2;20452:18230;;37253:54;20452:18230;;;;;;;31784:20;31780:81;;31572:348;-1:-1:-1;;20452:18230:0;;;31866:13;20452:18230;;;;;;;-1:-1:-1;;;;20452:18230:0;;;;;;;-1:-1:-1;;;20452:18230:0;;;;;;;;31780:81;20452:18230;-1:-1:-1;20452:18230:0;31814:13;20452:18230;;;-1:-1:-1;20452:18230:0;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;31780:81;;;31924:512;;;;;-1:-1:-1;;;;;;20452:18230:0;;20687:10;-1:-1:-1;;;;;20687:10:0;20452:18230;37286:2;20452:18230;;37253:54;20452:18230;;32162:13;20452:18230;;;;;32162:41;;;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;;;32206:15;-1:-1:-1;20452:18230:0;;;32236:41;;;20452:18230;;-1:-1:-1;20452:18230:0;;-1:-1:-1;;;;;20452:18230:0;;;;;;-1:-1:-1;;;;;;20452:18230:0;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;31924:512::o;32440:695::-;37286:2;20452:18230;-1:-1:-1;;20452:18230:0;-1:-1:-1;;;;;20452:18230:0;;;37253:54;-1:-1:-1;20452:18230:0;;;32755:13;20452:18230;;;;;32755:41;;20452:18230;-1:-1:-1;;;;;20452:18230:0;-1:-1:-1;;32440:695:0;;37253:54;;32440:695;;;;;20452:18230;;;;32809:42;;;;;;;;32861:20;32857:75;;32440:695;20452:18230;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;32964:166;20452:18230;32964:166;;20452:18230;;;;32964:166;20452:18230;32964:166;;20452:18230;;;;37286:2;32964:166;;20452:18230;;;;;;32964:166;;;;20452:18230;;;;32964:166;;;;20452:18230;;;;;;32755:13;20452:18230;;;;;20522:6;;20452:18230;-1:-1:-1;;;;;20452:18230:0;;;;;;;;20750:8;20452:18230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;-1:-1:-1;;;;;;20452:18230:0;;;;32755:41;20452:18230;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;;;;;;;;-1:-1:-1;;;;;20452:18230:0;;;;;-1:-1:-1;;;;;;20452:18230:0;;;;30655:475::o;32857:75::-;32891:34;;;32857:75;;;20452:18230;;;;37316:292;20452:18230;-1:-1:-1;20452:18230:0;37421:13;20452:18230;;37486:28;-1:-1:-1;;;;;37421:41:0;20452:18230;-1:-1:-1;20452:18230:0;37421:41;20452:18230;;37486:28;;:::i;:::-;37528:13;;;:45;;;;37316:292;37528:74;;;;37520:83;37316:292;:::o;37528:74::-;37577:15;;;:25;37316:292;:::o;37528:45::-;37545:15;:28;;;-1:-1:-1;37528:45:0;;;37612:259;20452:18230;-1:-1:-1;20452:18230:0;37715:13;20452:18230;;37780:28;-1:-1:-1;;;;;37715:41:0;20452:18230;-1:-1:-1;20452:18230:0;37715:41;20452:18230;;37780:28;;:::i;:::-;37822:13;;;:43;;;;37814:52;37612:259;:::o;37822:43::-;37839:15;;;:26;;37612:259;:::o;37875:213::-;;-1:-1:-1;20452:18230:0;;;;37972:13;20452:18230;;-1:-1:-1;;;;;37972:41:0;20452:18230;;;37972:41;20452:18230;;20522:6;20750:8;20522:6;;;;;;;20452:18230;;;;37972:111;20452:18230;;;38040:18;20452:18230;;;;;37972:111;;:::i;:::-;37875:213;:::o;20522:6::-;-1:-1:-1;;;20522:6:0;;;;;;;;38490:190;-1:-1:-1;20452:18230:0;;;38593:13;20452:18230;;;;;38593:37;;20452:18230;;;38643:12;;;;38490:190;:::o;38643:32::-;;20797:10;38490:190;:::o
Swarm Source
ipfs://9eb44b425fef9950b2d08a3557d06e8d2e4de1647775c6834c49146f12492c24
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.