Contract
0x16d7Edd3A562BB60aA0B3Af357A2c195cE2AA974
2
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
MarketPlace
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity)
/** *Submitted for verification at moonriver.moonscan.io on 2021-10-31 */ //Custom NFT Marketplace Contract. From your favorite beans around - MoonBeans! pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } abstract contract 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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } contract MarketPlace is IERC721Receiver, ReentrancyGuard, Ownable { event TokenListed(address indexed token, uint256 indexed id, uint256 indexed price, uint256 timestamp); event TokenDelisted(address indexed token, uint256 indexed id, uint256 timestamp); event TokenPurchased(address indexed oldOwner, address indexed newOwner, uint256 indexed price, address collection, uint256 tokenId); event BidPlaced(address indexed token, uint256 indexed id, uint256 indexed price, address buyer, uint256 timestamp, bool escrowed); event BidCancelled(address indexed token, uint256 indexed id, uint256 indexed price, address buyer, bool escrowed, uint256 timestamp); event EscrowReturned(address indexed user, uint256 indexed price); // Fees are out of 1000, to theoretically allow for 0.1 - 0.9% fees in the future. uint256 public devFee = 10; //1% uint256 public beanieHolderFee = 10; //1% uint256 public beanBuybackFee = 10; //1% uint256 public defaultCollectionOwnerFee = 20; //2% uint256 public totalEscrowedAmount = 0; uint256 public specialTaxGas = 100000; address public TOKEN = 0x98878B06940aE243284CA214f92Bb71a2b032B8A; //WMOVR address public devAddress = 0x24312a0b911fE2199fbea92efab55e2ECCeC637D; address public beanieHolderAddress = 0x6e0fa1dC8E3e6510aeBF14fCa3d83C77a9780ecB; address public beanBuybackAddress = 0xE9b8258668E17AFA5D09de9F10381dE5565dbDc0; address public featuredCollection = 0xd3A9c48Df4d9342dc1A0EE2c185CE50588729Fa9; struct Listing { uint256 price; uint256 timestamp; uint256 tokenId; bool accepted; } struct Offer { uint256 price; uint256 timestamp; bool accepted; address buyer; bool escrowed; } bool public tradingPaused = false; bool public useSuperGasTaxes = true; bool public feesOn = true; bool public delistAfterAcceptingOffer = true; bool public clearBidsAfterAcceptingOffer = false; mapping(address => bool) collectionTradingEnabled; mapping(address => mapping(uint256 => Listing[])) listings; mapping(address => mapping(uint256 => Offer[])) offers; mapping(address => address) collectionOwners; mapping(address => uint256) totalInEscrow; mapping(address => uint256) collectionOwnerFees; // Required in order to receive ERC 721's. function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } // Required in order to receive MOVR/ETH. receive() external payable { } // LISTINGS // Public wrapper around token delisting, requiring ownership to delist. function delistToken(address ca, uint256 tokenId) public { require(msg.sender == IERC721(ca).ownerOf(tokenId), "Only the owner of a token can delist it."); _delistToken(ca, tokenId); } // Returns value in the 'listings' mapping for a specific address + id to the default (0). function _delistToken(address ca, uint256 tokenId) private { listings[ca][tokenId].push(Listing(0, block.timestamp, tokenId, false)); emit TokenDelisted(ca, tokenId, block.timestamp); } // Lists a token at the specified price point. function listToken(address ca, uint256 tokenId, uint256 price) public { require(msg.sender == IERC721(ca).ownerOf(tokenId), "Only the owner of a token can list it."); require(price > 0, "Cannot set price to 0."); require(IERC721(ca).isApprovedForAll(msg.sender, address(this)), "Marketplace not approved to handle this users tokens."); listings[ca][tokenId].push(Listing(price, block.timestamp, tokenId, false)); emit TokenListed(ca, tokenId, price, block.timestamp); } // Check if a token already has any listings. function isListed(address ca, uint256 tokenId) public view returns (bool) { uint256 index = listings[ca][tokenId].length; if (index == 0) { return false; } return listings[ca][tokenId][index - 1].price != 0; } // Getter for the current asking price on a specific token. function getCurrentListingPrice(address ca, uint256 tokenId) public view returns (uint256){ return getCurrentListing(ca, tokenId).price; } // Getter for the latest listing on a specific token. function getCurrentListing(address ca, uint256 tokenId) public view returns (Listing memory){ uint256 numListings = getNumberOfListings(ca, tokenId); require(numListings > 0, 'No listings for this token.'); return listings[ca][tokenId][numListings-1]; } // Getter for all listings of a unique token. function getTokenListingHistory(address ca, uint256 tokenId) external view returns (Listing[] memory) { return listings[ca][tokenId]; } // Allows a buyer to buy at the listed price. function fulfillListing(address ca, uint256 tokenId) external payable nonReentrant { require(!tradingPaused, "Marketplace trading is disabled."); require(collectionTradingEnabled[ca], "Trading for this collection is not enabled."); uint256 price = getCurrentListingPrice(ca, tokenId); require(msg.value >= price, "The amount sent is less than the asking price."); require(price > 0, "This token is not currently listed."); //get current NFT owner, verify approval address payable oldOwner = payable(IERC721(ca).ownerOf(tokenId)); require(IERC721(ca).isApprovedForAll(oldOwner, address(this)), "Marketplace not approved to transfer this NFT."); //get buyer, calculate fees, store seller original balance address payable newOwner = payable(msg.sender); (uint256 devFeeAmount, uint256 beanieHolderFeeAmount, uint256 beanBuybackFeeAmount, uint256 collectionOwnerFeeAmount, uint256 remainder) = calculateAmounts(ca, price); uint256 oldOwnerMovrBalance = oldOwner.balance; //swippity swappity IERC721(ca).safeTransferFrom(oldOwner, newOwner, tokenId); oldOwner.transfer(remainder); //Check that all went swimmingly require(IERC721(ca).ownerOf(tokenId) == newOwner, "NFT was not successfully transferred."); require(oldOwner.balance >= (oldOwnerMovrBalance + remainder), "Funds were not successfully sent."); emit TokenPurchased(oldOwner, newOwner, price, ca, tokenId); //fees if (feesOn) { payable(collectionOwners[ca]).transfer(collectionOwnerFeeAmount); payable(devAddress).transfer(devFeeAmount); if (useSuperGasTaxes) { sendClaimableBeanieFee(beanieHolderAddress, beanieHolderFeeAmount); sendClaimableBeanieFee(beanBuybackAddress, beanBuybackFeeAmount); } else { payable(beanieHolderAddress).transfer(beanieHolderFeeAmount); payable(beanBuybackAddress).transfer(beanBuybackFeeAmount); } } markListingAsAccepted(ca, tokenId); _delistToken(ca, tokenId); } // OFFERS // Make a standard offer (checks balance of bidder, but does not escrow). function makeOffer(address ca, uint256 tokenId, uint256 price) public { require(msg.sender != IERC721(ca).ownerOf(tokenId), "Can not bid on your own NFT."); require(price > 0, "Cannot bid a price of 0."); require(msg.sender.balance >= price, "The buyer does not have enough money to make the bid."); require(IERC20(TOKEN).allowance(msg.sender, address(this)) >= price, "Not an escrowed bid; approval required (Default: WMOVR)."); offers[ca][tokenId].push(Offer(price, block.timestamp, false, msg.sender, false)); emit BidPlaced(ca, tokenId, price, msg.sender, block.timestamp, false); } // Make an escrowed offer (checks balance of bidder, then holds the bid in the contract as an escrow). function makeEscrowedOffer(address ca, uint256 tokenId, uint256 price) public payable nonReentrant { require(msg.sender != IERC721(ca).ownerOf(tokenId), "Can not bid on your own NFT."); require(price > 0, "Cannot bid a price of 0."); require(msg.value >= price, "The buyer did not send enough money for an escrowed bid."); totalEscrowedAmount += msg.value; totalInEscrow[msg.sender] += msg.value; offers[ca][tokenId].push(Offer(price, block.timestamp, false, msg.sender, true)); emit BidPlaced(ca, tokenId, price, msg.sender, block.timestamp, true); } // Cancel an offer (escrowed or not). Could have gas issues if there's too many offers... function cancelOffer(address ca, uint256 tokenId, uint256 price, bool escrowed) external nonReentrant { Offer[] storage _offers = _getOffers(ca, tokenId); for (uint i = 0; i < _offers.length; i++) { if (escrowed) { if (_offers[i].price == price && _offers[i].buyer == msg.sender && _offers[i].escrowed && !_offers[i].accepted) { delete offers[ca][tokenId][i]; returnEscrowedFunds(msg.sender, price); emit BidCancelled(ca, tokenId, price, msg.sender, escrowed, block.timestamp); return; } } else { if (_offers[i].price == price && _offers[i].buyer == msg.sender && !_offers[i].escrowed && !_offers[i].accepted) { delete offers[ca][tokenId][i]; emit BidCancelled(ca, tokenId, price, msg.sender, escrowed, block.timestamp); return; } } } revert('No cancellable offer found.'); } // Getter for all bids on a unique token. function getOffers(address ca, uint256 tokenId) external view returns (Offer[] memory) { return offers[ca][tokenId]; } // Same as above, but for internal calls/passing offers object by reference. function _getOffers(address ca, uint256 tokenId) internal view returns (Offer[] storage) { return offers[ca][tokenId]; } // Accept an active offer. function acceptOffer(address ca, uint256 tokenId, uint256 price, address from, bool escrowedBid) external nonReentrant { IERC721 _nft = IERC721(ca); require(msg.sender == _nft.ownerOf(tokenId), "Only the owner of this NFT can accept an offer."); require(_nft.isApprovedForAll(msg.sender, address(this)), "Marketplace not approved to transfer this NFT."); require(!tradingPaused, "Marketplace trading is disabled."); require(collectionTradingEnabled[ca], "Trading for this collection is not enabled."); Offer[] storage _offers = _getOffers(ca, tokenId); uint256 correctIndex = 999999999999999999; for (uint i = _offers.length-1; i >= 0; i--) { if (_offers[i].price == price && _offers[i].buyer == from && _offers[i].accepted == false && _offers[i].escrowed == escrowedBid ) { correctIndex = i; break; } } require(correctIndex != 999999999999999999, "Matching offer not found..."); // Actually perform trade address payable oldOwner = payable(address(msg.sender)); address payable newOwner = payable(address(from)); if (escrowedBid) { escrowedPurchase(_nft, ca, tokenId, price, oldOwner, newOwner); } else { tokenPurchase(_nft, ca, tokenId, price, oldOwner, newOwner); } // Clean up data structures markOfferAsAccepted(ca, tokenId, correctIndex, _offers[correctIndex]); if (clearBidsAfterAcceptingOffer) { _clearAllBids(ca, tokenId); } if(delistAfterAcceptingOffer && isListed(ca, tokenId)) { _delistToken(ca, tokenId); } } // PUBLIC ESCROW FUNCTIONS function addMoneyToEscrow() external payable nonReentrant { require(msg.value > 10000000 gwei, "Minimum escrow deposit is 0.01 MOVR."); totalEscrowedAmount += msg.value; totalInEscrow[msg.sender] += msg.value; } function withdrawMoneyFromEscrow(uint256 amount) external nonReentrant { require(totalInEscrow[msg.sender] >= amount, "Trying to withdraw more than deposited."); returnEscrowedFunds(msg.sender, amount); } function getEscrowedAmount(address user) external view returns (uint256) { return totalInEscrow[user]; } // OTHER PUBLIC FUNCTIONS function getCollectionOwner(address ca) external view returns (address) { return collectionOwners[ca]; } function totalFees() public view returns (uint256) { return (devFee + beanieHolderFee + beanBuybackFee + defaultCollectionOwnerFee); } function checkEscrowAmount(address user) external view returns (uint256) { return totalInEscrow[user]; } function isCollectionTrading(address ca) external view returns (bool) { return collectionTradingEnabled[ca]; } function getCollectionFee(address ca) external view returns (uint256) { return collectionOwnerFees[ca]; } // ADMIN FUNCTIONS function clearAllBids(address ca, uint256 tokenId) external onlyOwner { _clearAllBids(ca, tokenId); } function clearAllListings(address ca, uint256 tokenId) external onlyOwner { delete listings[ca][tokenId]; } function setTrading(bool value) external onlyOwner { require(tradingPaused != value, "Already set to that value."); tradingPaused = value; } function setSuperGasTaxes(bool value) external onlyOwner { require(useSuperGasTaxes != value, "Already set to that value."); useSuperGasTaxes = value; } function setCollectionTrading(address ca, bool value) external onlyOwner { require(collectionTradingEnabled[ca] != value, "Already set to that value."); collectionTradingEnabled[ca] = value; } function setCollectionOwner(address ca, address owner) external onlyOwner { collectionOwners[ca] = owner; } function setDevFee(uint256 fee) external onlyOwner { require (fee <= 100, "Max 10% fee"); devFee = fee; } function setBeanieHolderFee(uint256 fee) external onlyOwner { require (fee <= 100, "Max 10% fee"); beanieHolderFee = fee; } function setBeanBuyBackFee(uint256 fee) external onlyOwner { require (fee <= 100, "Max 10% fee"); beanBuybackFee = fee; } function setCollectionOwnerFee(address ca, uint256 fee) external onlyOwner { require (fee <= 100, "Max 10% fee"); collectionOwnerFees[ca] = fee; } function setDevAddress(address _address) external onlyOwner { devAddress = _address; } function setBeanieHolderAddress(address _address) external onlyOwner { beanieHolderAddress = _address; } function setBeanBuybackAddress(address _address) external onlyOwner { beanBuybackAddress = _address; } function setFeaturedCollection(address _collection) external onlyOwner { featuredCollection = _collection; } function setSpecialGasTax(uint256 gasAmount) external onlyOwner { specialTaxGas = gasAmount; } function setFeesOn(bool _value) external onlyOwner { feesOn = _value; } function setDelistAfterAcceptingOffer(bool _value) external onlyOwner { delistAfterAcceptingOffer = _value; } function setClearBidsAfterAcceptingOffer(bool _value) external onlyOwner { clearBidsAfterAcceptingOffer = _value; } // Emergency only - Recover Tokens function recoverToken(address _token, uint256 amount) external onlyOwner { IERC20(_token).transfer(owner(), amount); } // Emergency only - Recover NFTs function recoverNFT(address _token, uint256 tokenId) external onlyOwner { IERC721(_token).transferFrom(address(this), owner(), tokenId); } // Emergency only - Recover MOVR function RecoverMOVR(address to, uint256 amount) external onlyOwner { payable(to).transfer(amount); } // PRIVATE HELPERS function calculateAmounts(address ca, uint256 amount) private view returns (uint256, uint256, uint256, uint256, uint256){ uint256 _collectionOwnerFee = collectionOwnerFees[ca] == 0 ? defaultCollectionOwnerFee : collectionOwnerFees[ca]; uint256 devFeeAmount = amount * devFee / 1000; uint256 beanieHolderFeeAmount = amount * beanieHolderFee / 1000; uint256 beanBuybackFeeAmount = amount * beanBuybackFee / 1000; uint256 collectionOwnerFeeAmount = amount * _collectionOwnerFee / 1000; uint256 remainder = amount - (devFeeAmount + beanieHolderFeeAmount + beanBuybackFeeAmount + collectionOwnerFeeAmount); return (devFeeAmount, beanieHolderFeeAmount, beanBuybackFeeAmount, collectionOwnerFeeAmount, remainder); } function getNumberOfListings(address ca, uint256 tokenId) private view returns (uint256) { return listings[ca][tokenId].length; } function markListingAsAccepted(address ca, uint256 tokenId) private { Listing memory current = getCurrentListing(ca, tokenId); Listing memory replaced = current; replaced.accepted = true; uint256 index = getNumberOfListings(ca, tokenId); if (index != 0) { listings[ca][tokenId][index - 1] = replaced; } } function markOfferAsAccepted(address ca, uint256 tokenId, uint256 i, Offer storage offer) private { Offer memory replaced = offer; replaced.accepted = true; offers[ca][tokenId][i] = replaced; } function returnEscrowedFunds(address user, uint256 price) private { require(totalEscrowedAmount >= price, "Not enough funds to return escrow. Theoretically impossible."); require(totalInEscrow[user] >= price, "Not enough funds to return escrow. Theoretically impossible."); totalEscrowedAmount -= price; totalInEscrow[user] -= price; payable(user).transfer(price); emit EscrowReturned(user, price); } function escrowedPurchase(IERC721 _nft, address ca, uint256 tokenId, uint256 price, address payable oldOwner, address payable newOwner) private { require(totalInEscrow[newOwner] >= price, "Buyer does not have enough money in escrow."); require(totalEscrowedAmount >= price, "Escrow balance too low."); uint256 oldOwnerMovrBalance = oldOwner.balance; //calculate fees (uint256 devFeeAmount, uint256 beanieHolderFeeAmount, uint256 beanBuybackFeeAmount, uint256 collectionOwnerFeeAmount, uint256 remainder) = calculateAmounts(ca, price); totalInEscrow[newOwner] -= price; totalEscrowedAmount -= price; //swippity swappity _nft.safeTransferFrom(oldOwner, newOwner, tokenId); oldOwner.transfer(remainder); //check that all went swimmingly require(oldOwner.balance >= (oldOwnerMovrBalance + remainder), "Funds were not successfully sent."); require(_nft.ownerOf(tokenId) == newOwner, "NFT was not successfully transferred."); emit TokenPurchased(oldOwner, newOwner, price, ca, tokenId); //fees if (feesOn) { payable(collectionOwners[ca]).transfer(collectionOwnerFeeAmount); payable(devAddress).transfer(devFeeAmount); if (useSuperGasTaxes) { sendClaimableBeanieFee(beanieHolderAddress, beanieHolderFeeAmount); sendClaimableBeanieFee(beanBuybackAddress, beanBuybackFeeAmount); } else { payable(beanieHolderAddress).transfer(beanieHolderFeeAmount); payable(beanBuybackAddress).transfer(beanBuybackFeeAmount); } } } function tokenPurchase(IERC721 _nft, address ca, uint256 tokenId, uint256 price, address payable oldOwner, address payable newOwner) private { IERC20 _token = IERC20(TOKEN); require(_token.balanceOf(msg.sender) >= price, "Buyer does not have enough money to purchase."); require(_token.allowance(newOwner, address(this)) >= price, "Marketplace not approved to spend buyer tokens."); (uint256 devFeeAmount, uint256 beanieHolderFeeAmount, uint256 beanBuybackFeeAmount, uint256 collectionOwnerFeeAmount, uint256 remainder) = calculateAmounts(ca, price); _nft.safeTransferFrom(oldOwner, newOwner, tokenId); _token.transferFrom(newOwner, oldOwner, remainder); require(_token.balanceOf(oldOwner) >= remainder, "Funds were not successfully sent."); require(_nft.ownerOf(tokenId) == newOwner, "NFT was not successfully transferred."); emit TokenPurchased(oldOwner, newOwner, price, ca, tokenId); //fees if (feesOn) { _token.transferFrom(address(this), collectionOwners[ca], collectionOwnerFeeAmount); _token.transferFrom(address(this), devAddress, devFeeAmount); _token.transferFrom(address(this), beanieHolderAddress, beanieHolderFeeAmount); _token.transferFrom(address(this), beanBuybackAddress, beanBuybackFeeAmount); } } function sendClaimableBeanieFee(address recipient, uint256 amount) internal { (bool success, ) = recipient.call{gas: specialTaxGas, value: amount}(""); require(success, "Transfer failed."); } function _clearAllBids(address ca, uint256 tokenId) internal { delete offers[ca][tokenId]; } }
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"bool","name":"escrowed","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"BidCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bool","name":"escrowed","type":"bool"}],"name":"BidPlaced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"}],"name":"EscrowReturned","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":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenDelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TokenListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"},{"indexed":true,"internalType":"uint256","name":"price","type":"uint256"},{"indexed":false,"internalType":"address","name":"collection","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenPurchased","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RecoverMOVR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"address","name":"from","type":"address"},{"internalType":"bool","name":"escrowedBid","type":"bool"}],"name":"acceptOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addMoneyToEscrow","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"beanBuybackAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beanBuybackFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beanieHolderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beanieHolderFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"bool","name":"escrowed","type":"bool"}],"name":"cancelOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"checkEscrowAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"clearAllBids","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"clearAllListings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearBidsAfterAcceptingOffer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultCollectionOwnerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delistAfterAcceptingOffer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"delistToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"featuredCollection","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feesOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"fulfillListing","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"}],"name":"getCollectionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"}],"name":"getCollectionOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCurrentListing","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"accepted","type":"bool"}],"internalType":"struct MarketPlace.Listing","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCurrentListingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getEscrowedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOffers","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"accepted","type":"bool"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"bool","name":"escrowed","type":"bool"}],"internalType":"struct MarketPlace.Offer[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenListingHistory","outputs":[{"components":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"accepted","type":"bool"}],"internalType":"struct MarketPlace.Listing[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"}],"name":"isCollectionTrading","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"listToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"makeEscrowedOffer","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"makeOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"recoverNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setBeanBuyBackFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setBeanBuybackAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setBeanieHolderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setBeanieHolderFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setClearBidsAfterAcceptingOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"setCollectionOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setCollectionOwnerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"ca","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setCollectionTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setDelistAfterAcceptingOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setDevFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collection","type":"address"}],"name":"setFeaturedCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setFeesOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gasAmount","type":"uint256"}],"name":"setSpecialGasTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setSuperGasTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"specialTaxGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEscrowedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useSuperGasTaxes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawMoneyFromEscrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600a60028190556003819055600481905560146005556000600655620186a0600755600880546001600160a01b03199081167398878b06940ae243284ca214f92bb71a2b032b8a179091556009805482167324312a0b911fe2199fbea92efab55e2eccec637d17905581548116736e0fa1dc8e3e6510aebf14fca3d83c77a9780ecb17909155600b805490911673e9b8258668e17afa5d09de9f10381de5565dbdc0179055600c80546001600160c81b0319167701010100d3a9c48df4d9342dc1a0ee2c185ce50588729fa9179055348015620000e057600080fd5b506001600055620000f133620000f7565b62000149565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b614ae280620001596000396000f3fe6080604052600436106103a65760003560e01c806382bfefc8116101e7578063cbde64051161010d578063db8c96c7116100a0578063ea98a9501161006f578063ea98a95014610b0a578063f2fde38b14610b37578063feb8840614610b57578063ff09343614610b7757600080fd5b8063db8c96c714610a7b578063dfd3da7e14610a9b578063e0777a1414610abc578063e9a7720b14610ae957600080fd5b8063d0d41fe1116100dc578063d0d41fe114610a0f578063d1ffa71a14610a2f578063d3810e2414610a45578063d77fb11e14610a5b57600080fd5b8063cbde64051461098e578063ccd68371146109ae578063cd653ee6146109ce578063cdb3cd25146109ef57600080fd5b80639011f8fe11610185578063ac63391511610154578063ac633915146108f8578063b29a814014610918578063b3a4f97b14610938578063b966373a1461096e57600080fd5b80639011f8fe14610882578063943816361461089857806395483e81146108b8578063ab78f369146108d857600080fd5b806389394ef5116101c157806389394ef5146107f85780638a6169ae1461080b5780638da5cb5b146108445780638f70ccf71461086257600080fd5b806382bfefc8146107b857806382ff441c146107d8578063846f45a01461058257600080fd5b80634fbcd584116102cc5780636b872a961161026a57806376dda5051161023957806376dda505146107455780637b25b94a146107655780637de3bd07146107785780637e07590d1461079857600080fd5b80636b872a96146106b75780636b8894c4146106d7578063715018a6146106f7578063745b69ca1461070c57600080fd5b80635c827858116102a65780635c82785814610641578063675ef65c146106615780636827e764146106815780636a139d7a1461069757600080fd5b80634fbcd584146105e057806353e23e2e1461060057806357ccdcf81461062157600080fd5b806329bdfd94116103445780633ad10ef6116103135780633ad10ef61461054a5780633fd9d6ff146105825780634a5c213c146105b85780634ad6a3a2146105c057600080fd5b806329bdfd94146104c35780632a7b4bff146104d95780632eb81fdf1461050a5780633319a00d1461052a57600080fd5b80631c75b6b2116103805780631c75b6b21461044b57806320184b111461046d578063273499f01461048d5780632855ffe2146104ad57600080fd5b806313114a9d146103b2578063150b7a02146103da57806317c66b8c1461041e57600080fd5b366103ad57005b600080fd5b3480156103be57600080fd5b506103c7610b97565b6040519081526020015b60405180910390f35b3480156103e657600080fd5b506104056103f5366004614351565b630a85bd0160e11b949350505050565b6040516001600160e01b031990911681526020016103d1565b34801561042a57600080fd5b5061043e610439366004614431565b610bc8565b6040516103d1919061445d565b34801561045757600080fd5b5061046b6104663660046144ce565b610c6e565b005b34801561047957600080fd5b5061046b610488366004614431565b610cc7565b34801561049957600080fd5b5061046b6104a83660046144f5565b610d2e565b3480156104b957600080fd5b506103c760035481565b3480156104cf57600080fd5b506103c760075481565b3480156104e557600080fd5b50600c546104fa90600160b81b900460ff1681565b60405190151581526020016103d1565b34801561051657600080fd5b5061046b610525366004614554565b6111b7565b34801561053657600080fd5b5061046b610545366004614431565b6111ff565b34801561055657600080fd5b5060095461056a906001600160a01b031681565b6040516001600160a01b0390911681526020016103d1565b34801561058e57600080fd5b506103c761059d366004614578565b6001600160a01b031660009081526011602052604090205490565b61046b6112a0565b3480156105cc57600080fd5b5061046b6105db3660046144ce565b61136c565b3480156105ec57600080fd5b5061046b6105fb366004614431565b61139b565b34801561060c57600080fd5b50600c546104fa90600160a01b900460ff1681565b34801561062d57600080fd5b5061046b61063c366004614431565b6113d3565b34801561064d57600080fd5b50600b5461056a906001600160a01b031681565b34801561066d57600080fd5b5061046b61067c366004614554565b611438565b34801561068d57600080fd5b506103c760025481565b3480156106a357600080fd5b5061046b6106b2366004614578565b611480565b3480156106c357600080fd5b5061046b6106d23660046144ce565b6114cc565b3480156106e357600080fd5b5061046b6106f2366004614578565b611574565b34801561070357600080fd5b5061046b6115c0565b34801561071857600080fd5b5061056a610727366004614578565b6001600160a01b039081166000908152601060205260409020541690565b34801561075157600080fd5b5061046b610760366004614554565b6115f6565b61046b610773366004614431565b61163e565b34801561078457600080fd5b5061046b610793366004614595565b611c3e565b3480156107a457600080fd5b5061046b6107b3366004614595565b611fcf565b3480156107c457600080fd5b5060085461056a906001600160a01b031681565b3480156107e457600080fd5b5061046b6107f33660046145ca565b61229d565b61046b610806366004614595565b612331565b34801561081757600080fd5b506104fa610826366004614578565b6001600160a01b03166000908152600d602052604090205460ff1690565b34801561085057600080fd5b506001546001600160a01b031661056a565b34801561086e57600080fd5b5061046b61087d366004614554565b612634565b34801561088e57600080fd5b506103c760065481565b3480156108a457600080fd5b5061046b6108b3366004614603565b6126ad565b3480156108c457600080fd5b5061046b6108d33660046144ce565b612aa8565b3480156108e457600080fd5b5061046b6108f33660046144ce565b612af8565b34801561090457600080fd5b50600c5461056a906001600160a01b031681565b34801561092457600080fd5b5061046b610933366004614431565b612b48565b34801561094457600080fd5b506103c7610953366004614578565b6001600160a01b031660009081526012602052604090205490565b34801561097a57600080fd5b5061046b610989366004614578565b612c13565b34801561099a57600080fd5b5061046b6109a936600461464d565b612c5f565b3480156109ba57600080fd5b5061046b6109c9366004614554565b612cb7565b3480156109da57600080fd5b50600c546104fa90600160b01b900460ff1681565b3480156109fb57600080fd5b506104fa610a0a366004614431565b612d30565b348015610a1b57600080fd5b5061046b610a2a366004614578565b612dbc565b348015610a3b57600080fd5b506103c760045481565b348015610a5157600080fd5b506103c760055481565b348015610a6757600080fd5b5061046b610a76366004614431565b612e08565b348015610a8757600080fd5b506103c7610a96366004614431565b612e5e565b348015610aa757600080fd5b50600c546104fa90600160a81b900460ff1681565b348015610ac857600080fd5b50610adc610ad7366004614431565b612e72565b6040516103d1919061467b565b348015610af557600080fd5b50600c546104fa90600160c01b900460ff1681565b348015610b1657600080fd5b50610b2a610b25366004614431565b612f9d565b6040516103d191906146a8565b348015610b4357600080fd5b5061046b610b52366004614578565b613054565b348015610b6357600080fd5b5061046b610b72366004614431565b6130ef565b348015610b8357600080fd5b50600a5461056a906001600160a01b031681565b6000600554600454600354600254610baf9190614739565b610bb99190614739565b610bc39190614739565b905090565b6001600160a01b0382166000908152600e602090815260408083208484528252808320805482518185028101850190935280835260609492939192909184015b82821015610c61576000848152602090819020604080516080810182526004860290920180548352600180820154848601526002820154928401929092526003015460ff16151560608301529083529092019101610c08565b5050505090505b92915050565b6001546001600160a01b03163314610ca15760405162461bcd60e51b8152600401610c9890614751565b60405180910390fd5b6064811115610cc25760405162461bcd60e51b8152600401610c9890614786565b600255565b6001546001600160a01b03163314610cf15760405162461bcd60e51b8152600401610c9890614751565b6064811115610d125760405162461bcd60e51b8152600401610c9890614786565b6001600160a01b03909116600090815260126020526040902055565b60026000541415610d515760405162461bcd60e51b8152600401610c98906147ab565b60026000556040516331a9108f60e11b81526004810185905285906001600160a01b03821690636352211e9060240160206040518083038186803b158015610d9857600080fd5b505afa158015610dac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd091906147e2565b6001600160a01b0316336001600160a01b031614610e485760405162461bcd60e51b815260206004820152602f60248201527f4f6e6c7920746865206f776e6572206f662074686973204e46542063616e206160448201526e31b1b2b83a1030b71037b33332b91760891b6064820152608401610c98565b60405163e985e9c560e01b81523360048201523060248201526001600160a01b0382169063e985e9c59060440160206040518083038186803b158015610e8d57600080fd5b505afa158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec591906147ff565b610ee15760405162461bcd60e51b8152600401610c989061481c565b600c54600160a01b900460ff1615610f3b5760405162461bcd60e51b815260206004820181905260248201527f4d61726b6574706c6163652074726164696e672069732064697361626c65642e6044820152606401610c98565b6001600160a01b0386166000908152600d602052604090205460ff16610f735760405162461bcd60e51b8152600401610c989061486a565b6001600160a01b0386166000908152600f60209081526040808320888452909152812080549091670de0b6b3a763ffff91610fb0906001906148b5565b90505b86838281548110610fc657610fc66148cc565b9060005260206000209060030201600001541480156110205750856001600160a01b0316838281548110610ffc57610ffc6148cc565b600091825260209091206003909102016002015461010090046001600160a01b0316145b80156110525750828181548110611039576110396148cc565b600091825260209091206002600390920201015460ff16155b8015611091575084151583828154811061106e5761106e6148cc565b906000526020600020906003020160020160159054906101000a900460ff161515145b1561109e578091506110b0565b806110a8816148e2565b915050610fb3565b5080670de0b6b3a763ffff14156111095760405162461bcd60e51b815260206004820152601b60248201527f4d61746368696e67206f66666572206e6f7420666f756e642e2e2e00000000006044820152606401610c98565b338585156111245761111f858b8b8b86866131e2565b611132565b611132858b8b8b8686613637565b61115d8a8a8587878154811061114a5761114a6148cc565b9060005260206000209060030201613ccd565b600c54600160c01b900460ff1615611179576111798a8a613dd0565b600c54600160b81b900460ff16801561119757506111978a8a612d30565b156111a6576111a68a8a613dfc565b505060016000555050505050505050565b6001546001600160a01b031633146111e15760405162461bcd60e51b8152600401610c9890614751565b600c8054911515600160c01b0260ff60c01b19909216919091179055565b6001546001600160a01b031633146112295760405162461bcd60e51b8152600401610c9890614751565b816001600160a01b03166323b872dd3061124b6001546001600160a01b031690565b846040518463ffffffff1660e01b815260040161126a939291906148f9565b600060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050505050565b600260005414156112c35760405162461bcd60e51b8152600401610c98906147ab565b6002600055662386f26fc10000341161132a5760405162461bcd60e51b8152602060048201526024808201527f4d696e696d756d20657363726f77206465706f73697420697320302e3031204d60448201526327ab291760e11b6064820152608401610c98565b346006600082825461133c9190614739565b90915550503360009081526011602052604081208054349290611360908490614739565b90915550506001600055565b6001546001600160a01b031633146113965760405162461bcd60e51b8152600401610c9890614751565b600755565b6001546001600160a01b031633146113c55760405162461bcd60e51b8152600401610c9890614751565b6113cf8282613dd0565b5050565b6001546001600160a01b031633146113fd5760405162461bcd60e51b8152600401610c9890614751565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015611433573d6000803e3d6000fd5b505050565b6001546001600160a01b031633146114625760405162461bcd60e51b8152600401610c9890614751565b600c8054911515600160b01b0260ff60b01b19909216919091179055565b6001546001600160a01b031633146114aa5760405162461bcd60e51b8152600401610c9890614751565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600260005414156114ef5760405162461bcd60e51b8152600401610c98906147ab565b60026000908155338152601160205260409020548111156115625760405162461bcd60e51b815260206004820152602760248201527f547279696e6720746f207769746864726177206d6f7265207468616e2064657060448201526637b9b4ba32b21760c91b6064820152608401610c98565b61156c3382613eb7565b506001600055565b6001546001600160a01b0316331461159e5760405162461bcd60e51b8152600401610c9890614751565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146115ea5760405162461bcd60e51b8152600401610c9890614751565b6115f46000613fc6565b565b6001546001600160a01b031633146116205760405162461bcd60e51b8152600401610c9890614751565b600c8054911515600160b81b0260ff60b81b19909216919091179055565b600260005414156116615760405162461bcd60e51b8152600401610c98906147ab565b6002600055600c54600160a01b900460ff16156116c05760405162461bcd60e51b815260206004820181905260248201527f4d61726b6574706c6163652074726164696e672069732064697361626c65642e6044820152606401610c98565b6001600160a01b0382166000908152600d602052604090205460ff166116f85760405162461bcd60e51b8152600401610c989061486a565b60006117048383612e5e565b90508034101561176d5760405162461bcd60e51b815260206004820152602e60248201527f54686520616d6f756e742073656e74206973206c657373207468616e2074686560448201526d1030b9b5b4b73390383934b1b29760911b6064820152608401610c98565b600081116117c95760405162461bcd60e51b815260206004820152602360248201527f5468697320746f6b656e206973206e6f742063757272656e746c79206c69737460448201526232b21760e91b6064820152608401610c98565b6040516331a9108f60e11b8152600481018390526000906001600160a01b03851690636352211e9060240160206040518083038186803b15801561180c57600080fd5b505afa158015611820573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184491906147e2565b60405163e985e9c560e01b81526001600160a01b0380831660048301523060248301529192509085169063e985e9c59060440160206040518083038186803b15801561188f57600080fd5b505afa1580156118a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118c791906147ff565b6118e35760405162461bcd60e51b8152600401610c989061481c565b336000808080806118f48a89614018565b945094509450945094506000876001600160a01b03163190508a6001600160a01b03166342842e0e89898d6040518463ffffffff1660e01b815260040161193d939291906148f9565b600060405180830381600087803b15801561195757600080fd5b505af115801561196b573d6000803e3d6000fd5b50506040516001600160a01b038b16925084156108fc02915084906000818181858888f193505050501580156119a5573d6000803e3d6000fd5b506040516331a9108f60e11b8152600481018b90526001600160a01b0380891691908d1690636352211e9060240160206040518083038186803b1580156119eb57600080fd5b505afa1580156119ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2391906147e2565b6001600160a01b031614611a495760405162461bcd60e51b8152600401610c989061491d565b611a538282614739565b886001600160a01b0316311015611a7c5760405162461bcd60e51b8152600401610c9890614962565b604080516001600160a01b038d81168252602082018d90528b92818b1692918c16917fe84a930f9e56d6b1a9a6619750ca0a3827c08b1634164de2ca9b49798890486f910160405180910390a4600c54600160b01b900460ff1615611c18576001600160a01b03808c1660009081526010602052604080822054905192169185156108fc0291869190818181858888f19350505050158015611b22573d6000803e3d6000fd5b506009546040516001600160a01b039091169087156108fc029088906000818181858888f19350505050158015611b5d573d6000803e3d6000fd5b50600c54600160a81b900460ff1615611ba157600a54611b86906001600160a01b03168661411d565b600b54611b9c906001600160a01b03168561411d565b611c18565b600a546040516001600160a01b039091169086156108fc029087906000818181858888f19350505050158015611bdb573d6000803e3d6000fd5b50600b546040516001600160a01b039091169085156108fc029086906000818181858888f19350505050158015611c16573d6000803e3d6000fd5b505b611c228b8b6141b7565b611c2c8b8b613dfc565b50506001600055505050505050505050565b6040516331a9108f60e11b8152600481018390526001600160a01b03841690636352211e9060240160206040518083038186803b158015611c7e57600080fd5b505afa158015611c92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb691906147e2565b6001600160a01b0316336001600160a01b03161415611d175760405162461bcd60e51b815260206004820152601c60248201527f43616e206e6f7420626964206f6e20796f7572206f776e204e46542e000000006044820152606401610c98565b60008111611d625760405162461bcd60e51b815260206004820152601860248201527721b0b73737ba103134b2103090383934b1b29037b310181760411b6044820152606401610c98565b3331811115611dd15760405162461bcd60e51b815260206004820152603560248201527f54686520627579657220646f6573206e6f74206861766520656e6f756768206d60448201527437b732bc903a379036b0b5b2903a3432903134b21760591b6064820152608401610c98565b600854604051636eb1769f60e11b815233600482015230602482015282916001600160a01b03169063dd62ed3e9060440160206040518083038186803b158015611e1a57600080fd5b505afa158015611e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5291906149a3565b1015611ec65760405162461bcd60e51b815260206004820152603860248201527f4e6f7420616e20657363726f776564206269643b20617070726f76616c20726560448201527f717569726564202844656661756c743a20574d4f5652292e00000000000000006064820152608401610c98565b6001600160a01b038381166000818152600f602090815260408083208784528252808320815160a08101835287815242818501818152828501878152336060808601828152608087018b8152885460018082018b55998d528b8d2098516003909102909801978855945197870197909755915160029095018054965193511515600160a81b0260ff60a81b1994909c1661010002610100600160a81b0319961515969096166001600160a81b03199097169690961794909417919091169890981790925582519081529283015281019190915283928592917fc04359f39c9f4a2c55808f46b81414842c7568aa3f1a7c9160c70dbf32d79a8891015b60405180910390a4505050565b6040516331a9108f60e11b8152600481018390526001600160a01b03841690636352211e9060240160206040518083038186803b15801561200f57600080fd5b505afa158015612023573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061204791906147e2565b6001600160a01b0316336001600160a01b0316146120b65760405162461bcd60e51b815260206004820152602660248201527f4f6e6c7920746865206f776e6572206f66206120746f6b656e2063616e206c6960448201526539ba1034ba1760d11b6064820152608401610c98565b600081116120ff5760405162461bcd60e51b815260206004820152601660248201527521b0b73737ba1039b2ba10383934b1b2903a3790181760511b6044820152606401610c98565b60405163e985e9c560e01b81523360048201523060248201526001600160a01b0384169063e985e9c59060440160206040518083038186803b15801561214457600080fd5b505afa158015612158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217c91906147ff565b6121e65760405162461bcd60e51b815260206004820152603560248201527f4d61726b6574706c616365206e6f7420617070726f76656420746f2068616e646044820152743632903a3434b9903ab9b2b939903a37b5b2b7399760591b6064820152608401610c98565b6001600160a01b0383166000818152600e6020908152604080832086845282528083208151608081018352868152428185018181528285018a815260608401888152855460018082018855968a52988890209451600490990290940197885590519387019390935591516002860155516003909401805460ff191694151594909417909355519182528392859290917fda2d7fa13c443a4ce51bb68b8ce92f41fac2c10d9d5bdb6a9e9a91429020b7c39101611fc2565b6001546001600160a01b031633146122c75760405162461bcd60e51b8152600401610c9890614751565b6001600160a01b0382166000908152600d602052604090205460ff16151581151514156123065760405162461bcd60e51b8152600401610c98906149bc565b6001600160a01b03919091166000908152600d60205260409020805460ff1916911515919091179055565b600260005414156123545760405162461bcd60e51b8152600401610c98906147ab565b60026000556040516331a9108f60e11b8152600481018390526001600160a01b03841690636352211e9060240160206040518083038186803b15801561239957600080fd5b505afa1580156123ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d191906147e2565b6001600160a01b0316336001600160a01b031614156124325760405162461bcd60e51b815260206004820152601c60248201527f43616e206e6f7420626964206f6e20796f7572206f776e204e46542e000000006044820152606401610c98565b6000811161247d5760405162461bcd60e51b815260206004820152601860248201527721b0b73737ba103134b2103090383934b1b29037b310181760411b6044820152606401610c98565b803410156124f35760405162461bcd60e51b815260206004820152603860248201527f54686520627579657220646964206e6f742073656e6420656e6f756768206d6f60448201527f6e657920666f7220616e20657363726f776564206269642e00000000000000006064820152608401610c98565b34600660008282546125059190614739565b90915550503360009081526011602052604081208054349290612529908490614739565b90915550506001600160a01b038381166000818152600f602090815260408083208784528252808320815160a0810183528781524281850181815282850187815233606080860182815260016080880181815289548083018b55998d529b8b902097516003909902909701978855935187870155915160029096018054935199516001600160a81b0319909416961515610100600160a81b0319169690961761010099909b16989098029990991760ff60a81b1916600160a81b911515919091021790925582519485529284015282015283928592917fc04359f39c9f4a2c55808f46b81414842c7568aa3f1a7c9160c70dbf32d79a88910160405180910390a45050600160005550565b6001546001600160a01b0316331461265e5760405162461bcd60e51b8152600401610c9890614751565b600c5460ff600160a01b909104161515811515141561268f5760405162461bcd60e51b8152600401610c98906149bc565b600c8054911515600160a01b0260ff60a01b19909216919091179055565b600260005414156126d05760405162461bcd60e51b8152600401610c98906147ab565b600260009081556001600160a01b0385168152600f602090815260408083208684529091528120905b8154811015612a545782156128af578382828154811061271b5761271b6148cc565b9060005260206000209060030201600001541480156127755750336001600160a01b0316828281548110612751576127516148cc565b600091825260209091206003909102016002015461010090046001600160a01b0316145b80156127ae575081818154811061278e5761278e6148cc565b906000526020600020906003020160020160159054906101000a900460ff165b80156127e057508181815481106127c7576127c76148cc565b600091825260209091206002600390920201015460ff16155b156128aa576001600160a01b0386166000908152600f60209081526040808320888452909152902080548290811061281a5761281a6148cc565b600091825260208220600390910201818155600181019190915560020180546001600160b01b031916905561284f3385613eb7565b6040805133815284151560208201524291810191909152849086906001600160a01b038916907fd2c5c6bf17cda2bc1b6c61b2de68b0738dc35ca17f4cdbecd6192cf49a741f88906060015b60405180910390a45050612a9d565b612a42565b838282815481106128c2576128c26148cc565b90600052602060002090600302016000015414801561291c5750336001600160a01b03168282815481106128f8576128f86148cc565b600091825260209091206003909102016002015461010090046001600160a01b0316145b80156129565750818181548110612935576129356148cc565b906000526020600020906003020160020160159054906101000a900460ff16155b8015612988575081818154811061296f5761296f6148cc565b600091825260209091206002600390920201015460ff16155b15612a42576001600160a01b0386166000908152600f6020908152604080832088845290915290208054829081106129c2576129c26148cc565b600091825260208083206003929092029091018281556001810192909255600290910180546001600160b01b031916905560408051338152851515928101929092524290820152849086906001600160a01b038916907fd2c5c6bf17cda2bc1b6c61b2de68b0738dc35ca17f4cdbecd6192cf49a741f889060600161289b565b80612a4c816149f3565b9150506126f9565b5060405162461bcd60e51b815260206004820152601b60248201527f4e6f2063616e63656c6c61626c65206f6666657220666f756e642e00000000006044820152606401610c98565b505060016000555050565b6001546001600160a01b03163314612ad25760405162461bcd60e51b8152600401610c9890614751565b6064811115612af35760405162461bcd60e51b8152600401610c9890614786565b600455565b6001546001600160a01b03163314612b225760405162461bcd60e51b8152600401610c9890614751565b6064811115612b435760405162461bcd60e51b8152600401610c9890614786565b600355565b6001546001600160a01b03163314612b725760405162461bcd60e51b8152600401610c9890614751565b816001600160a01b031663a9059cbb612b936001546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015612bdb57600080fd5b505af1158015612bef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061143391906147ff565b6001546001600160a01b03163314612c3d5760405162461bcd60e51b8152600401610c9890614751565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314612c895760405162461bcd60e51b8152600401610c9890614751565b6001600160a01b03918216600090815260106020526040902080546001600160a01b03191691909216179055565b6001546001600160a01b03163314612ce15760405162461bcd60e51b8152600401610c9890614751565b600c5460ff600160a81b9091041615158115151415612d125760405162461bcd60e51b8152600401610c98906149bc565b600c8054911515600160a81b0260ff60a81b19909216919091179055565b6001600160a01b0382166000908152600e6020908152604080832084845290915281205480612d63576000915050610c68565b6001600160a01b0384166000908152600e602090815260408083208684529091529020612d916001836148b5565b81548110612da157612da16148cc565b60009182526020909120600490910201541515949350505050565b6001546001600160a01b03163314612de65760405162461bcd60e51b8152600401610c9890614751565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314612e325760405162461bcd60e51b8152600401610c9890614751565b6001600160a01b0382166000908152600e6020908152604080832084845290915281206113cf91614285565b6000612e6a8383612e72565b519392505050565b612e9f60405180608001604052806000815260200160008152602001600081526020016000151581525090565b6001600160a01b0383166000908152600e6020908152604080832085845290915290205480612f105760405162461bcd60e51b815260206004820152601b60248201527f4e6f206c697374696e677320666f72207468697320746f6b656e2e00000000006044820152606401610c98565b6001600160a01b0384166000908152600e602090815260408083208684529091529020612f3e6001836148b5565b81548110612f4e57612f4e6148cc565b60009182526020918290206040805160808101825260049093029091018054835260018101549383019390935260028301549082015260039091015460ff161515606082015291505092915050565b6001600160a01b0382166000908152600f602090815260408083208484528252808320805482518185028101850190935280835260609492939192909184015b82821015610c615760008481526020908190206040805160a08101825260038602909201805483526001808201548486015260029091015460ff8082161515938501939093526001600160a01b036101008204166060850152600160a81b9004909116151560808301529083529092019101612fdd565b6001546001600160a01b0316331461307e5760405162461bcd60e51b8152600401610c9890614751565b6001600160a01b0381166130e35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c98565b6130ec81613fc6565b50565b6040516331a9108f60e11b8152600481018290526001600160a01b03831690636352211e9060240160206040518083038186803b15801561312f57600080fd5b505afa158015613143573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061316791906147e2565b6001600160a01b0316336001600160a01b0316146131d85760405162461bcd60e51b815260206004820152602860248201527f4f6e6c7920746865206f776e6572206f66206120746f6b656e2063616e2064656044820152673634b9ba1034ba1760c11b6064820152608401610c98565b6113cf8282613dfc565b6001600160a01b03811660009081526011602052604090205483111561325e5760405162461bcd60e51b815260206004820152602b60248201527f427579657220646f6573206e6f74206861766520656e6f756768206d6f6e657960448201526a1034b71032b9b1b937bb9760a91b6064820152608401610c98565b8260065410156132b05760405162461bcd60e51b815260206004820152601760248201527f457363726f772062616c616e636520746f6f206c6f772e0000000000000000006044820152606401610c98565b6001600160a01b038216316000808080806132cb8b8a614018565b6001600160a01b038c1660009081526011602052604081208054969b5094995092975090955093508b926133009084906148b5565b92505081905550886006600082825461331991906148b5565b9091555050604051632142170760e11b81526001600160a01b038d16906342842e0e9061334e908b908b908f906004016148f9565b600060405180830381600087803b15801561336857600080fd5b505af115801561337c573d6000803e3d6000fd5b50506040516001600160a01b038b16925083156108fc02915083906000818181858888f193505050501580156133b6573d6000803e3d6000fd5b506133c18187614739565b886001600160a01b03163110156133ea5760405162461bcd60e51b8152600401610c9890614962565b6040516331a9108f60e11b8152600481018b90526001600160a01b0380891691908e1690636352211e9060240160206040518083038186803b15801561342f57600080fd5b505afa158015613443573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061346791906147e2565b6001600160a01b03161461348d5760405162461bcd60e51b8152600401610c989061491d565b604080516001600160a01b038d81168252602082018d90528b92818b1692918c16917fe84a930f9e56d6b1a9a6619750ca0a3827c08b1634164de2ca9b49798890486f910160405180910390a4600c54600160b01b900460ff1615613629576001600160a01b03808c1660009081526010602052604080822054905192169184156108fc0291859190818181858888f19350505050158015613533573d6000803e3d6000fd5b506009546040516001600160a01b039091169086156108fc029087906000818181858888f1935050505015801561356e573d6000803e3d6000fd5b50600c54600160a81b900460ff16156135b257600a54613597906001600160a01b03168561411d565b600b546135ad906001600160a01b03168461411d565b613629565b600a546040516001600160a01b039091169085156108fc029086906000818181858888f193505050501580156135ec573d6000803e3d6000fd5b50600b546040516001600160a01b039091169084156108fc029085906000818181858888f19350505050158015613627573d6000803e3d6000fd5b505b505050505050505050505050565b6008546040516370a0823160e01b81523360048201526001600160a01b0390911690849082906370a082319060240160206040518083038186803b15801561367e57600080fd5b505afa158015613692573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136b691906149a3565b101561371a5760405162461bcd60e51b815260206004820152602d60248201527f427579657220646f6573206e6f74206861766520656e6f756768206d6f6e657960448201526c103a3790383ab931b430b9b29760991b6064820152608401610c98565b604051636eb1769f60e11b81526001600160a01b03838116600483015230602483015285919083169063dd62ed3e9060440160206040518083038186803b15801561376457600080fd5b505afa158015613778573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061379c91906149a3565b10156138025760405162461bcd60e51b815260206004820152602f60248201527f4d61726b6574706c616365206e6f7420617070726f76656420746f207370656e60448201526e3210313abcb2b9103a37b5b2b7399760891b6064820152608401610c98565b60008060008060006138148b8a614018565b945094509450945094508b6001600160a01b03166342842e0e89898d6040518463ffffffff1660e01b815260040161384e939291906148f9565b600060405180830381600087803b15801561386857600080fd5b505af115801561387c573d6000803e3d6000fd5b50506040516323b872dd60e01b81526001600160a01b03891692506323b872dd91506138b0908a908c9086906004016148f9565b602060405180830381600087803b1580156138ca57600080fd5b505af11580156138de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061390291906147ff565b506040516370a0823160e01b81526001600160a01b0389811660048301528291908816906370a082319060240160206040518083038186803b15801561394757600080fd5b505afa15801561395b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061397f91906149a3565b101561399d5760405162461bcd60e51b8152600401610c9890614962565b6040516331a9108f60e11b8152600481018b90526001600160a01b0380891691908e1690636352211e9060240160206040518083038186803b1580156139e257600080fd5b505afa1580156139f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a1a91906147e2565b6001600160a01b031614613a405760405162461bcd60e51b8152600401610c989061491d565b604080516001600160a01b038d81168252602082018d90528b92818b1692918c16917fe84a930f9e56d6b1a9a6619750ca0a3827c08b1634164de2ca9b49798890486f910160405180910390a4600c54600160b01b900460ff1615613629576001600160a01b038b8116600090815260106020526040908190205490516323b872dd60e01b8152828916926323b872dd92613ae6923092919091169087906004016148f9565b602060405180830381600087803b158015613b0057600080fd5b505af1158015613b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b3891906147ff565b506009546040516323b872dd60e01b81526001600160a01b03808916926323b872dd92613b6d92309216908a906004016148f9565b602060405180830381600087803b158015613b8757600080fd5b505af1158015613b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bbf91906147ff565b50600a546040516323b872dd60e01b81526001600160a01b03808916926323b872dd92613bf4923092169089906004016148f9565b602060405180830381600087803b158015613c0e57600080fd5b505af1158015613c22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c4691906147ff565b50600b546040516323b872dd60e01b81526001600160a01b03808916926323b872dd92613c7b923092169088906004016148f9565b602060405180830381600087803b158015613c9557600080fd5b505af1158015613ca9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061362791906147ff565b6040805160a0810182528254815260018084015460208084019190915260028501546001600160a01b03610100820481166060860152600160a81b90910460ff1615156080850152838501929092529087166000908152600f825283812087825290915291909120805482919085908110613d4a57613d4a6148cc565b6000918252602091829020835160039092020190815590820151600182015560408201516002909101805460608401516080909401511515600160a81b0260ff60a81b196001600160a01b0390951661010002610100600160a81b0319941515949094166001600160a81b03199092169190911792909217929092161790555050505050565b6001600160a01b0382166000908152600f6020908152604080832084845290915281206113cf916142a6565b6001600160a01b0382166000818152600e60209081526040808320858452825280832081516080810183528481524281850181815282850189815260608401888152855460018082018855968a52988890209451600490990290940197885590519387019390935591516002860155516003909401805460ff191694151594909417909355519182528392917f1a99fed16d0c92a9f028b3f166d0aab2b85f7b731686df5d1b75d0171f450764910160405180910390a35050565b806006541015613ed95760405162461bcd60e51b8152600401610c9890614a0e565b6001600160a01b038216600090815260116020526040902054811115613f115760405162461bcd60e51b8152600401610c9890614a0e565b8060066000828254613f2391906148b5565b90915550506001600160a01b03821660009081526011602052604081208054839290613f509084906148b5565b90915550506040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015613f8b573d6000803e3d6000fd5b5060405181906001600160a01b038416907fbf1a0ef092ef679427b427c6a95d51133522541e667b737b795a77f2b61c240d90600090a35050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216600090815260126020526040812054819081908190819081901561405e576001600160a01b038816600090815260126020526040902054614062565b6005545b905060006103e8600254896140779190614a6b565b6140819190614a8a565b905060006103e86003548a6140969190614a6b565b6140a09190614a8a565b905060006103e86004548b6140b59190614a6b565b6140bf9190614a8a565b905060006103e86140d0868d614a6b565b6140da9190614a8a565b9050600081836140ea8688614739565b6140f49190614739565b6140fe9190614739565b614108908d6148b5565b949d939c50919a509850919650945050505050565b6000826001600160a01b031660075483604051600060405180830381858888f193505050503d806000811461416e576040519150601f19603f3d011682016040523d82523d6000602084013e614173565b606091505b50509050806114335760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610c98565b60006141c38383612e72565b600160608201526001600160a01b0384166000908152600e602090815260408083208684529091529020549091508190801561427e576001600160a01b0385166000908152600e60209081526040808320878452909152902082906142296001846148b5565b81548110614239576142396148cc565b6000918252602091829020835160049290920201908155908201516001820155604082015160028201556060909101516003909101805460ff19169115159190911790555b5050505050565b50805460008255600402906000526020600020908101906130ec91906142c7565b50805460008255600302906000526020600020908101906130ec91906142f9565b5b808211156142f557600080825560018201819055600282015560038101805460ff191690556004016142c8565b5090565b5b808211156142f557600080825560018201556002810180546001600160b01b03191690556003016142fa565b6001600160a01b03811681146130ec57600080fd5b634e487b7160e01b600052604160045260246000fd5b6000806000806080858703121561436757600080fd5b843561437281614326565b9350602085013561438281614326565b925060408501359150606085013567ffffffffffffffff808211156143a657600080fd5b818701915087601f8301126143ba57600080fd5b8135818111156143cc576143cc61433b565b604051601f8201601f19908116603f011681019083821181831017156143f4576143f461433b565b816040528281528a602084870101111561440d57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561444457600080fd5b823561444f81614326565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b818110156144c2576144af8385518051825260208101516020830152604081015160408301526060810151151560608301525050565b9284019260809290920191600101614479565b50909695505050505050565b6000602082840312156144e057600080fd5b5035919050565b80151581146130ec57600080fd5b600080600080600060a0868803121561450d57600080fd5b853561451881614326565b94506020860135935060408601359250606086013561453681614326565b91506080860135614546816144e7565b809150509295509295909350565b60006020828403121561456657600080fd5b8135614571816144e7565b9392505050565b60006020828403121561458a57600080fd5b813561457181614326565b6000806000606084860312156145aa57600080fd5b83356145b581614326565b95602085013595506040909401359392505050565b600080604083850312156145dd57600080fd5b82356145e881614326565b915060208301356145f8816144e7565b809150509250929050565b6000806000806080858703121561461957600080fd5b843561462481614326565b935060208501359250604085013591506060850135614642816144e7565b939692955090935050565b6000806040838503121561466057600080fd5b823561466b81614326565b915060208301356145f881614326565b81518152602080830151908201526040808301519082015260608083015115159082015260808101610c68565b602080825282518282018190526000919060409081850190868401855b82811015614716578151805185528681015187860152858101511515868601526060808201516001600160a01b03169086015260809081015115159085015260a090930192908501906001016146c5565b5091979650505050505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561474c5761474c614723565b500190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600b908201526a4d6178203130252066656560a81b604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6000602082840312156147f457600080fd5b815161457181614326565b60006020828403121561481157600080fd5b8151614571816144e7565b6020808252602e908201527f4d61726b6574706c616365206e6f7420617070726f76656420746f207472616e60408201526d39b332b9103a3434b99027232a1760911b606082015260800190565b6020808252602b908201527f54726164696e6720666f72207468697320636f6c6c656374696f6e206973206e60408201526a37ba1032b730b13632b21760a91b606082015260800190565b6000828210156148c7576148c7614723565b500390565b634e487b7160e01b600052603260045260246000fd5b6000816148f1576148f1614723565b506000190190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b60208082526025908201527f4e465420776173206e6f74207375636365737366756c6c79207472616e736665604082015264393932b21760d91b606082015260800190565b60208082526021908201527f46756e64732077657265206e6f74207375636365737366756c6c792073656e746040820152601760f91b606082015260800190565b6000602082840312156149b557600080fd5b5051919050565b6020808252601a908201527f416c72656164792073657420746f20746861742076616c75652e000000000000604082015260600190565b6000600019821415614a0757614a07614723565b5060010190565b6020808252603c908201527f4e6f7420656e6f7567682066756e647320746f2072657475726e20657363726f60408201527f772e205468656f7265746963616c6c7920696d706f737369626c652e00000000606082015260800190565b6000816000190483118215151615614a8557614a85614723565b500290565b600082614aa757634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220cdf6b65489a70c82d48404d87ec9ac89381263fd3f4eca1683ade85385b0eb2964736f6c63430008090033
Deployed ByteCode Sourcemap
12376:20705:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24525:142;;;;;;;;;;;;;:::i;:::-;;;160:25:1;;;148:2;133:18;24525:142:0;;;;;;;;14705:158;;;;;;;;;;-1:-1:-1;14705:158:0;;;;;:::i;:::-;-1:-1:-1;;;14705:158:0;;;;;;;;;;-1:-1:-1;;;;;;1897:33:1;;;1879:52;;1867:2;1852:18;14705:158:0;1735:202:1;16991:143:0;;;;;;;;;;-1:-1:-1;16991:143:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25958:118::-;;;;;;;;;;-1:-1:-1;25958:118:0;;;;;:::i;:::-;;:::i;:::-;;26364:159;;;;;;;;;;-1:-1:-1;26364:159:0;;;;;:::i;:::-;;:::i;22126:1632::-;;;;;;;;;;-1:-1:-1;22126:1632:0;;;;;:::i;:::-;;:::i;13246:35::-;;;;;;;;;;;;;;;;13433:37;;;;;;;;;;;;;;;;14232:44;;;;;;;;;;-1:-1:-1;14232:44:0;;;;-1:-1:-1;;;14232:44:0;;;;;;;;;4388:14:1;;4381:22;4363:41;;4351:2;4336:18;14232:44:0;4223:187:1;27301:123:0;;;;;;;;;;-1:-1:-1;27301:123:0;;;;;:::i;:::-;;:::i;27636:146::-;;;;;;;;;;-1:-1:-1;27636:146:0;;;;;:::i;:::-;;:::i;13555:70::-;;;;;;;;;;-1:-1:-1;13555:70:0;;;;-1:-1:-1;;;;;13555:70:0;;;;;;-1:-1:-1;;;;;4825:32:1;;;4807:51;;4795:2;4780:18;13555:70:0;4661:203:1;24256:112:0;;;;;;;;;;-1:-1:-1;24256:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;24343:19:0;24320:7;24343:19;;;:13;:19;;;;;;;24256:112;23798:229;;;:::i;26985:102::-;;;;;;;;;;-1:-1:-1;26985:102:0;;;;;:::i;:::-;;:::i;25060:109::-;;;;;;;;;;-1:-1:-1;25060:109:0;;;;;:::i;:::-;;:::i;14124:33::-;;;;;;;;;;-1:-1:-1;14124:33:0;;;;-1:-1:-1;;;14124:33:0;;;;;;27824:109;;;;;;;;;;-1:-1:-1;27824:109:0;;;;;:::i;:::-;;:::i;13714:78::-;;;;;;;;;;-1:-1:-1;13714:78:0;;;;-1:-1:-1;;;;;13714:78:0;;;27093:79;;;;;;;;;;-1:-1:-1;27093:79:0;;;;;:::i;:::-;;:::i;13210:26::-;;;;;;;;;;;;;;;;26747:110;;;;;;;;;;-1:-1:-1;26747:110:0;;;;;:::i;:::-;;:::i;24033:217::-;;;;;;;;;;-1:-1:-1;24033:217:0;;;;;:::i;:::-;;:::i;26863:116::-;;;;;;;;;;-1:-1:-1;26863:116:0;;;;;:::i;:::-;;:::i;1444:94::-;;;;;;;;;;;;;:::i;24407:112::-;;;;;;;;;;-1:-1:-1;24407:112:0;;;;;:::i;:::-;-1:-1:-1;;;;;24493:20:0;;;24470:7;24493:20;;;:16;:20;;;;;;;;24407:112;27178:117;;;;;;;;;;-1:-1:-1;27178:117:0;;;;;:::i;:::-;;:::i;17189:2057::-;;;;;;:::i;:::-;;:::i;19346:619::-;;;;;;;;;;-1:-1:-1;19346:619:0;;;;;:::i;:::-;;:::i;15596:497::-;;;;;;;;;;-1:-1:-1;15596:497:0;;;;;:::i;:::-;;:::i;13477:65::-;;;;;;;;;;-1:-1:-1;13477:65:0;;;;-1:-1:-1;;;;;13477:65:0;;;25626:205;;;;;;;;;;-1:-1:-1;25626:205:0;;;;;:::i;:::-;;:::i;20077:591::-;;;;;;:::i;:::-;;:::i;24791:118::-;;;;;;;;;;-1:-1:-1;24791:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;24875:28:0;24855:4;24875:28;;;:24;:28;;;;;;;;;24791:118;793:87;;;;;;;;;;-1:-1:-1;866:6:0;;-1:-1:-1;;;;;866:6:0;793:87;;25296:153;;;;;;;;;;-1:-1:-1;25296:153:0;;;;;:::i;:::-;;:::i;13390:38::-;;;;;;;;;;;;;;;;20767:932;;;;;;;;;;-1:-1:-1;20767:932:0;;;;;:::i;:::-;;:::i;26224:134::-;;;;;;;;;;-1:-1:-1;26224:134:0;;;;;:::i;:::-;;:::i;26082:136::-;;;;;;;;;;-1:-1:-1;26082:136:0;;;;;:::i;:::-;;:::i;13797:78::-;;;;;;;;;;-1:-1:-1;13797:78:0;;;;-1:-1:-1;;;;;13797:78:0;;;27468:126;;;;;;;;;;-1:-1:-1;27468:126:0;;;;;:::i;:::-;;:::i;24915:113::-;;;;;;;;;;-1:-1:-1;24915:113:0;;;;;:::i;:::-;-1:-1:-1;;;;;24999:23:0;24976:7;24999:23;;;:19;:23;;;;;;;24915:113;26629:112;;;;;;;;;;-1:-1:-1;26629:112:0;;;;;:::i;:::-;;:::i;25837:115::-;;;;;;;;;;-1:-1:-1;25837:115:0;;;;;:::i;:::-;;:::i;25455:165::-;;;;;;;;;;-1:-1:-1;25455:165:0;;;;;:::i;:::-;;:::i;14202:25::-;;;;;;;;;;-1:-1:-1;14202:25:0;;;;-1:-1:-1;;;14202:25:0;;;;;;16148:239;;;;;;;;;;-1:-1:-1;16148:239:0;;;;;:::i;:::-;;:::i;26529:94::-;;;;;;;;;;-1:-1:-1;26529:94:0;;;;;:::i;:::-;;:::i;13291:34::-;;;;;;;;;;;;;;;;13335:45;;;;;;;;;;;;;;;;25175:115;;;;;;;;;;-1:-1:-1;25175:115:0;;;;;:::i;:::-;;:::i;16456:146::-;;;;;;;;;;-1:-1:-1;16456:146:0;;;;;:::i;:::-;;:::i;14162:35::-;;;;;;;;;;-1:-1:-1;14162:35:0;;;;-1:-1:-1;;;14162:35:0;;;;;;16665:271;;;;;;;;;;-1:-1:-1;16665:271:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;14281:48::-;;;;;;;;;;-1:-1:-1;14281:48:0;;;;-1:-1:-1;;;14281:48:0;;;;;;21750:126;;;;;;;;;;-1:-1:-1;21750:126:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1693:192::-;;;;;;;;;;-1:-1:-1;1693:192:0;;;;;:::i;:::-;;:::i;15045:197::-;;;;;;;;;;-1:-1:-1;15045:197:0;;;;;:::i;:::-;;:::i;13630:79::-;;;;;;;;;;-1:-1:-1;13630:79:0;;;;-1:-1:-1;;;;;13630:79:0;;;24525:142;24567:7;24635:25;;24618:14;;24600:15;;24591:6;;:24;;;;:::i;:::-;:41;;;;:::i;:::-;:69;;;;:::i;:::-;24583:78;;24525:142;:::o;16991:143::-;-1:-1:-1;;;;;17107:12:0;;;;;;:8;:12;;;;;;;;:21;;;;;;;;17100:28;;;;;;;;;;;;;;;;;17075:16;;17100:28;;17107:21;;17100:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16991:143;;;;;:::o;25958:118::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;;;;;;;;;26032:3:::1;26025;:10;;26016:35;;;;-1:-1:-1::0;;;26016:35:0::1;;;;;;;:::i;:::-;26058:6;:12:::0;25958:118::o;26364:159::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26462:3:::1;26455;:10;;26446:35;;;;-1:-1:-1::0;;;26446:35:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26488:23:0;;::::1;;::::0;;;:19:::1;:23;::::0;;;;:29;26364:159::o;22126:1632::-;11431:1;12027:7;;:19;;12019:63;;;;-1:-1:-1;;;12019:63:0;;;;;;;:::i;:::-;11431:1;12160:7;:18;22307:21:::1;::::0;-1:-1:-1;;;22307:21:0;;::::1;::::0;::::1;160:25:1::0;;;22275:2:0;;-1:-1:-1;;;;;22307:12:0;::::1;::::0;::::1;::::0;133:18:1;;22307:21:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22293:35:0::1;:10;-1:-1:-1::0;;;;;22293:35:0::1;;22285:95;;;::::0;-1:-1:-1;;;22285:95:0;;9907:2:1;22285:95:0::1;::::0;::::1;9889:21:1::0;9946:2;9926:18;;;9919:30;9985:34;9965:18;;;9958:62;-1:-1:-1;;;10036:18:1;;;10029:45;10091:19;;22285:95:0::1;9705:411:1::0;22285:95:0::1;22395:48;::::0;-1:-1:-1;;;22395:48:0;;22417:10:::1;22395:48;::::0;::::1;10333:34:1::0;22437:4:0::1;10383:18:1::0;;;10376:43;-1:-1:-1;;;;;22395:21:0;::::1;::::0;::::1;::::0;10268:18:1;;22395:48:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22387:107;;;;-1:-1:-1::0;;;22387:107:0::1;;;;;;;:::i;:::-;22510:13;::::0;-1:-1:-1;;;22510:13:0;::::1;;;22509:14;22501:59;;;::::0;-1:-1:-1;;;22501:59:0;;11297:2:1;22501:59:0::1;::::0;::::1;11279:21:1::0;;;11316:18;;;11309:30;11375:34;11355:18;;;11348:62;11427:18;;22501:59:0::1;11095:356:1::0;22501:59:0::1;-1:-1:-1::0;;;;;22575:28:0;::::1;;::::0;;;:24:::1;:28;::::0;;;;;::::1;;22567:84;;;;-1:-1:-1::0;;;22567:84:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22065:10:0;;22658:23:::1;22065:10:::0;;;:6;:10;;;;;;;;:19;;;;;;;;22776:14;;22065:19;;22737:18:::1;::::0;22776:16:::1;::::0;22791:1:::1;::::0;22776:16:::1;:::i;:::-;22767:25;;22762:278;22840:5;22820:7;22828:1;22820:10;;;;;;;;:::i;:::-;;;;;;;;;;;:16;;;:25;:62;;;;;22878:4;-1:-1:-1::0;;;;;22858:24:0::1;:7;22866:1;22858:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:16;;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;22858:16:0::1;:24;22820:62;:103;;;;;22895:7;22903:1;22895:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:19:::1;:10;::::0;;::::1;;:19;::::0;::::1;;:28;22820:103;:150;;;;;22959:11;22936:34;;:7;22944:1;22936:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;;;;;;;;;;:34;;;22820:150;22816:217;;;23006:1;22991:16;;23018:5;;22816:217;22802:3:::0;::::1;::::0;::::1;:::i;:::-;;;;22762:278;;;;23054:12;23070:18;23054:34;;23046:74;;;::::0;-1:-1:-1;;;23046:74:0;;12473:2:1;23046:74:0::1;::::0;::::1;12455:21:1::0;12512:2;12492:18;;;12485:30;12551:29;12531:18;;;12524:57;12598:18;;23046:74:0::1;12271:351:1::0;23046:74:0::1;23203:10;23265:4:::0;23278:178;::::1;;;23304:62;23321:4;23327:2;23331:7;23340:5;23347:8;23357;23304:16;:62::i;:::-;23278:178;;;23389:59;23403:4;23409:2;23413:7;23422:5;23429:8;23439;23389:13;:59::i;:::-;23497:69;23517:2;23521:7;23530:12;23544:7;23552:12;23544:21;;;;;;;;:::i;:::-;;;;;;;;;;;23497:19;:69::i;:::-;23577:28;::::0;-1:-1:-1;;;23577:28:0;::::1;;;23573:77;;;23616:26;23630:2;23634:7;23616:13;:26::i;:::-;23659:25;::::0;-1:-1:-1;;;23659:25:0;::::1;;;:50:::0;::::1;;;;23688:21;23697:2;23701:7;23688:8;:21::i;:::-;23656:97;;;23720:25;23733:2;23737:7;23720:12;:25::i;:::-;-1:-1:-1::0;;11387:1:0;12339:7;:22;-1:-1:-1;;;;;;;;22126:1632:0:o;27301:123::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27381:28:::1;:37:::0;;;::::1;;-1:-1:-1::0;;;27381:37:0::1;-1:-1:-1::0;;;;27381:37:0;;::::1;::::0;;;::::1;::::0;;27301:123::o;27636:146::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27723:6:::1;-1:-1:-1::0;;;;;27715:28:0::1;;27752:4;27759:7;866:6:::0;;-1:-1:-1;;;;;866:6:0;;793:87;27759:7:::1;27768;27715:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27636:146:::0;;:::o;23798:229::-;11431:1;12027:7;;:19;;12019:63;;;;-1:-1:-1;;;12019:63:0;;;;;;;:::i;:::-;11431:1;12160:7;:18;23883:13:::1;23871:9;:25;23863:74;;;::::0;-1:-1:-1;;;23863:74:0;;13209:2:1;23863:74:0::1;::::0;::::1;13191:21:1::0;13248:2;13228:18;;;13221:30;13287:34;13267:18;;;13260:62;-1:-1:-1;;;13338:18:1;;;13331:34;13382:19;;23863:74:0::1;13007:400:1::0;23863:74:0::1;23967:9;23944:19;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;23997:10:0::1;23983:25;::::0;;;:13:::1;:25;::::0;;;;:38;;24012:9:::1;::::0;23983:25;:38:::1;::::0;24012:9;;23983:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;11387:1:0;12339:7;:22;23798:229::o;26985:102::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27056:13:::1;:25:::0;26985:102::o;25060:109::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;25137:26:::1;25151:2;25155:7;25137:13;:26::i;:::-;25060:109:::0;;:::o;27824:::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27899:28:::1;::::0;-1:-1:-1;;;;;27899:20:0;::::1;::::0;:28;::::1;;;::::0;27920:6;;27899:28:::1;::::0;;;27920:6;27899:20;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;27824:109:::0;;:::o;27093:79::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27151:6:::1;:15:::0;;;::::1;;-1:-1:-1::0;;;27151:15:0::1;-1:-1:-1::0;;;;27151:15:0;;::::1;::::0;;;::::1;::::0;;27093:79::o;26747:110::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26822:18:::1;:29:::0;;-1:-1:-1;;;;;;26822:29:0::1;-1:-1:-1::0;;;;;26822:29:0;;;::::1;::::0;;;::::1;::::0;;26747:110::o;24033:217::-;11431:1;12027:7;;:19;;12019:63;;;;-1:-1:-1;;;12019:63:0;;;;;;;:::i;:::-;11431:1;12160:7;:18;;;24133:10:::1;24119:25:::0;;:13:::1;:25;::::0;;;;;:35;-1:-1:-1;24119:35:0::1;24111:87;;;::::0;-1:-1:-1;;;24111:87:0;;13614:2:1;24111:87:0::1;::::0;::::1;13596:21:1::0;13653:2;13633:18;;;13626:30;13692:34;13672:18;;;13665:62;-1:-1:-1;;;13743:18:1;;;13736:37;13790:19;;24111:87:0::1;13412:403:1::0;24111:87:0::1;24205:39;24225:10;24237:6;24205:19;:39::i;:::-;-1:-1:-1::0;11387:1:0;12339:7;:22;24033:217::o;26863:116::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26941:18:::1;:32:::0;;-1:-1:-1;;;;;;26941:32:0::1;-1:-1:-1::0;;;;;26941:32:0;;;::::1;::::0;;;::::1;::::0;;26863:116::o;1444:94::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;1509:21:::1;1527:1;1509:9;:21::i;:::-;1444:94::o:0;27178:117::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27255:25:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;27255:34:0::1;-1:-1:-1::0;;;;27255:34:0;;::::1;::::0;;;::::1;::::0;;27178:117::o;17189:2057::-;11431:1;12027:7;;:19;;12019:63;;;;-1:-1:-1;;;12019:63:0;;;;;;;:::i;:::-;11431:1;12160:7;:18;17288:13:::1;::::0;-1:-1:-1;;;17288:13:0;::::1;;;17287:14;17279:59;;;::::0;-1:-1:-1;;;17279:59:0;;11297:2:1;17279:59:0::1;::::0;::::1;11279:21:1::0;;;11316:18;;;11309:30;11375:34;11355:18;;;11348:62;11427:18;;17279:59:0::1;11095:356:1::0;17279:59:0::1;-1:-1:-1::0;;;;;17353:28:0;::::1;;::::0;;;:24:::1;:28;::::0;;;;;::::1;;17345:84;;;;-1:-1:-1::0;;;17345:84:0::1;;;;;;;:::i;:::-;17436:13;17452:35;17475:2;17479:7;17452:22;:35::i;:::-;17436:51;;17515:5;17502:9;:18;;17494:77;;;::::0;-1:-1:-1;;;17494:77:0;;14022:2:1;17494:77:0::1;::::0;::::1;14004:21:1::0;14061:2;14041:18;;;14034:30;14100:34;14080:18;;;14073:62;-1:-1:-1;;;14151:18:1;;;14144:44;14205:19;;17494:77:0::1;13820:410:1::0;17494:77:0::1;17594:1;17586:5;:9;17578:57;;;::::0;-1:-1:-1;;;17578:57:0;;14437:2:1;17578:57:0::1;::::0;::::1;14419:21:1::0;14476:2;14456:18;;;14449:30;14515:34;14495:18;;;14488:62;-1:-1:-1;;;14566:18:1;;;14559:33;14609:19;;17578:57:0::1;14235:399:1::0;17578:57:0::1;17725:28;::::0;-1:-1:-1;;;17725:28:0;;::::1;::::0;::::1;160:25:1::0;;;17690:24:0::1;::::0;-1:-1:-1;;;;;17725:19:0;::::1;::::0;::::1;::::0;133:18:1;;17725:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17769:53;::::0;-1:-1:-1;;;17769:53:0;;-1:-1:-1;;;;;10351:15:1;;;17769:53:0::1;::::0;::::1;10333:34:1::0;17816:4:0::1;10383:18:1::0;;;10376:43;17690:64:0;;-1:-1:-1;17769:28:0;;::::1;::::0;::::1;::::0;10268:18:1;;17769:53:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17761:112;;;;-1:-1:-1::0;;;17761:112:0::1;;;;;;;:::i;:::-;17981:10;17946:24;::::0;;;;18138:27:::1;18155:2:::0;18159:5;18138:16:::1;:27::i;:::-;17999:166;;;;;;;;;;18172:27;18202:8;-1:-1:-1::0;;;;;18202:16:0::1;;18172:46;;18260:2;-1:-1:-1::0;;;;;18252:28:0::1;;18281:8;18291;18301:7;18252:57;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18316:28:0::1;::::0;-1:-1:-1;;;;;18316:17:0;::::1;::::0;-1:-1:-1;18316:28:0;::::1;;;::::0;-1:-1:-1;18334:9:0;;18316:28:::1;::::0;;;18334:9;18316:17;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;18399:28:0::1;::::0;-1:-1:-1;;;18399:28:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;18399:40:0;;::::1;::::0;:19;;::::1;::::0;::::1;::::0;133:18:1;;18399:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;18399:40:0::1;;18391:90;;;;-1:-1:-1::0;;;18391:90:0::1;;;;;;;:::i;:::-;18517:31;18539:9:::0;18517:19;:31:::1;:::i;:::-;18496:8;-1:-1:-1::0;;;;;18496:16:0::1;;:53;;18488:99;;;;-1:-1:-1::0;;;18488:99:0::1;;;;;;;:::i;:::-;18599:54;::::0;;-1:-1:-1;;;;;16352:32:1;;;16334:51;;16416:2;16401:18;;16394:34;;;18634:5:0;;18599:54;;::::1;::::0;;;::::1;::::0;::::1;::::0;16307:18:1;18599:54:0::1;;;;;;;18678:6;::::0;-1:-1:-1;;;18678:6:0;::::1;;;18674:492;;;-1:-1:-1::0;;;;;18703:20:0;;::::1;;::::0;;;:16:::1;:20;::::0;;;;;;18695:64;;18703:20;::::1;::::0;18695:64;::::1;;;::::0;18734:24;;18695:64;;18703:20;18695:64;18734:24;18703:20;18695:64;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;18776:10:0::1;::::0;18768:42:::1;::::0;-1:-1:-1;;;;;18776:10:0;;::::1;::::0;18768:42;::::1;;;::::0;18797:12;;18776:10:::1;18768:42:::0;18776:10;18768:42;18797:12;18776:10;18768:42;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;18823:16:0::1;::::0;-1:-1:-1;;;18823:16:0;::::1;;;18819:340;;;18875:19;::::0;18852:66:::1;::::0;-1:-1:-1;;;;;18875:19:0::1;18896:21:::0;18852:22:::1;:66::i;:::-;18952:18;::::0;18929:64:::1;::::0;-1:-1:-1;;;;;18952:18:0::1;18972:20:::0;18929:22:::1;:64::i;:::-;18819:340;;;19028:19;::::0;19020:60:::1;::::0;-1:-1:-1;;;;;19028:19:0;;::::1;::::0;19020:60;::::1;;;::::0;19058:21;;19028:19:::1;19020:60:::0;19028:19;19020:60;19058:21;19028:19;19020:60;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;19099:18:0::1;::::0;19091:58:::1;::::0;-1:-1:-1;;;;;19099:18:0;;::::1;::::0;19091:58;::::1;;;::::0;19128:20;;19099:18:::1;19091:58:::0;19099:18;19091:58;19128:20;19099:18;19091:58;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;18819:340;19174:34;19196:2;19200:7;19174:21;:34::i;:::-;19215:25;19228:2;19232:7;19215:12;:25::i;:::-;-1:-1:-1::0;;11387:1:0;12339:7;:22;-1:-1:-1;;;;;;;;;17189:2057:0:o;19346:619::-;19445:28;;-1:-1:-1;;;19445:28:0;;;;;160:25:1;;;-1:-1:-1;;;;;19445:19:0;;;;;133:18:1;;19445:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19431:42:0;:10;-1:-1:-1;;;;;19431:42:0;;;19423:83;;;;-1:-1:-1;;;19423:83:0;;16641:2:1;19423:83:0;;;16623:21:1;16680:2;16660:18;;;16653:30;16719;16699:18;;;16692:58;16767:18;;19423:83:0;16439:352:1;19423:83:0;19529:1;19521:5;:9;19513:46;;;;-1:-1:-1;;;19513:46:0;;16998:2:1;19513:46:0;;;16980:21:1;17037:2;17017:18;;;17010:30;-1:-1:-1;;;17056:18:1;;;17049:54;17120:18;;19513:46:0;16796:348:1;19513:46:0;19574:10;:18;:27;-1:-1:-1;19574:27:0;19566:93;;;;-1:-1:-1;;;19566:93:0;;17351:2:1;19566:93:0;;;17333:21:1;17390:2;17370:18;;;17363:30;17429:34;17409:18;;;17402:62;-1:-1:-1;;;17480:18:1;;;17473:51;17541:19;;19566:93:0;17149:417:1;19566:93:0;19681:5;;19674:50;;-1:-1:-1;;;19674:50:0;;19698:10;19674:50;;;10333:34:1;19718:4:0;10383:18:1;;;10376:43;19728:5:0;;-1:-1:-1;;;;;19681:5:0;;19674:23;;10268:18:1;;19674:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;19666:128;;;;-1:-1:-1;;;19666:128:0;;17962:2:1;19666:128:0;;;17944:21:1;18001:2;17981:18;;;17974:30;18040:34;18020:18;;;18013:62;18111:26;18091:18;;;18084:54;18155:19;;19666:128:0;17760:420:1;19666:128:0;-1:-1:-1;;;;;19801:10:0;;;;;;;:6;:10;;;;;;;;:19;;;;;;;;19826:55;;;;;;;;;;19839:15;19826:55;;;;;;;;;;;;19863:10;19826:55;;;;;;;;;;;;;19801:81;;19826:55;19801:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19801:81:0;-1:-1:-1;;;;19801:81:0;;;;;;-1:-1:-1;;;;;;19801:81:0;;;;;;;-1:-1:-1;;;;;;19801:81:0;;;;;;;;;;;;;;;;;;;;;;19894:65;;18381:51:1;;;18448:18;;;18441:34;18491:18;;18484:50;;;;19826:55:0;;19801:19;;:10;19894:65;;18354:18:1;19894:65:0;;;;;;;;19346:619;;;:::o;15596:497::-;15695:28;;-1:-1:-1;;;15695:28:0;;;;;160:25:1;;;-1:-1:-1;;;;;15695:19:0;;;;;133:18:1;;15695:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;15681:42:0;:10;-1:-1:-1;;;;;15681:42:0;;15673:93;;;;-1:-1:-1;;;15673:93:0;;18747:2:1;15673:93:0;;;18729:21:1;18786:2;18766:18;;;18759:30;18825:34;18805:18;;;18798:62;-1:-1:-1;;;18876:18:1;;;18869:36;18922:19;;15673:93:0;18545:402:1;15673:93:0;15789:1;15781:5;:9;15773:44;;;;-1:-1:-1;;;15773:44:0;;19154:2:1;15773:44:0;;;19136:21:1;19193:2;19173:18;;;19166:30;-1:-1:-1;;;19212:18:1;;;19205:52;19274:18;;15773:44:0;18952:346:1;15773:44:0;15832:55;;-1:-1:-1;;;15832:55:0;;15861:10;15832:55;;;10333:34:1;15881:4:0;10383:18:1;;;10376:43;-1:-1:-1;;;;;15832:28:0;;;;;10268:18:1;;15832:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15824:121;;;;-1:-1:-1;;;15824:121:0;;19505:2:1;15824:121:0;;;19487:21:1;19544:2;19524:18;;;19517:30;19583:34;19563:18;;;19556:62;-1:-1:-1;;;19634:18:1;;;19627:51;19695:19;;15824:121:0;19303:417:1;15824:121:0;-1:-1:-1;;;;;15952:12:0;;;;;;:8;:12;;;;;;;;:21;;;;;;;;15979:47;;;;;;;;;;15994:15;15979:47;;;;;;;;;;;;;;;;;;15952:75;;15979:47;15952:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15952:75:0;;;;;;;;;;;16039:48;160:25:1;;;15979:47:0;;15952:21;;:12;;16039:48;;133:18:1;16039:48:0;14:177:1;25626:205:0;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25714:28:0;::::1;;::::0;;;:24:::1;:28;::::0;;;;;::::1;;:37;;::::0;::::1;;;;25706:76;;;;-1:-1:-1::0;;;25706:76:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;25789:28:0;;;::::1;;::::0;;;:24:::1;:28;::::0;;;;:36;;-1:-1:-1;;25789:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;25626:205::o;20077:591::-;11431:1;12027:7;;:19;;12019:63;;;;-1:-1:-1;;;12019:63:0;;;;;;;:::i;:::-;11431:1;12160:7;:18;20205:28:::1;::::0;-1:-1:-1;;;20205:28:0;;::::1;::::0;::::1;160:25:1::0;;;-1:-1:-1;;;;;20205:19:0;::::1;::::0;::::1;::::0;133:18:1;;20205:28:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;20191:42:0::1;:10;-1:-1:-1::0;;;;;20191:42:0::1;;;20183:83;;;::::0;-1:-1:-1;;;20183:83:0;;16641:2:1;20183:83:0::1;::::0;::::1;16623:21:1::0;16680:2;16660:18;;;16653:30;16719;16699:18;;;16692:58;16767:18;;20183:83:0::1;16439:352:1::0;20183:83:0::1;20289:1;20281:5;:9;20273:46;;;::::0;-1:-1:-1;;;20273:46:0;;16998:2:1;20273:46:0::1;::::0;::::1;16980:21:1::0;17037:2;17017:18;;;17010:30;-1:-1:-1;;;17056:18:1;;;17049:54;17120:18;;20273:46:0::1;16796:348:1::0;20273:46:0::1;20347:5;20334:9;:18;;20326:87;;;::::0;-1:-1:-1;;;20326:87:0;;20282:2:1;20326:87:0::1;::::0;::::1;20264:21:1::0;20321:2;20301:18;;;20294:30;20360:34;20340:18;;;20333:62;20431:26;20411:18;;;20404:54;20475:19;;20326:87:0::1;20080:420:1::0;20326:87:0::1;20443:9;20420:19;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;20473:10:0::1;20459:25;::::0;;;:13:::1;:25;::::0;;;;:38;;20488:9:::1;::::0;20459:25;:38:::1;::::0;20488:9;;20459:38:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;20506:10:0;;::::1;;::::0;;;:6:::1;:10;::::0;;;;;;;:19;;;;;;;;20531:54;;::::1;::::0;::::1;::::0;;;;;20544:15:::1;20531:54:::0;;::::1;::::0;;;;;;;;;20568:10:::1;20531:54:::0;;;;;;;;;;;;;;20506:80;;;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;;20506:80:0;;;;::::1;;-1:-1:-1::0;;;;;;20506:80:0;;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;20506:80:0::1;-1:-1:-1::0;;;20506:80:0;::::1;;::::0;;;::::1;;::::0;;;20598:64;;18381:51:1;;;18448:18;;;18441:34;18491:18;;18484:50;20531:54:0;;20506:19;;:10;20598:64:::1;::::0;18354:18:1;20598:64:0::1;;;;;;;-1:-1:-1::0;;11387:1:0;12339:7;:22;-1:-1:-1;20077:591:0:o;25296:153::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;25362:13:::1;::::0;::::1;-1:-1:-1::0;;;25362:13:0;;::::1;;:22;;::::0;::::1;;;;25354:61;;;;-1:-1:-1::0;;;25354:61:0::1;;;;;;;:::i;:::-;25422:13;:21:::0;;;::::1;;-1:-1:-1::0;;;25422:21:0::1;-1:-1:-1::0;;;;25422:21:0;;::::1;::::0;;;::::1;::::0;;25296:153::o;20767:932::-;11431:1;12027:7;;:19;;12019:63;;;;-1:-1:-1;;;12019:63:0;;;;;;;:::i;:::-;11431:1;12160:7;:18;;;-1:-1:-1;;;;;22065:10:0;;;;:6;:10;;;;;;;;:19;;;;;;;;;20932:718:::1;20953:14:::0;;20949:18;::::1;20932:718;;;20987:8;20983:660;;;21032:5;21012:7;21020:1;21012:10;;;;;;;;:::i;:::-;;;;;;;;;;;:16;;;:25;:59;;;;;21061:10;-1:-1:-1::0;;;;;21041:30:0::1;:7;21049:1;21041:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:16;;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;21041:16:0::1;:30;21012:59;:82;;;;;21075:7;21083:1;21075:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;;;;;;;;;;21012:82;:106;;;;;21099:7;21107:1;21099:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:19:::1;:10;::::0;;::::1;;:19;::::0;::::1;;21098:20;21012:106;21008:325;;;-1:-1:-1::0;;;;;21140:10:0;::::1;;::::0;;;:6:::1;:10;::::0;;;;;;;:19;;;;;;;;:22;;21160:1;;21140:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;::::0;;::::1;;21133:29:::0;;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;-1:-1:-1;;;;;;21133:29:0;;;21175:38:::1;21195:10;21207:5:::0;21175:19:::1;:38::i;:::-;21231:71;::::0;;21264:10:::1;20701:51:1::0;;20795:14;;20788:22;20783:2;20768:18;;20761:50;21286:15:0::1;20827:18:1::0;;;20820:34;;;;21257:5:0;;21248:7;;-1:-1:-1;;;;;21231:71:0;::::1;::::0;::::1;::::0;20689:2:1;20674:18;21231:71:0::1;;;;;;;;21315:7;;;;21008:325;20983:660;;;21383:5;21363:7;21371:1;21363:10;;;;;;;;:::i;:::-;;;;;;;;;;;:16;;;:25;:59;;;;;21412:10;-1:-1:-1::0;;;;;21392:30:0::1;:7;21400:1;21392:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:16;;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;21392:16:0::1;:30;21363:59;:83;;;;;21427:7;21435:1;21427:10;;;;;;;;:::i;:::-;;;;;;;;;;;:19;;;;;;;;;;;;21426:20;21363:83;:107;;;;;21451:7;21459:1;21451:10;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;:19:::1;:10;::::0;;::::1;;:19;::::0;::::1;;21450:20;21363:107;21359:275;;;-1:-1:-1::0;;;;;21492:10:0;::::1;;::::0;;;:6:::1;:10;::::0;;;;;;;:19;;;;;;;;:22;;21512:1;;21492:22;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;21485:29:::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;21485:29:0;;;21532:71:::1;::::0;;21565:10:::1;20701:51:1::0;;20795:14;;20788:22;20768:18;;;20761:50;;;;21587:15:0::1;20827:18:1::0;;;20820:34;21558:5:0;;21549:7;;-1:-1:-1;;;;;21532:71:0;::::1;::::0;::::1;::::0;20689:2:1;20674:18;21532:71:0::1;20505:355:1::0;21359:275:0::1;20969:3:::0;::::1;::::0;::::1;:::i;:::-;;;;20932:718;;;-1:-1:-1::0;21656:37:0::1;::::0;-1:-1:-1;;;21656:37:0;;21207:2:1;21656:37:0::1;::::0;::::1;21189:21:1::0;21246:2;21226:18;;;21219:30;21285:29;21265:18;;;21258:57;21332:18;;21656:37:0::1;21005:351:1::0;12191:1:0::1;-1:-1:-1::0;;11387:1:0;12339:7;:22;-1:-1:-1;;20767:932:0:o;26224:134::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26306:3:::1;26299;:10;;26290:35;;;;-1:-1:-1::0;;;26290:35:0::1;;;;;;;:::i;:::-;26332:14;:20:::0;26224:134::o;26082:136::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26165:3:::1;26158;:10;;26149:35;;;;-1:-1:-1::0;;;26149:35:0::1;;;;;;;:::i;:::-;26191:15;:21:::0;26082:136::o;27468:126::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;27555:6:::1;-1:-1:-1::0;;;;;27548:23:0::1;;27572:7;866:6:::0;;-1:-1:-1;;;;;866:6:0;;793:87;27572:7:::1;27548:40;::::0;-1:-1:-1;;;;;;27548:40:0::1;::::0;;;;;;-1:-1:-1;;;;;16352:32:1;;;27548:40:0::1;::::0;::::1;16334:51:1::0;16401:18;;;16394:34;;;16307:18;;27548:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;26629:112::-:0;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26705:19:::1;:30:::0;;-1:-1:-1;;;;;;26705:30:0::1;-1:-1:-1::0;;;;;26705:30:0;;;::::1;::::0;;;::::1;::::0;;26629:112::o;25837:115::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25918:20:0;;::::1;;::::0;;;:16:::1;:20;::::0;;;;:28;;-1:-1:-1;;;;;;25918:28:0::1;::::0;;;::::1;;::::0;;25837:115::o;25455:165::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;25527:16:::1;::::0;::::1;-1:-1:-1::0;;;25527:16:0;;::::1;;:25;;::::0;::::1;;;;25519:64;;;;-1:-1:-1::0;;;25519:64:0::1;;;;;;;:::i;:::-;25590:16;:24:::0;;;::::1;;-1:-1:-1::0;;;25590:24:0::1;-1:-1:-1::0;;;;25590:24:0;;::::1;::::0;;;::::1;::::0;;25455:165::o;16148:239::-;-1:-1:-1;;;;;16245:12:0;;16216:4;16245:12;;;:8;:12;;;;;;;;:21;;;;;;;;:28;16284:10;16280:45;;16312:5;16305:12;;;;;16280:45;-1:-1:-1;;;;;16338:12:0;;;;;;:8;:12;;;;;;;;:21;;;;;;;;16360:9;16368:1;16360:5;:9;:::i;:::-;16338:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:38;:43;;;16148:239;-1:-1:-1;;;;16148:239:0:o;26529:94::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;26596:10:::1;:21:::0;;-1:-1:-1;;;;;;26596:21:0::1;-1:-1:-1::0;;;;;26596:21:0;;;::::1;::::0;;;::::1;::::0;;26529:94::o;25175:115::-;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25263:12:0;::::1;;::::0;;;:8:::1;:12;::::0;;;;;;;:21;;;;;;;;25256:28:::1;::::0;::::1;:::i;16456:146::-:0;16538:7;16560:30;16578:2;16582:7;16560:17;:30::i;:::-;:36;;16456:146;-1:-1:-1;;;16456:146:0:o;16665:271::-;16742:14;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16742:14:0;-1:-1:-1;;;;;28820:12:0;;16764:19;28820:12;;;:8;:12;;;;;;;;:21;;;;;;;;:28;16833:15;16825:55;;;;-1:-1:-1;;;16825:55:0;;21563:2:1;16825:55:0;;;21545:21:1;21602:2;21582:18;;;21575:30;21641:29;21621:18;;;21614:57;21688:18;;16825:55:0;21361:351:1;16825:55:0;-1:-1:-1;;;;;16894:12:0;;;;;;:8;:12;;;;;;;;:21;;;;;;;;16916:13;16928:1;16916:11;:13;:::i;:::-;16894:36;;;;;;;;:::i;:::-;;;;;;;;;;16887:43;;;;;;;;16894:36;;;;;;;16887:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16665:271:0;;;;:::o;21750:126::-;-1:-1:-1;;;;;21851:10:0;;;;;;:6;:10;;;;;;;;:19;;;;;;;;21844:26;;;;;;;;;;;;;;;;;21821:14;;21844:26;;21851:19;;21844:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21844:26:0;;;;;;;;-1:-1:-1;;;21844:26:0;;;;;;;;;;;;;;;;;;;;;1693:192;866:6;;-1:-1:-1;;;;;866:6:0;256:10;1013:23;1005:68;;;;-1:-1:-1;;;1005:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1782:22:0;::::1;1774:73;;;::::0;-1:-1:-1;;;1774:73:0;;21919:2:1;1774:73:0::1;::::0;::::1;21901:21:1::0;21958:2;21938:18;;;21931:30;21997:34;21977:18;;;21970:62;-1:-1:-1;;;22048:18:1;;;22041:36;22094:19;;1774:73:0::1;21717:402:1::0;1774:73:0::1;1858:19;1868:8;1858:9;:19::i;:::-;1693:192:::0;:::o;15045:197::-;15131:28;;-1:-1:-1;;;15131:28:0;;;;;160:25:1;;;-1:-1:-1;;;;;15131:19:0;;;;;133:18:1;;15131:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;15117:42:0;:10;-1:-1:-1;;;;;15117:42:0;;15109:95;;;;-1:-1:-1;;;15109:95:0;;22326:2:1;15109:95:0;;;22308:21:1;22365:2;22345:18;;;22338:30;22404:34;22384:18;;;22377:62;-1:-1:-1;;;22455:18:1;;;22448:38;22503:19;;15109:95:0;22124:404:1;15109:95:0;15211:25;15224:2;15228:7;15211:12;:25::i;29868:1573::-;-1:-1:-1;;;;;30027:23:0;;;;;;:13;:23;;;;;;:32;-1:-1:-1;30027:32:0;30019:88;;;;-1:-1:-1;;;30019:88:0;;22735:2:1;30019:88:0;;;22717:21:1;22774:2;22754:18;;;22747:30;22813:34;22793:18;;;22786:62;-1:-1:-1;;;22864:18:1;;;22857:41;22915:19;;30019:88:0;22533:407:1;30019:88:0;30145:5;30122:19;;:28;;30114:64;;;;-1:-1:-1;;;30114:64:0;;23147:2:1;30114:64:0;;;23129:21:1;23186:2;23166:18;;;23159:30;23225:25;23205:18;;;23198:53;23268:18;;30114:64:0;22945:347:1;30114:64:0;-1:-1:-1;;;;;30215:16:0;;;30185:27;;;;;30401;30418:2;30422:5;30401:16;:27::i;:::-;-1:-1:-1;;;;;30435:23:0;;;;;;:13;:23;;;;;:32;;30262:166;;-1:-1:-1;30262:166:0;;-1:-1:-1;30262:166:0;;-1:-1:-1;30262:166:0;;-1:-1:-1;30262:166:0;-1:-1:-1;30462:5:0;;30435:32;;30462:5;;30435:32;:::i;:::-;;;;;;;;30497:5;30474:19;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;30536:50:0;;-1:-1:-1;;;30536:50:0;;-1:-1:-1;;;;;30536:21:0;;;;;:50;;30558:8;;30568;;30578:7;;30536:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30593:28:0;;-1:-1:-1;;;;;30593:17:0;;;-1:-1:-1;30593:28:0;;;;;-1:-1:-1;30611:9:0;;30593:28;;;;30611:9;30593:17;:28;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30697:31:0;30719:9;30697:19;:31;:::i;:::-;30676:8;-1:-1:-1;;;;;30676:16:0;;:53;;30668:99;;;;-1:-1:-1;;;30668:99:0;;;;;;;:::i;:::-;30782:21;;-1:-1:-1;;;30782:21:0;;;;;160:25:1;;;-1:-1:-1;;;;;30782:33:0;;;;:12;;;;;;133:18:1;;30782:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;30782:33:0;;30774:83;;;;-1:-1:-1;;;30774:83:0;;;;;;;:::i;:::-;30869:54;;;-1:-1:-1;;;;;16352:32:1;;;16334:51;;16416:2;16401:18;;16394:34;;;30904:5:0;;30869:54;;;;;;;;;;16307:18:1;30869:54:0;;;;;;;30948:6;;-1:-1:-1;;;30948:6:0;;;;30944:492;;;-1:-1:-1;;;;;30973:20:0;;;;;;;:16;:20;;;;;;;30965:64;;30973:20;;;30965:64;;;;;31004:24;;30965:64;;30973:20;30965:64;31004:24;30973:20;30965:64;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31046:10:0;;31038:42;;-1:-1:-1;;;;;31046:10:0;;;;31038:42;;;;;31067:12;;31046:10;31038:42;31046:10;31038:42;31067:12;31046:10;31038:42;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31093:16:0;;-1:-1:-1;;;31093:16:0;;;;31089:340;;;31145:19;;31122:66;;-1:-1:-1;;;;;31145:19:0;31166:21;31122:22;:66::i;:::-;31222:18;;31199:64;;-1:-1:-1;;;;;31222:18:0;31242:20;31199:22;:64::i;:::-;31089:340;;;31298:19;;31290:60;;-1:-1:-1;;;;;31298:19:0;;;;31290:60;;;;;31328:21;;31298:19;31290:60;31298:19;31290:60;31328:21;31298:19;31290:60;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31369:18:0;;31361:58;;-1:-1:-1;;;;;31369:18:0;;;;31361:58;;;;;31398:20;;31369:18;31361:58;31369:18;31361:58;31398:20;31369:18;31361:58;;;;;;;;;;;;;;;;;;;;;31089:340;30012:1429;;;;;;29868:1573;;;;;;:::o;31447:1313::-;31618:5;;31639:28;;-1:-1:-1;;;31639:28:0;;31656:10;31639:28;;;4807:51:1;-1:-1:-1;;;;;31618:5:0;;;;31671;;31618;;31639:16;;4780:18:1;;31639:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;31631:95;;;;-1:-1:-1;;;31631:95:0;;23499:2:1;31631:95:0;;;23481:21:1;23538:2;23518:18;;;23511:30;23577:34;23557:18;;;23550:62;-1:-1:-1;;;23628:18:1;;;23621:43;23681:19;;31631:95:0;23297:409:1;31631:95:0;31741:41;;-1:-1:-1;;;31741:41:0;;-1:-1:-1;;;;;10351:15:1;;;31741:41:0;;;10333:34:1;31776:4:0;10383:18:1;;;10376:43;31786:5:0;;31741:16;;;;;;10268:18:1;;31741:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;31733:110;;;;-1:-1:-1;;;31733:110:0;;23913:2:1;31733:110:0;;;23895:21:1;23952:2;23932:18;;;23925:30;23991:34;23971:18;;;23964:62;-1:-1:-1;;;24042:18:1;;;24035:45;24097:19;;31733:110:0;23711:411:1;31733:110:0;31851:20;31873:29;31904:28;31934:32;31968:17;31989:27;32006:2;32010:5;31989:16;:27::i;:::-;31850:166;;;;;;;;;;32025:4;-1:-1:-1;;;;;32025:21:0;;32047:8;32057;32067:7;32025:50;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32082:50:0;;-1:-1:-1;;;32082:50:0;;-1:-1:-1;;;;;32082:19:0;;;-1:-1:-1;32082:19:0;;-1:-1:-1;32082:50:0;;32102:8;;32112;;32122:9;;32082:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32149:26:0;;-1:-1:-1;;;32149:26:0;;-1:-1:-1;;;;;4825:32:1;;;32149:26:0;;;4807:51:1;32179:9:0;;32149:16;;;;;;4780:18:1;;32149:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;32141:85;;;;-1:-1:-1;;;32141:85:0;;;;;;;:::i;:::-;32241:21;;-1:-1:-1;;;32241:21:0;;;;;160:25:1;;;-1:-1:-1;;;;;32241:33:0;;;;:12;;;;;;133:18:1;;32241:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;32241:33:0;;32233:83;;;;-1:-1:-1;;;32233:83:0;;;;;;;:::i;:::-;32328:54;;;-1:-1:-1;;;;;16352:32:1;;;16334:51;;16416:2;16401:18;;16394:34;;;32363:5:0;;32328:54;;;;;;;;;;16307:18:1;32328:54:0;;;;;;;32407:6;;-1:-1:-1;;;32407:6:0;;;;32403:352;;;-1:-1:-1;;;;;32459:20:0;;;;;;;:16;:20;;;;;;;;32424:82;;-1:-1:-1;;;32424:82:0;;:19;;;;;;:82;;32452:4;;32459:20;;;;;32481:24;;32424:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32550:10:0;;32515:60;;-1:-1:-1;;;32515:60:0;;-1:-1:-1;;;;;32515:19:0;;;;;;:60;;32543:4;;32550:10;;32562:12;;32515:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32619:19:0;;32584:78;;-1:-1:-1;;;32584:78:0;;-1:-1:-1;;;;;32584:19:0;;;;;;:78;;32612:4;;32619:19;;32640:21;;32584:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32706:18:0;;32671:76;;-1:-1:-1;;;32671:76:0;;-1:-1:-1;;;;;32671:19:0;;;;;;:76;;32699:4;;32706:18;;32726:20;;32671:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29212:211::-;29317:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29317:29:0;;;;;;;;;-1:-1:-1;;;29317:29:0;;;;;;;;;;;;;;29353:24;;;;29384:10;;;29317:21;29384:10;;;:6;:10;;;;;:19;;;;;;;;;;:22;;29317:29;;29384:19;29404:1;;29384:22;;;;;;:::i;:::-;;;;;;;;;;:33;;:22;;;;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29384:33:0;-1:-1:-1;;;;;;;;;29384:33:0;;;;;-1:-1:-1;;;;;;29384:33:0;;;;;;;-1:-1:-1;;;;;;29384:33:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29212:211:0:o;32976:100::-;-1:-1:-1;;;;;33051:10:0;;;;;;:6;:10;;;;;;;;:19;;;;;;;;33044:26;;;:::i;15342:198::-;-1:-1:-1;;;;;15408:12:0;;;;;;:8;:12;;;;;;;;:21;;;;;;;;15435:43;;;;;;;;;;15446:15;15435:43;;;;;;;;;;;;;;;;;;15408:71;;15435:43;15408:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15408:71:0;;;;;;;;;;;15491:43;160:25:1;;;15408:21:0;;:12;15491:43;;133:18:1;15491:43:0;;;;;;;15342:198;;:::o;29429:433::-;29533:5;29510:19;;:28;;29502:101;;;;-1:-1:-1;;;29502:101:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29618:19:0;;;;;;:13;:19;;;;;;:28;-1:-1:-1;29618:28:0;29610:101;;;;-1:-1:-1;;;29610:101:0;;;;;;;:::i;:::-;29741:5;29718:19;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;29753:19:0;;;;;;:13;:19;;;;;:28;;29776:5;;29753:19;:28;;29776:5;;29753:28;:::i;:::-;;;;-1:-1:-1;;29788:29:0;;-1:-1:-1;;;;;29788:22:0;;;:29;;;;;29811:5;;29788:29;;;;29811:5;29788:22;:29;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29829:27:0;;29850:5;;-1:-1:-1;;;;;29829:27:0;;;;;;;;29429:433;;:::o;1893:173::-;1968:6;;;-1:-1:-1;;;;;1985:17:0;;;-1:-1:-1;;;;;;1985:17:0;;;;;;;2018:40;;1968:6;;;1985:17;1968:6;;2018:40;;1949:16;;2018:40;1938:128;1893:173;:::o;27965:746::-;-1:-1:-1;;;;;28122:23:0;;28041:7;28122:23;;;:19;:23;;;;;;28041:7;;;;;;;;;;28122:28;:82;;-1:-1:-1;;;;;28181:23:0;;;;;;:19;:23;;;;;;28122:82;;;28153:25;;28122:82;28092:112;;28211:20;28252:4;28243:6;;28234;:15;;;;:::i;:::-;:22;;;;:::i;:::-;28211:45;;28263:29;28322:4;28304:15;;28295:6;:24;;;;:::i;:::-;:31;;;;:::i;:::-;28263:63;;28333:28;28390:4;28373:14;;28364:6;:23;;;;:::i;:::-;:30;;;;:::i;:::-;28333:61;-1:-1:-1;28401:32:0;28467:4;28436:28;28445:19;28436:6;:28;:::i;:::-;:35;;;;:::i;:::-;28401:70;-1:-1:-1;28478:17:0;28401:70;28547:20;28508:36;28523:21;28508:12;:36;:::i;:::-;:59;;;;:::i;:::-;:86;;;;:::i;:::-;28498:97;;:6;:97;:::i;:::-;28610:12;;28624:21;;-1:-1:-1;28647:20:0;;-1:-1:-1;28647:20:0;-1:-1:-1;28610:12:0;;-1:-1:-1;27965:746:0;-1:-1:-1;;;;;27965:746:0:o;32766:204::-;32850:12;32868:9;-1:-1:-1;;;;;32868:14:0;32888:13;;32910:6;32868:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32849:72;;;32936:7;32928:36;;;;-1:-1:-1;;;32928:36:0;;25579:2:1;32928:36:0;;;25561:21:1;25618:2;25598:18;;;25591:30;-1:-1:-1;;;25637:18:1;;;25630:46;25693:18;;32928:36:0;25377:340:1;28860:346:0;28935:22;28960:30;28978:2;28982:7;28960:17;:30::i;:::-;29057:4;29037:17;;;:24;-1:-1:-1;;;;;28820:12:0;;28997:23;28820:12;;;:8;:12;;;;;;;;:21;;;;;;;;:28;29037:17;;-1:-1:-1;29037:17:0;;29129:10;;29125:76;;-1:-1:-1;;;;;29150:12:0;;;;;;:8;:12;;;;;;;;:21;;;;;;;;29185:8;;29172:9;29180:1;29172:5;:9;:::i;:::-;29150:32;;;;;;;;:::i;:::-;;;;;;;;;;:43;;:32;;;;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29150:43:0;;;;;;;;;;29125:76;28928:278;;;28860:346;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:131:1;-1:-1:-1;;;;;271:31:1;;261:42;;251:70;;317:1;314;307:12;332:127;393:10;388:3;384:20;381:1;374:31;424:4;421:1;414:15;448:4;445:1;438:15;464:1266;559:6;567;575;583;636:3;624:9;615:7;611:23;607:33;604:53;;;653:1;650;643:12;604:53;692:9;679:23;711:31;736:5;711:31;:::i;:::-;761:5;-1:-1:-1;818:2:1;803:18;;790:32;831:33;790:32;831:33;:::i;:::-;883:7;-1:-1:-1;937:2:1;922:18;;909:32;;-1:-1:-1;992:2:1;977:18;;964:32;1015:18;1045:14;;;1042:34;;;1072:1;1069;1062:12;1042:34;1110:6;1099:9;1095:22;1085:32;;1155:7;1148:4;1144:2;1140:13;1136:27;1126:55;;1177:1;1174;1167:12;1126:55;1213:2;1200:16;1235:2;1231;1228:10;1225:36;;;1241:18;;:::i;:::-;1316:2;1310:9;1284:2;1370:13;;-1:-1:-1;;1366:22:1;;;1390:2;1362:31;1358:40;1346:53;;;1414:18;;;1434:22;;;1411:46;1408:72;;;1460:18;;:::i;:::-;1500:10;1496:2;1489:22;1535:2;1527:6;1520:18;1575:7;1570:2;1565;1561;1557:11;1553:20;1550:33;1547:53;;;1596:1;1593;1586:12;1547:53;1652:2;1647;1643;1639:11;1634:2;1626:6;1622:15;1609:46;1697:1;1692:2;1687;1679:6;1675:15;1671:24;1664:35;1718:6;1708:16;;;;;;;464:1266;;;;;;;:::o;1942:315::-;2010:6;2018;2071:2;2059:9;2050:7;2046:23;2042:32;2039:52;;;2087:1;2084;2077:12;2039:52;2126:9;2113:23;2145:31;2170:5;2145:31;:::i;:::-;2195:5;2247:2;2232:18;;;;2219:32;;-1:-1:-1;;;1942:315:1:o;2543:701::-;2762:2;2814:21;;;2884:13;;2787:18;;;2906:22;;;2733:4;;2762:2;2985:15;;;;2959:2;2944:18;;;2733:4;3028:190;3042:6;3039:1;3036:13;3028:190;;;3091:45;3132:3;3123:6;3117:13;2341:5;2335:12;2330:3;2323:25;2397:4;2390:5;2386:16;2380:23;2373:4;2368:3;2364:14;2357:47;2453:4;2446:5;2442:16;2436:23;2429:4;2424:3;2420:14;2413:47;2523:4;2516:5;2512:16;2506:23;2499:31;2492:39;2485:4;2480:3;2476:14;2469:63;;;2262:276;3091:45;3193:15;;;;3165:4;3156:14;;;;;3064:1;3057:9;3028:190;;;-1:-1:-1;3235:3:1;;2543:701;-1:-1:-1;;;;;;2543:701:1:o;3249:180::-;3308:6;3361:2;3349:9;3340:7;3336:23;3332:32;3329:52;;;3377:1;3374;3367:12;3329:52;-1:-1:-1;3400:23:1;;3249:180;-1:-1:-1;3249:180:1:o;3434:118::-;3520:5;3513:13;3506:21;3499:5;3496:32;3486:60;;3542:1;3539;3532:12;3557:661;3649:6;3657;3665;3673;3681;3734:3;3722:9;3713:7;3709:23;3705:33;3702:53;;;3751:1;3748;3741:12;3702:53;3790:9;3777:23;3809:31;3834:5;3809:31;:::i;:::-;3859:5;-1:-1:-1;3911:2:1;3896:18;;3883:32;;-1:-1:-1;3962:2:1;3947:18;;3934:32;;-1:-1:-1;4018:2:1;4003:18;;3990:32;4031:33;3990:32;4031:33;:::i;:::-;4083:7;-1:-1:-1;4142:3:1;4127:19;;4114:33;4156:30;4114:33;4156:30;:::i;:::-;4205:7;4195:17;;;3557:661;;;;;;;;:::o;4415:241::-;4471:6;4524:2;4512:9;4503:7;4499:23;4495:32;4492:52;;;4540:1;4537;4530:12;4492:52;4579:9;4566:23;4598:28;4620:5;4598:28;:::i;:::-;4645:5;4415:241;-1:-1:-1;;;4415:241:1:o;4869:247::-;4928:6;4981:2;4969:9;4960:7;4956:23;4952:32;4949:52;;;4997:1;4994;4987:12;4949:52;5036:9;5023:23;5055:31;5080:5;5055:31;:::i;5121:383::-;5198:6;5206;5214;5267:2;5255:9;5246:7;5242:23;5238:32;5235:52;;;5283:1;5280;5273:12;5235:52;5322:9;5309:23;5341:31;5366:5;5341:31;:::i;:::-;5391:5;5443:2;5428:18;;5415:32;;-1:-1:-1;5494:2:1;5479:18;;;5466:32;;5121:383;-1:-1:-1;;;5121:383:1:o;5509:382::-;5574:6;5582;5635:2;5623:9;5614:7;5610:23;5606:32;5603:52;;;5651:1;5648;5641:12;5603:52;5690:9;5677:23;5709:31;5734:5;5709:31;:::i;:::-;5759:5;-1:-1:-1;5816:2:1;5801:18;;5788:32;5829:30;5788:32;5829:30;:::i;:::-;5878:7;5868:17;;;5509:382;;;;;:::o;5896:519::-;5979:6;5987;5995;6003;6056:3;6044:9;6035:7;6031:23;6027:33;6024:53;;;6073:1;6070;6063:12;6024:53;6112:9;6099:23;6131:31;6156:5;6131:31;:::i;:::-;6181:5;-1:-1:-1;6233:2:1;6218:18;;6205:32;;-1:-1:-1;6284:2:1;6269:18;;6256:32;;-1:-1:-1;6340:2:1;6325:18;;6312:32;6353:30;6312:32;6353:30;:::i;:::-;5896:519;;;;-1:-1:-1;5896:519:1;;-1:-1:-1;;5896:519:1:o;6420:388::-;6488:6;6496;6549:2;6537:9;6528:7;6524:23;6520:32;6517:52;;;6565:1;6562;6555:12;6517:52;6604:9;6591:23;6623:31;6648:5;6623:31;:::i;:::-;6673:5;-1:-1:-1;6730:2:1;6715:18;;6702:32;6743:33;6702:32;6743:33;:::i;6813:245::-;2335:12;;2323:25;;2397:4;2386:16;;;2380:23;2364:14;;;2357:47;2453:4;2442:16;;;2436:23;2420:14;;;2413:47;2523:4;2512:16;;;2506:23;2499:31;2492:39;2476:14;;;2469:63;6995:3;6980:19;;7008:44;2262:276;7063:1055;7278:2;7330:21;;;7400:13;;7303:18;;;7422:22;;;7249:4;;7278:2;7463;;7481:18;;;;7522:15;;;7249:4;7565:527;7579:6;7576:1;7573:13;7565:527;;;7638:13;;7676:9;;7664:22;;7726:11;;;7720:18;7706:12;;;7699:40;7793:11;;;7787:18;7780:26;7773:34;7759:12;;;7752:56;7831:4;7879:11;;;7873:18;-1:-1:-1;;;;;7869:44:1;7855:12;;;7848:66;7937:4;7995:11;;;7989:18;7982:26;7975:34;7961:12;;;7954:56;7901:3;8030:14;;;;8067:15;;;;7910:1;7594:9;7565:527;;;-1:-1:-1;8109:3:1;;7063:1055;-1:-1:-1;;;;;;;7063:1055:1:o;8123:127::-;8184:10;8179:3;8175:20;8172:1;8165:31;8215:4;8212:1;8205:15;8239:4;8236:1;8229:15;8255:128;8295:3;8326:1;8322:6;8319:1;8316:13;8313:39;;;8332:18;;:::i;:::-;-1:-1:-1;8368:9:1;;8255:128::o;8388:356::-;8590:2;8572:21;;;8609:18;;;8602:30;8668:34;8663:2;8648:18;;8641:62;8735:2;8720:18;;8388:356::o;8749:335::-;8951:2;8933:21;;;8990:2;8970:18;;;8963:30;-1:-1:-1;;;9024:2:1;9009:18;;9002:41;9075:2;9060:18;;8749:335::o;9089:355::-;9291:2;9273:21;;;9330:2;9310:18;;;9303:30;9369:33;9364:2;9349:18;;9342:61;9435:2;9420:18;;9089:355::o;9449:251::-;9519:6;9572:2;9560:9;9551:7;9547:23;9543:32;9540:52;;;9588:1;9585;9578:12;9540:52;9620:9;9614:16;9639:31;9664:5;9639:31;:::i;10430:245::-;10497:6;10550:2;10538:9;10529:7;10525:23;10521:32;10518:52;;;10566:1;10563;10556:12;10518:52;10598:9;10592:16;10617:28;10639:5;10617:28;:::i;10680:410::-;10882:2;10864:21;;;10921:2;10901:18;;;10894:30;10960:34;10955:2;10940:18;;10933:62;-1:-1:-1;;;11026:2:1;11011:18;;11004:44;11080:3;11065:19;;10680:410::o;11456:407::-;11658:2;11640:21;;;11697:2;11677:18;;;11670:30;11736:34;11731:2;11716:18;;11709:62;-1:-1:-1;;;11802:2:1;11787:18;;11780:41;11853:3;11838:19;;11456:407::o;11868:125::-;11908:4;11936:1;11933;11930:8;11927:34;;;11941:18;;:::i;:::-;-1:-1:-1;11978:9:1;;11868:125::o;11998:127::-;12059:10;12054:3;12050:20;12047:1;12040:31;12090:4;12087:1;12080:15;12114:4;12111:1;12104:15;12130:136;12169:3;12197:5;12187:39;;12206:18;;:::i;:::-;-1:-1:-1;;;12242:18:1;;12130:136::o;12627:375::-;-1:-1:-1;;;;;12885:15:1;;;12867:34;;12937:15;;;;12932:2;12917:18;;12910:43;12984:2;12969:18;;12962:34;;;;12817:2;12802:18;;12627:375::o;15352:401::-;15554:2;15536:21;;;15593:2;15573:18;;;15566:30;15632:34;15627:2;15612:18;;15605:62;-1:-1:-1;;;15698:2:1;15683:18;;15676:35;15743:3;15728:19;;15352:401::o;15758:397::-;15960:2;15942:21;;;15999:2;15979:18;;;15972:30;16038:34;16033:2;16018:18;;16011:62;-1:-1:-1;;;16104:2:1;16089:18;;16082:31;16145:3;16130:19;;15758:397::o;17571:184::-;17641:6;17694:2;17682:9;17673:7;17669:23;17665:32;17662:52;;;17710:1;17707;17700:12;17662:52;-1:-1:-1;17733:16:1;;17571:184;-1:-1:-1;17571:184:1:o;19725:350::-;19927:2;19909:21;;;19966:2;19946:18;;;19939:30;20005:28;20000:2;19985:18;;19978:56;20066:2;20051:18;;19725:350::o;20865:135::-;20904:3;-1:-1:-1;;20925:17:1;;20922:43;;;20945:18;;:::i;:::-;-1:-1:-1;20992:1:1;20981:13;;20865:135::o;24343:424::-;24545:2;24527:21;;;24584:2;24564:18;;;24557:30;24623:34;24618:2;24603:18;;24596:62;24694:30;24689:2;24674:18;;24667:58;24757:3;24742:19;;24343:424::o;24772:168::-;24812:7;24878:1;24874;24870:6;24866:14;24863:1;24860:21;24855:1;24848:9;24841:17;24837:45;24834:71;;;24885:18;;:::i;:::-;-1:-1:-1;24925:9:1;;24772:168::o;24945:217::-;24985:1;25011;25001:132;;25055:10;25050:3;25046:20;25043:1;25036:31;25090:4;25087:1;25080:15;25118:4;25115:1;25108:15;25001:132;-1:-1:-1;25147:9:1;;24945:217::o
Swarm Source
ipfs://cdf6b65489a70c82d48404d87ec9ac89381263fd3f4eca1683ade85385b0eb29
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.