ERC-721
Overview
Max Total Supply
47,317,184.652700985681347942 veNFT
Holders
2,632
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
0.000000000000000005 veNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
ve
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2022-02-10 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.11; /** @title Voting Escrow @author Curve Finance @license MIT @notice Votes have a weight depending on time, so that users are committed to the future of (whatever they are voting for) @dev Vote weight decays linearly over time. Lock time cannot be more than `MAXTIME` (4 years). # Voting escrow to have time-weighted votes # Votes have a weight depending on time, so that users are committed # to the future of (whatever they are voting for). # The weight in this implementation is linear, and lock cannot be more than maxtime: # w ^ # 1 + / # | / # | / # | / # |/ # 0 +--------+------> time # maxtime (4 years?) */ /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint len = data.length; if (len == 0) return ""; // multiply by 4/3 rounded up uint encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for { let i := 0 } lt(i, len) { } { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint 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 (uint balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint 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, uint 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, uint 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, uint tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint 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, uint tokenId, bytes calldata data ) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint tokenId) external view returns (string memory); } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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, uint 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, uint amount ) external returns (bool); } struct Point { int128 bias; int128 slope; // # -dweight / dt uint ts; uint blk; // block } /* We cannot really do block numbers per se b/c slope is per time, not per block * and per block could be fairly bad b/c Ethereum changes blocktimes. * What we can do is to extrapolate ***At functions */ struct LockedBalance { int128 amount; uint end; } contract ve is IERC721, IERC721Metadata { enum DepositType { DEPOSIT_FOR_TYPE, CREATE_LOCK_TYPE, INCREASE_LOCK_AMOUNT, INCREASE_UNLOCK_TIME, MERGE_TYPE } event Deposit( address indexed provider, uint tokenId, uint value, uint indexed locktime, DepositType deposit_type, uint ts ); event Withdraw(address indexed provider, uint tokenId, uint value, uint ts); event Supply(uint prevSupply, uint supply); uint internal constant WEEK = 1 weeks; uint internal constant MAXTIME = 4 * 365 * 86400; int128 internal constant iMAXTIME = 4 * 365 * 86400; uint internal constant MULTIPLIER = 1 ether; address immutable public token; uint public supply; mapping(uint => LockedBalance) public locked; mapping(uint => uint) public ownership_change; uint public epoch; mapping(uint => Point) public point_history; // epoch -> unsigned point mapping(uint => Point[1000000000]) public user_point_history; // user -> Point[user_epoch] mapping(uint => uint) public user_point_epoch; mapping(uint => int128) public slope_changes; // time -> signed slope change mapping(uint => uint) public attachments; mapping(uint => bool) public voted; address public voter; string constant public name = "veNFT"; string constant public symbol = "veNFT"; string constant public version = "1.0.0"; uint8 constant public decimals = 18; /// @dev Current count of token uint internal tokenId; /// @dev Mapping from NFT ID to the address that owns it. mapping(uint => address) internal idToOwner; /// @dev Mapping from NFT ID to approved address. mapping(uint => address) internal idToApprovals; /// @dev Mapping from owner address to count of his tokens. mapping(address => uint) internal ownerToNFTokenCount; /// @dev Mapping from owner address to mapping of index to tokenIds mapping(address => mapping(uint => uint)) internal ownerToNFTokenIdList; /// @dev Mapping from NFT ID to index of owner mapping(uint => uint) internal tokenToOwnerIndex; /// @dev Mapping from owner address to mapping of operator addresses. mapping(address => mapping(address => bool)) internal ownerToOperators; /// @dev Mapping of interface id to bool about whether or not it's supported mapping(bytes4 => bool) internal supportedInterfaces; /// @dev ERC165 interface ID of ERC165 bytes4 internal constant ERC165_INTERFACE_ID = 0x01ffc9a7; /// @dev ERC165 interface ID of ERC721 bytes4 internal constant ERC721_INTERFACE_ID = 0x80ac58cd; /// @dev ERC165 interface ID of ERC721Metadata bytes4 internal constant ERC721_METADATA_INTERFACE_ID = 0x5b5e139f; /// @dev reentrancy guard uint8 internal constant _not_entered = 1; uint8 internal constant _entered = 2; uint8 internal _entered_state = 1; modifier nonreentrant() { require(_entered_state == _not_entered); _entered_state = _entered; _; _entered_state = _not_entered; } /// @notice Contract constructor /// @param token_addr `ERC20CRV` token address constructor( address token_addr ) { token = token_addr; voter = msg.sender; point_history[0].blk = block.number; point_history[0].ts = block.timestamp; supportedInterfaces[ERC165_INTERFACE_ID] = true; supportedInterfaces[ERC721_INTERFACE_ID] = true; supportedInterfaces[ERC721_METADATA_INTERFACE_ID] = true; // mint-ish emit Transfer(address(0), address(this), tokenId); // burn-ish emit Transfer(address(this), address(0), tokenId); } /// @dev Interface identification is specified in ERC-165. /// @param _interfaceID Id of the interface function supportsInterface(bytes4 _interfaceID) external view returns (bool) { return supportedInterfaces[_interfaceID]; } /// @notice Get the most recently recorded rate of voting power decrease for `_tokenId` /// @param _tokenId token of the NFT /// @return Value of the slope function get_last_user_slope(uint _tokenId) external view returns (int128) { uint uepoch = user_point_epoch[_tokenId]; return user_point_history[_tokenId][uepoch].slope; } /// @notice Get the timestamp for checkpoint `_idx` for `_tokenId` /// @param _tokenId token of the NFT /// @param _idx User epoch number /// @return Epoch time of the checkpoint function user_point_history__ts(uint _tokenId, uint _idx) external view returns (uint) { return user_point_history[_tokenId][_idx].ts; } /// @notice Get timestamp when `_tokenId`'s lock finishes /// @param _tokenId User NFT /// @return Epoch time of the lock end function locked__end(uint _tokenId) external view returns (uint) { return locked[_tokenId].end; } /// @dev Returns the number of NFTs owned by `_owner`. /// Throws if `_owner` is the zero address. NFTs assigned to the zero address are considered invalid. /// @param _owner Address for whom to query the balance. function _balance(address _owner) internal view returns (uint) { return ownerToNFTokenCount[_owner]; } /// @dev Returns the number of NFTs owned by `_owner`. /// Throws if `_owner` is the zero address. NFTs assigned to the zero address are considered invalid. /// @param _owner Address for whom to query the balance. function balanceOf(address _owner) external view returns (uint) { return _balance(_owner); } /// @dev Returns the address of the owner of the NFT. /// @param _tokenId The identifier for an NFT. function ownerOf(uint _tokenId) public view returns (address) { return idToOwner[_tokenId]; } /// @dev Get the approved address for a single NFT. /// @param _tokenId ID of the NFT to query the approval of. function getApproved(uint _tokenId) external view returns (address) { return idToApprovals[_tokenId]; } /// @dev Checks if `_operator` is an approved operator for `_owner`. /// @param _owner The address that owns the NFTs. /// @param _operator The address that acts on behalf of the owner. function isApprovedForAll(address _owner, address _operator) external view returns (bool) { return (ownerToOperators[_owner])[_operator]; } /// @dev Get token by index function tokenOfOwnerByIndex(address _owner, uint _tokenIndex) external view returns (uint) { return ownerToNFTokenIdList[_owner][_tokenIndex]; } /// @dev Returns whether the given spender can transfer a given token ID /// @param _spender address of the spender to query /// @param _tokenId uint ID of the token to be transferred /// @return bool whether the msg.sender is approved for the given token ID, is an operator of the owner, or is the owner of the token function _isApprovedOrOwner(address _spender, uint _tokenId) internal view returns (bool) { address owner = idToOwner[_tokenId]; bool spenderIsOwner = owner == _spender; bool spenderIsApproved = _spender == idToApprovals[_tokenId]; bool spenderIsApprovedForAll = (ownerToOperators[owner])[_spender]; return spenderIsOwner || spenderIsApproved || spenderIsApprovedForAll; } function isApprovedOrOwner(address _spender, uint _tokenId) external view returns (bool) { return _isApprovedOrOwner(_spender, _tokenId); } /// @dev Add a NFT to an index mapping to a given address /// @param _to address of the receiver /// @param _tokenId uint ID Of the token to be added function _addTokenToOwnerList(address _to, uint _tokenId) internal { uint current_count = _balance(_to); ownerToNFTokenIdList[_to][current_count] = _tokenId; tokenToOwnerIndex[_tokenId] = current_count; } /// @dev Remove a NFT from an index mapping to a given address /// @param _from address of the sender /// @param _tokenId uint ID Of the token to be removed function _removeTokenFromOwnerList(address _from, uint _tokenId) internal { // Delete uint current_count = _balance(_from)-1; uint current_index = tokenToOwnerIndex[_tokenId]; if (current_count == current_index) { // update ownerToNFTokenIdList ownerToNFTokenIdList[_from][current_count] = 0; // update tokenToOwnerIndex tokenToOwnerIndex[_tokenId] = 0; } else { uint lastTokenId = ownerToNFTokenIdList[_from][current_count]; // Add // update ownerToNFTokenIdList ownerToNFTokenIdList[_from][current_index] = lastTokenId; // update tokenToOwnerIndex tokenToOwnerIndex[lastTokenId] = current_index; // Delete // update ownerToNFTokenIdList ownerToNFTokenIdList[_from][current_count] = 0; // update tokenToOwnerIndex tokenToOwnerIndex[_tokenId] = 0; } } /// @dev Add a NFT to a given address /// Throws if `_tokenId` is owned by someone. function _addTokenTo(address _to, uint _tokenId) internal { // Throws if `_tokenId` is owned by someone assert(idToOwner[_tokenId] == address(0)); // Change the owner idToOwner[_tokenId] = _to; // Update owner token index tracking _addTokenToOwnerList(_to, _tokenId); // Change count tracking ownerToNFTokenCount[_to] += 1; } /// @dev Remove a NFT from a given address /// Throws if `_from` is not the current owner. function _removeTokenFrom(address _from, uint _tokenId) internal { // Throws if `_from` is not the current owner assert(idToOwner[_tokenId] == _from); // Change the owner idToOwner[_tokenId] = address(0); // Update owner token index tracking _removeTokenFromOwnerList(_from, _tokenId); // Change count tracking ownerToNFTokenCount[_from] -= 1; } /// @dev Clear an approval of a given address /// Throws if `_owner` is not the current owner. function _clearApproval(address _owner, uint _tokenId) internal { // Throws if `_owner` is not the current owner assert(idToOwner[_tokenId] == _owner); if (idToApprovals[_tokenId] != address(0)) { // Reset approvals idToApprovals[_tokenId] = address(0); } } /// @dev Exeute transfer of a NFT. /// Throws unless `msg.sender` is the current owner, an authorized operator, or the approved /// address for this NFT. (NOTE: `msg.sender` not allowed in internal function so pass `_sender`.) /// Throws if `_to` is the zero address. /// Throws if `_from` is not the current owner. /// Throws if `_tokenId` is not a valid NFT. function _transferFrom( address _from, address _to, uint _tokenId, address _sender ) internal { require(attachments[_tokenId] == 0 && !voted[_tokenId], "attached"); // Check requirements require(_isApprovedOrOwner(_sender, _tokenId)); // Clear approval. Throws if `_from` is not the current owner _clearApproval(_from, _tokenId); // Remove NFT. Throws if `_tokenId` is not a valid NFT _removeTokenFrom(_from, _tokenId); // Add NFT _addTokenTo(_to, _tokenId); // Set the block of ownership transfer (for Flash NFT protection) ownership_change[_tokenId] = block.number; // Log the transfer emit Transfer(_from, _to, _tokenId); } /* TRANSFER FUNCTIONS */ /// @dev Throws unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT. /// Throws if `_from` is not the current owner. /// Throws if `_to` is the zero address. /// Throws if `_tokenId` is not a valid NFT. /// @notice The caller is responsible to confirm that `_to` is capable of receiving NFTs or else /// they maybe be permanently lost. /// @param _from The current owner of the NFT. /// @param _to The new owner. /// @param _tokenId The NFT to transfer. function transferFrom( address _from, address _to, uint _tokenId ) external { _transferFrom(_from, _to, _tokenId, msg.sender); } function _isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint size; assembly { size := extcodesize(account) } return size > 0; } /// @dev Transfers the ownership of an NFT from one address to another address. /// Throws unless `msg.sender` is the current owner, an authorized operator, or the /// approved address for this NFT. /// Throws if `_from` is not the current owner. /// Throws if `_to` is the zero address. /// Throws if `_tokenId` is not a valid NFT. /// If `_to` is a smart contract, it calls `onERC721Received` on `_to` and throws if /// the return value is not `bytes4(keccak256("onERC721Received(address,address,uint,bytes)"))`. /// @param _from The current owner of the NFT. /// @param _to The new owner. /// @param _tokenId The NFT to transfer. /// @param _data Additional data with no specified format, sent in call to `_to`. function safeTransferFrom( address _from, address _to, uint _tokenId, bytes memory _data ) public { _transferFrom(_from, _to, _tokenId, msg.sender); if (_isContract(_to)) { // Throws if transfer destination is a contract which does not implement 'onERC721Received' try IERC721Receiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data) returns (bytes4) {} catch ( bytes memory reason ) { if (reason.length == 0) { revert('ERC721: transfer to non ERC721Receiver implementer'); } else { assembly { revert(add(32, reason), mload(reason)) } } } } } /// @dev Transfers the ownership of an NFT from one address to another address. /// Throws unless `msg.sender` is the current owner, an authorized operator, or the /// approved address for this NFT. /// Throws if `_from` is not the current owner. /// Throws if `_to` is the zero address. /// Throws if `_tokenId` is not a valid NFT. /// If `_to` is a smart contract, it calls `onERC721Received` on `_to` and throws if /// the return value is not `bytes4(keccak256("onERC721Received(address,address,uint,bytes)"))`. /// @param _from The current owner of the NFT. /// @param _to The new owner. /// @param _tokenId The NFT to transfer. function safeTransferFrom( address _from, address _to, uint _tokenId ) external { safeTransferFrom(_from, _to, _tokenId, ''); } /// @dev Set or reaffirm the approved address for an NFT. The zero address indicates there is no approved address. /// Throws unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner. /// Throws if `_tokenId` is not a valid NFT. (NOTE: This is not written the EIP) /// Throws if `_approved` is the current owner. (NOTE: This is not written the EIP) /// @param _approved Address to be approved for the given NFT ID. /// @param _tokenId ID of the token to be approved. function approve(address _approved, uint _tokenId) public { address owner = idToOwner[_tokenId]; // Throws if `_tokenId` is not a valid NFT require(owner != address(0)); // Throws if `_approved` is the current owner require(_approved != owner); // Check requirements bool senderIsOwner = (idToOwner[_tokenId] == msg.sender); bool senderIsApprovedForAll = (ownerToOperators[owner])[msg.sender]; require(senderIsOwner || senderIsApprovedForAll); // Set the approval idToApprovals[_tokenId] = _approved; emit Approval(owner, _approved, _tokenId); } /// @dev Enables or disables approval for a third party ("operator") to manage all of /// `msg.sender`'s assets. It also emits the ApprovalForAll event. /// Throws if `_operator` is the `msg.sender`. (NOTE: This is not written the EIP) /// @notice This works even if sender doesn't own any tokens at the time. /// @param _operator Address to add to the set of authorized operators. /// @param _approved True if the operators is approved, false to revoke approval. function setApprovalForAll(address _operator, bool _approved) external { // Throws if `_operator` is the `msg.sender` assert(_operator != msg.sender); ownerToOperators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /// @dev Function to mint tokens /// Throws if `_to` is zero address. /// Throws if `_tokenId` is owned by someone. /// @param _to The address that will receive the minted tokens. /// @param _tokenId The token id to mint. /// @return A boolean that indicates if the operation was successful. function _mint(address _to, uint _tokenId) internal returns (bool) { // Throws if `_to` is zero address assert(_to != address(0)); // Add NFT. Throws if `_tokenId` is owned by someone _addTokenTo(_to, _tokenId); emit Transfer(address(0), _to, _tokenId); return true; } /// @notice Record global and per-user data to checkpoint /// @param _tokenId NFT token ID. No user checkpoint if 0 /// @param old_locked Pevious locked amount / end lock time for the user /// @param new_locked New locked amount / end lock time for the user function _checkpoint( uint _tokenId, LockedBalance memory old_locked, LockedBalance memory new_locked ) internal { Point memory u_old; Point memory u_new; int128 old_dslope = 0; int128 new_dslope = 0; uint _epoch = epoch; if (_tokenId != 0) { // Calculate slopes and biases // Kept at zero when they have to if (old_locked.end > block.timestamp && old_locked.amount > 0) { u_old.slope = old_locked.amount / iMAXTIME; u_old.bias = u_old.slope * int128(int256(old_locked.end - block.timestamp)); } if (new_locked.end > block.timestamp && new_locked.amount > 0) { u_new.slope = new_locked.amount / iMAXTIME; u_new.bias = u_new.slope * int128(int256(new_locked.end - block.timestamp)); } // Read values of scheduled changes in the slope // old_locked.end can be in the past and in the future // new_locked.end can ONLY by in the FUTURE unless everything expired: than zeros old_dslope = slope_changes[old_locked.end]; if (new_locked.end != 0) { if (new_locked.end == old_locked.end) { new_dslope = old_dslope; } else { new_dslope = slope_changes[new_locked.end]; } } } Point memory last_point = Point({bias: 0, slope: 0, ts: block.timestamp, blk: block.number}); if (_epoch > 0) { last_point = point_history[_epoch]; } uint last_checkpoint = last_point.ts; // initial_last_point is used for extrapolation to calculate block number // (approximately, for *At methods) and save them // as we cannot figure that out exactly from inside the contract Point memory initial_last_point = last_point; uint block_slope = 0; // dblock/dt if (block.timestamp > last_point.ts) { block_slope = (MULTIPLIER * (block.number - last_point.blk)) / (block.timestamp - last_point.ts); } // If last point is already recorded in this block, slope=0 // But that's ok b/c we know the block in such case // Go over weeks to fill history and calculate what the current point is { uint t_i = (last_checkpoint / WEEK) * WEEK; for (uint i = 0; i < 255; ++i) { // Hopefully it won't happen that this won't get used in 5 years! // If it does, users will be able to withdraw but vote weight will be broken t_i += WEEK; int128 d_slope = 0; if (t_i > block.timestamp) { t_i = block.timestamp; } else { d_slope = slope_changes[t_i]; } last_point.bias -= last_point.slope * int128(int256(t_i - last_checkpoint)); last_point.slope += d_slope; if (last_point.bias < 0) { // This can happen last_point.bias = 0; } if (last_point.slope < 0) { // This cannot happen - just in case last_point.slope = 0; } last_checkpoint = t_i; last_point.ts = t_i; last_point.blk = initial_last_point.blk + (block_slope * (t_i - initial_last_point.ts)) / MULTIPLIER; _epoch += 1; if (t_i == block.timestamp) { last_point.blk = block.number; break; } else { point_history[_epoch] = last_point; } } } epoch = _epoch; // Now point_history is filled until t=now if (_tokenId != 0) { // If last point was in this block, the slope change has been applied already // But in such case we have 0 slope(s) last_point.slope += (u_new.slope - u_old.slope); last_point.bias += (u_new.bias - u_old.bias); if (last_point.slope < 0) { last_point.slope = 0; } if (last_point.bias < 0) { last_point.bias = 0; } } // Record the changed point into history point_history[_epoch] = last_point; if (_tokenId != 0) { // Schedule the slope changes (slope is going down) // We subtract new_user_slope from [new_locked.end] // and add old_user_slope to [old_locked.end] if (old_locked.end > block.timestamp) { // old_dslope was <something> - u_old.slope, so we cancel that old_dslope += u_old.slope; if (new_locked.end == old_locked.end) { old_dslope -= u_new.slope; // It was a new deposit, not extension } slope_changes[old_locked.end] = old_dslope; } if (new_locked.end > block.timestamp) { if (new_locked.end > old_locked.end) { new_dslope -= u_new.slope; // old slope disappeared at this point slope_changes[new_locked.end] = new_dslope; } // else: we recorded it already in old_dslope } // Now handle user history uint user_epoch = user_point_epoch[_tokenId] + 1; user_point_epoch[_tokenId] = user_epoch; u_new.ts = block.timestamp; u_new.blk = block.number; user_point_history[_tokenId][user_epoch] = u_new; } } /// @notice Deposit and lock tokens for a user /// @param _tokenId NFT that holds lock /// @param _value Amount to deposit /// @param unlock_time New time when to unlock the tokens, or 0 if unchanged /// @param locked_balance Previous locked amount / timestamp /// @param deposit_type The type of deposit function _deposit_for( uint _tokenId, uint _value, uint unlock_time, LockedBalance memory locked_balance, DepositType deposit_type ) internal { LockedBalance memory _locked = locked_balance; uint supply_before = supply; supply = supply_before + _value; LockedBalance memory old_locked; (old_locked.amount, old_locked.end) = (_locked.amount, _locked.end); // Adding to existing lock, or if a lock is expired - creating a new one _locked.amount += int128(int256(_value)); if (unlock_time != 0) { _locked.end = unlock_time; } locked[_tokenId] = _locked; // Possibilities: // Both old_locked.end could be current or expired (>/< block.timestamp) // value == 0 (extend lock) or value > 0 (add to lock or extend lock) // _locked.end > block.timestamp (always) _checkpoint(_tokenId, old_locked, _locked); address from = msg.sender; if (_value != 0 && deposit_type != DepositType.MERGE_TYPE) { assert(IERC20(token).transferFrom(from, address(this), _value)); } emit Deposit(from, _tokenId, _value, _locked.end, deposit_type, block.timestamp); emit Supply(supply_before, supply_before + _value); } function setVoter(address _voter) external { require(msg.sender == voter); voter = _voter; } function voting(uint _tokenId) external { require(msg.sender == voter); voted[_tokenId] = true; } function abstain(uint _tokenId) external { require(msg.sender == voter); voted[_tokenId] = false; } function attach(uint _tokenId) external { require(msg.sender == voter); attachments[_tokenId] = attachments[_tokenId]+1; } function detach(uint _tokenId) external { require(msg.sender == voter); attachments[_tokenId] = attachments[_tokenId]-1; } function merge(uint _from, uint _to) external { require(attachments[_from] == 0 && !voted[_from], "attached"); require(_from != _to); require(_isApprovedOrOwner(msg.sender, _from)); require(_isApprovedOrOwner(msg.sender, _to)); LockedBalance memory _locked0 = locked[_from]; LockedBalance memory _locked1 = locked[_to]; uint value0 = uint(int256(_locked0.amount)); uint end = _locked0.end >= _locked1.end ? _locked0.end : _locked1.end; locked[_from] = LockedBalance(0, 0); _checkpoint(_from, _locked0, LockedBalance(0, 0)); _burn(_from); _deposit_for(_to, value0, end, _locked1, DepositType.MERGE_TYPE); } function block_number() external view returns (uint) { return block.number; } /// @notice Record global data to checkpoint function checkpoint() external { _checkpoint(0, LockedBalance(0, 0), LockedBalance(0, 0)); } /// @notice Deposit `_value` tokens for `_tokenId` and add to the lock /// @dev Anyone (even a smart contract) can deposit for someone else, but /// cannot extend their locktime and deposit for a brand new user /// @param _tokenId lock NFT /// @param _value Amount to add to user's lock function deposit_for(uint _tokenId, uint _value) external nonreentrant { LockedBalance memory _locked = locked[_tokenId]; require(_value > 0); // dev: need non-zero value require(_locked.amount > 0, 'No existing lock found'); require(_locked.end > block.timestamp, 'Cannot add to expired lock. Withdraw'); _deposit_for(_tokenId, _value, 0, _locked, DepositType.DEPOSIT_FOR_TYPE); } /// @notice Deposit `_value` tokens for `_to` and lock for `_lock_duration` /// @param _value Amount to deposit /// @param _lock_duration Number of seconds to lock tokens for (rounded down to nearest week) /// @param _to Address to deposit function _create_lock(uint _value, uint _lock_duration, address _to) internal returns (uint) { uint unlock_time = (block.timestamp + _lock_duration) / WEEK * WEEK; // Locktime is rounded down to weeks require(_value > 0); // dev: need non-zero value require(unlock_time > block.timestamp, 'Can only lock until time in the future'); require(unlock_time <= block.timestamp + MAXTIME, 'Voting lock can be 4 years max'); ++tokenId; uint _tokenId = tokenId; _mint(_to, _tokenId); _deposit_for(_tokenId, _value, unlock_time, locked[_tokenId], DepositType.CREATE_LOCK_TYPE); return _tokenId; } /// @notice Deposit `_value` tokens for `_to` and lock for `_lock_duration` /// @param _value Amount to deposit /// @param _lock_duration Number of seconds to lock tokens for (rounded down to nearest week) /// @param _to Address to deposit function create_lock_for(uint _value, uint _lock_duration, address _to) external nonreentrant returns (uint) { return _create_lock(_value, _lock_duration, _to); } /// @notice Deposit `_value` tokens for `msg.sender` and lock for `_lock_duration` /// @param _value Amount to deposit /// @param _lock_duration Number of seconds to lock tokens for (rounded down to nearest week) function create_lock(uint _value, uint _lock_duration) external nonreentrant returns (uint) { return _create_lock(_value, _lock_duration, msg.sender); } /// @notice Deposit `_value` additional tokens for `_tokenId` without modifying the unlock time /// @param _value Amount of tokens to deposit and add to the lock function increase_amount(uint _tokenId, uint _value) external nonreentrant { assert(_isApprovedOrOwner(msg.sender, _tokenId)); LockedBalance memory _locked = locked[_tokenId]; assert(_value > 0); // dev: need non-zero value require(_locked.amount > 0, 'No existing lock found'); require(_locked.end > block.timestamp, 'Cannot add to expired lock. Withdraw'); _deposit_for(_tokenId, _value, 0, _locked, DepositType.INCREASE_LOCK_AMOUNT); } /// @notice Extend the unlock time for `_tokenId` /// @param _lock_duration New number of seconds until tokens unlock function increase_unlock_time(uint _tokenId, uint _lock_duration) external nonreentrant { assert(_isApprovedOrOwner(msg.sender, _tokenId)); LockedBalance memory _locked = locked[_tokenId]; uint unlock_time = (block.timestamp + _lock_duration) / WEEK * WEEK; // Locktime is rounded down to weeks require(_locked.end > block.timestamp, 'Lock expired'); require(_locked.amount > 0, 'Nothing is locked'); require(unlock_time > _locked.end, 'Can only increase lock duration'); require(unlock_time <= block.timestamp + MAXTIME, 'Voting lock can be 4 years max'); _deposit_for(_tokenId, 0, unlock_time, _locked, DepositType.INCREASE_UNLOCK_TIME); } /// @notice Withdraw all tokens for `_tokenId` /// @dev Only possible if the lock has expired function withdraw(uint _tokenId) external nonreentrant { assert(_isApprovedOrOwner(msg.sender, _tokenId)); require(attachments[_tokenId] == 0 && !voted[_tokenId], "attached"); LockedBalance memory _locked = locked[_tokenId]; require(block.timestamp >= _locked.end, "The lock didn't expire"); uint value = uint(int256(_locked.amount)); locked[_tokenId] = LockedBalance(0,0); uint supply_before = supply; supply = supply_before - value; // old_locked can have either expired <= timestamp or zero end // _locked has only 0 end // Both can have >= 0 amount _checkpoint(_tokenId, _locked, LockedBalance(0,0)); assert(IERC20(token).transfer(msg.sender, value)); // Burn the NFT _burn(_tokenId); emit Withdraw(msg.sender, _tokenId, value, block.timestamp); emit Supply(supply_before, supply_before - value); } // The following ERC20/minime-compatible methods are not real balanceOf and supply! // They measure the weights for the purpose of voting, so they don't represent // real coins. /// @notice Binary search to estimate timestamp for block number /// @param _block Block to find /// @param max_epoch Don't go beyond this epoch /// @return Approximate timestamp for block function _find_block_epoch(uint _block, uint max_epoch) internal view returns (uint) { // Binary search uint _min = 0; uint _max = max_epoch; for (uint i = 0; i < 128; ++i) { // Will be always enough for 128-bit numbers if (_min >= _max) { break; } uint _mid = (_min + _max + 1) / 2; if (point_history[_mid].blk <= _block) { _min = _mid; } else { _max = _mid - 1; } } return _min; } /// @notice Get the current voting power for `_tokenId` /// @dev Adheres to the ERC20 `balanceOf` interface for Aragon compatibility /// @param _tokenId NFT for lock /// @param _t Epoch time to return voting power at /// @return User voting power function _balanceOfNFT(uint _tokenId, uint _t) internal view returns (uint) { uint _epoch = user_point_epoch[_tokenId]; if (_epoch == 0) { return 0; } else { Point memory last_point = user_point_history[_tokenId][_epoch]; last_point.bias -= last_point.slope * int128(int256(_t) - int256(last_point.ts)); if (last_point.bias < 0) { last_point.bias = 0; } return uint(int256(last_point.bias)); } } /// @dev Returns current token URI metadata /// @param _tokenId Token ID to fetch URI for. function tokenURI(uint _tokenId) external view returns (string memory) { require(idToOwner[_tokenId] != address(0), "Query for nonexistent token"); LockedBalance memory _locked = locked[_tokenId]; return _tokenURI( _tokenId, _balanceOfNFT(_tokenId, block.timestamp), _locked.end, uint(int256(_locked.amount)) ); } function balanceOfNFT(uint _tokenId) external view returns (uint) { if (ownership_change[_tokenId] == block.number) return 0; return _balanceOfNFT(_tokenId, block.timestamp); } function balanceOfNFTAt(uint _tokenId, uint _t) external view returns (uint) { return _balanceOfNFT(_tokenId, _t); } /// @notice Measure voting power of `_tokenId` at block height `_block` /// @dev Adheres to MiniMe `balanceOfAt` interface: https://github.com/Giveth/minime /// @param _tokenId User's wallet NFT /// @param _block Block to calculate the voting power at /// @return Voting power function _balanceOfAtNFT(uint _tokenId, uint _block) internal view returns (uint) { // Copying and pasting totalSupply code because Vyper cannot pass by // reference yet assert(_block <= block.number); // Binary search uint _min = 0; uint _max = user_point_epoch[_tokenId]; for (uint i = 0; i < 128; ++i) { // Will be always enough for 128-bit numbers if (_min >= _max) { break; } uint _mid = (_min + _max + 1) / 2; if (user_point_history[_tokenId][_mid].blk <= _block) { _min = _mid; } else { _max = _mid - 1; } } Point memory upoint = user_point_history[_tokenId][_min]; uint max_epoch = epoch; uint _epoch = _find_block_epoch(_block, max_epoch); Point memory point_0 = point_history[_epoch]; uint d_block = 0; uint d_t = 0; if (_epoch < max_epoch) { Point memory point_1 = point_history[_epoch + 1]; d_block = point_1.blk - point_0.blk; d_t = point_1.ts - point_0.ts; } else { d_block = block.number - point_0.blk; d_t = block.timestamp - point_0.ts; } uint block_time = point_0.ts; if (d_block != 0) { block_time += (d_t * (_block - point_0.blk)) / d_block; } upoint.bias -= upoint.slope * int128(int256(block_time - upoint.ts)); if (upoint.bias >= 0) { return uint(uint128(upoint.bias)); } else { return 0; } } function balanceOfAtNFT(uint _tokenId, uint _block) external view returns (uint) { return _balanceOfAtNFT(_tokenId, _block); } /// @notice Calculate total voting power at some point in the past /// @param point The point (bias/slope) to start search from /// @param t Time to calculate the total voting power at /// @return Total voting power at that time function _supply_at(Point memory point, uint t) internal view returns (uint) { Point memory last_point = point; uint t_i = (last_point.ts / WEEK) * WEEK; for (uint i = 0; i < 255; ++i) { t_i += WEEK; int128 d_slope = 0; if (t_i > t) { t_i = t; } else { d_slope = slope_changes[t_i]; } last_point.bias -= last_point.slope * int128(int256(t_i - last_point.ts)); if (t_i == t) { break; } last_point.slope += d_slope; last_point.ts = t_i; } if (last_point.bias < 0) { last_point.bias = 0; } return uint(uint128(last_point.bias)); } /// @notice Calculate total voting power /// @dev Adheres to the ERC20 `totalSupply` interface for Aragon compatibility /// @return Total voting power function totalSupplyAtT(uint t) public view returns (uint) { uint _epoch = epoch; Point memory last_point = point_history[_epoch]; return _supply_at(last_point, t); } function totalSupply() external view returns (uint) { return totalSupplyAtT(block.timestamp); } /// @notice Calculate total voting power at some point in the past /// @param _block Block to calculate the total voting power at /// @return Total voting power at `_block` function totalSupplyAt(uint _block) external view returns (uint) { assert(_block <= block.number); uint _epoch = epoch; uint target_epoch = _find_block_epoch(_block, _epoch); Point memory point = point_history[target_epoch]; uint dt = 0; if (target_epoch < _epoch) { Point memory point_next = point_history[target_epoch + 1]; if (point.blk != point_next.blk) { dt = ((_block - point.blk) * (point_next.ts - point.ts)) / (point_next.blk - point.blk); } } else { if (point.blk != block.number) { dt = ((_block - point.blk) * (block.timestamp - point.ts)) / (block.number - point.blk); } } // Now dt contains info on how far are we beyond point return _supply_at(point, point.ts + dt); } function _tokenURI(uint _tokenId, uint _balanceOf, uint _locked_end, uint _value) internal pure returns (string memory output) { output = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base">'; output = string(abi.encodePacked(output, "token ", toString(_tokenId), '</text><text x="10" y="40" class="base">')); output = string(abi.encodePacked(output, "balanceOf ", toString(_balanceOf), '</text><text x="10" y="60" class="base">')); output = string(abi.encodePacked(output, "locked_end ", toString(_locked_end), '</text><text x="10" y="80" class="base">')); output = string(abi.encodePacked(output, "value ", toString(_value), '</text></svg>')); string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "lock #', toString(_tokenId), '", "description": "Solidly locks, can be used to boost gauge yields, vote on token emission, and receive bribes", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}')))); output = string(abi.encodePacked('data:application/json;base64,', json)); } function toString(uint value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT license // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint temp = value; uint digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint(value % 10))); value /= 10; } return string(buffer); } function _burn(uint _tokenId) internal { require(_isApprovedOrOwner(msg.sender, _tokenId), "caller is not owner nor approved"); address owner = ownerOf(_tokenId); // Clear approval approve(address(0), _tokenId); // Remove token _removeTokenFrom(msg.sender, _tokenId); emit Transfer(owner, address(0), _tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"token_addr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"locktime","type":"uint256"},{"indexed":false,"internalType":"enum ve.DepositType","name":"deposit_type","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"Supply","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ts","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"abstain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"attach","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"attachments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"balanceOfAtNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"balanceOfNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_t","type":"uint256"}],"name":"balanceOfNFTAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"block_number","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_lock_duration","type":"uint256"}],"name":"create_lock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_lock_duration","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"create_lock_for","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"deposit_for","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"detach","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"get_last_user_slope","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"increase_amount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_lock_duration","type":"uint256"}],"name":"increase_unlock_time","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isApprovedOrOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"locked","outputs":[{"internalType":"int128","name":"amount","type":"int128"},{"internalType":"uint256","name":"end","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"locked__end","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"merge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownership_change","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"point_history","outputs":[{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"uint256","name":"ts","type":"uint256"},{"internalType":"uint256","name":"blk","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_voter","type":"address"}],"name":"setVoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"slope_changes","outputs":[{"internalType":"int128","name":"","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_tokenIndex","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"totalSupplyAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"t","type":"uint256"}],"name":"totalSupplyAtT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"user_point_epoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"user_point_history","outputs":[{"internalType":"int128","name":"bias","type":"int128"},{"internalType":"int128","name":"slope","type":"int128"},{"internalType":"uint256","name":"ts","type":"uint256"},{"internalType":"uint256","name":"blk","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_idx","type":"uint256"}],"name":"user_point_history__ts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"voted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"voting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526013805460ff191660011790553480156200001e57600080fd5b5060405162003d5e38038062003d5e833981016040819052620000419162000181565b6001600160a01b038116608052600a80546001600160a01b03191633179055437f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ee55427f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ed5560126020527f6afebfa21c417411ab7392a59bbb98ec35612153c5e8aeb3f64f4e016707b77a805460ff1990811660019081179092557fdf428ce7b59746cf2e618e63c6311d427105f2c3dc163ff0902907dea1728df58054821683179055635b5e139f60e01b60009081527fc0e00dda16840520b43384d85650edbbad8e5afcb041d20f42eb5aea304558cd80549092169092179055600b546040519091309160008051602062003d3e833981519152908290a4600b54604051600090309060008051602062003d3e833981519152908390a450620001b3565b6000602082840312156200019457600080fd5b81516001600160a01b0381168114620001ac57600080fd5b9392505050565b608051613b61620001dd6000396000818161087a01528181610bca01526127c10152613b616000f3fe608060405234801561001057600080fd5b506004361061030c5760003560e01c80638c2c9baf1161019d578063c87b56dd116100e9578063e7e242d4116100a2578063f8a057631161007c578063f8a057631461083e578063fbd3a29d14610862578063fc0c546a14610875578063fd4a77f11461089c57600080fd5b8063e7e242d4146107dc578063e985e9c5146107ef578063ee99fe281461082b57600080fd5b8063c87b56dd14610732578063d1c2babb14610745578063d1febfb914610758578063d4e54c3b14610796578063e0514aba146107a9578063e441135c146107bc57600080fd5b8063a183af5211610156578063b45a3c0e11610130578063b45a3c0e146106bc578063b88d4fde14610704578063c1f0fb9f14610717578063c2c4c5c11461072a57600080fd5b8063a183af5214610683578063a22cb46514610696578063a4d855df146106a957600080fd5b80638c2c9baf1461061e5780638fbb38ff14610631578063900cf0cf1461065457806395d89b411461036a578063981b24d01461065d578063986b7d8a1461067057600080fd5b8063313ce5671161025c57806354fd4d50116102155780636f548837116101ef5780636f548837146105b557806370a08231146105d55780637116c60c146105e857806371197484146105fb57600080fd5b806354fd4d50146105555780636352211e1461057957806365fc3873146105a257600080fd5b8063313ce567146104c957806342842e0e146104e3578063430c2081146104f6578063461f711c1461050957806346c96aac1461052f5780634bc2a6571461054257600080fd5b80631376f3da116102c957806323b872dd116102a357806323b872dd1461046757806325a58b561461047a5780632e1a7d4d146104805780632f745c591461049357600080fd5b80631376f3da1461041157806318160ddd1461044c5780631c984bc31461045457600080fd5b806301ffc9a714610311578063047fc9aa1461035357806306fdde031461036a578063081812fc1461039b578063095ea7b3146103dc5780630d6a2033146103f1575b600080fd5b61033e61031f366004612ffc565b6001600160e01b03191660009081526012602052604090205460ff1690565b60405190151581526020015b60405180910390f35b61035c60005481565b60405190815260200161034a565b61038e604051806040016040528060058152602001641d9953919560da1b81525081565b60405161034a9190613071565b6103c46103a9366004613084565b6000908152600d60205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200161034a565b6103ef6103ea3660046130b9565b6108af565b005b61035c6103ff366004613084565b60086020526000908152604090205481565b61042461041f3660046130e3565b610998565b60408051600f95860b81529390940b602084015292820152606081019190915260800161034a565b61035c6109df565b61035c6104623660046130e3565b6109ef565b6103ef610475366004613105565b610a22565b4361035c565b6103ef61048e366004613084565b610a33565b61035c6104a13660046130b9565b6001600160a01b03919091166000908152600f60209081526040808320938352929052205490565b6104d1601281565b60405160ff909116815260200161034a565b6103ef6104f1366004613105565b610ced565b61033e6105043660046130b9565b610d08565b61051c610517366004613084565b610d1b565b604051600f9190910b815260200161034a565b600a546103c4906001600160a01b031681565b6103ef610550366004613141565b610d5e565b61038e604051806040016040528060058152602001640312e302e360dc1b81525081565b6103c4610587366004613084565b6000908152600c60205260409020546001600160a01b031690565b61035c6105b03660046130e3565b610d97565b61035c6105c3366004613084565b60026020526000908152604090205481565b61035c6105e3366004613141565b610dd9565b61035c6105f6366004613084565b610df7565b61051c610609366004613084565b600760205260009081526040902054600f0b81565b61035c61062c3660046130e3565b610e57565b61033e61063f366004613084565b60096020526000908152604090205460ff1681565b61035c60035481565b61035c61066b366004613084565b610e63565b6103ef61067e366004613084565b611005565b6103ef6106913660046130e3565b611049565b6103ef6106a436600461316a565b611148565b6103ef6106b73660046130e3565b6111cd565b6106ea6106ca366004613084565b60016020819052600091825260409091208054910154600f9190910b9082565b60408051600f9390930b835260208301919091520161034a565b6103ef6107123660046131b7565b6113af565b6103ef610725366004613084565b6114dc565b6103ef61150b565b61038e610740366004613084565b61154b565b6103ef6107533660046130e3565b6115f8565b610424610766366004613084565b600460205260009081526040902080546001820154600290920154600f82810b93600160801b909304900b919084565b61035c6107a4366004613293565b611763565b61035c6107b73660046130e3565b6117a6565b61035c6107ca366004613084565b60066020526000908152604090205481565b61035c6107ea366004613084565b6117b2565b61033e6107fd3660046132c8565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205460ff1690565b6103ef6108393660046130e3565b6117da565b61035c61084c366004613084565b6000908152600160208190526040909120015490565b6103ef610870366004613084565b6118ae565b6103c47f000000000000000000000000000000000000000000000000000000000000000081565b6103ef6108aa366004613084565b6118df565b6000818152600c60205260409020546001600160a01b0316806108d157600080fd5b806001600160a01b0316836001600160a01b031614156108f057600080fd5b6000828152600c60209081526040808320546001600160a01b0385811685526011845282852033808752945291909320549216149060ff1681806109315750805b61093a57600080fd5b6000848152600d602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b600560205281600052604060002081633b9aca0081106109b757600080fd5b6003020180546001820154600290920154600f82810b9550600160801b90920490910b925084565b60006109ea42610df7565b905090565b600082815260056020526040812082633b9aca008110610a1157610a116132fb565b600302016001015490505b92915050565b610a2e83838333611911565b505050565b60135460ff16600114610a4557600080fd5b6013805460ff19166002179055610a5c33826119d7565b610a6857610a68613311565b600081815260086020526040902054158015610a93575060008181526009602052604090205460ff16155b610ab85760405162461bcd60e51b8152600401610aaf90613327565b60405180910390fd5b60008181526001602081815260409283902083518085019094528054600f0b845290910154908201819052421015610b2b5760405162461bcd60e51b8152602060048201526016602482015275546865206c6f636b206469646e27742065787069726560501b6044820152606401610aaf565b805160408051808201825260008082526020808301828152878352600191829052938220925183546001600160801b0319166001600160801b039091161783559251919092015554600f9190910b90610b84828261335f565b600081905550610bae848460405180604001604052806000600f0b81526020016000815250611a3d565b60405163a9059cbb60e01b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f9190613376565b610c4b57610c4b613311565b610c548461205c565b60408051858152602081018490524281830152905133917f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca94919081900360600190a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c81610cc2848261335f565b6040805192835260208301919091520160405180910390a150506013805460ff191660011790555050565b610a2e838383604051806020016040528060008152506113af565b6000610d1483836119d7565b9392505050565b6000818152600660209081526040808320546005909252822081633b9aca008110610d4857610d486132fb565b6003020154600160801b9004600f0b9392505050565b600a546001600160a01b03163314610d7557600080fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60135460009060ff16600114610dac57600080fd5b6013805460ff19166002179055610dc483833361211b565b90506013805460ff1916600117905592915050565b6001600160a01b0381166000908152600e6020526040812054610a1c565b600354600081815260046020908152604080832081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060820152909190610e4f818561226c565b949350505050565b6000610d14838361236e565b600043821115610e7557610e75613311565b6003546000610e848483612646565b600081815260046020908152604080832081516080810183528154600f81810b8352600160801b909104900b9381019390935260018101549183019190915260020154606082015291925083831015610f93576000600481610ee7866001613393565b8152602080820192909252604090810160002081516080810183528154600f81810b8352600160801b909104900b9381019390935260018101549183019190915260020154606080830182905285015191925014610f8d5782606001518160600151610f53919061335f565b83604001518260400151610f67919061335f565b6060850151610f76908a61335f565b610f8091906133ab565b610f8a91906133e0565b91505b50610fe2565b43826060015114610fe2576060820151610fad904361335f565b6040830151610fbc904261335f565b6060840151610fcb908961335f565b610fd591906133ab565b610fdf91906133e0565b90505b610ffb82828460400151610ff69190613393565b61226c565b9695505050505050565b600a546001600160a01b0316331461101c57600080fd5b6000818152600860205260409020546110379060019061335f565b60009182526008602052604090912055565b60135460ff1660011461105b57600080fd5b6013805460ff1916600217905561107233836119d7565b61107e5761107e613311565b60008281526001602081815260409283902083518085019094528054600f0b84529091015490820152816110b4576110b4613311565b60008160000151600f0b136111045760405162461bcd60e51b8152602060048201526016602482015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b6044820152606401610aaf565b428160200151116111275760405162461bcd60e51b8152600401610aaf906133f4565b611136838360008460026126d0565b50506013805460ff1916600117905550565b6001600160a01b03821633141561116157611161613311565b3360008181526011602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60135460ff166001146111df57600080fd5b6013805460ff191660021790556111f633836119d7565b61120257611202613311565b600082815260016020818152604080842081518083019092528054600f0b825290920154908201529062093a808061123a8542613393565b61124491906133e0565b61124e91906133ab565b9050428260200151116112925760405162461bcd60e51b815260206004820152600c60248201526b131bd8dac8195e1c1a5c995960a21b6044820152606401610aaf565b60008260000151600f0b136112dd5760405162461bcd60e51b8152602060048201526011602482015270139bdd1a1a5b99c81a5cc81b1bd8dad959607a1b6044820152606401610aaf565b816020015181116113305760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006044820152606401610aaf565b61133e630784ce0042613393565b81111561138d5760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006044820152606401610aaf565b61139c846000838560036126d0565b50506013805460ff191660011790555050565b6113bb84848433611911565b823b156114d657604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906113f4903390889087908790600401613438565b6020604051808303816000875af192505050801561142f575060408051601f3d908101601f1916820190925261142c9181019061346b565b60015b6114d4573d80801561145d576040519150601f19603f3d011682016040523d82523d6000602084013e611462565b606091505b5080516114cc5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610aaf565b805181602001fd5b505b50505050565b600a546001600160a01b031633146114f357600080fd5b6000908152600960205260409020805460ff19169055565b611549600060405180604001604052806000600f0b8152602001600081525060405180604001604052806000600f0b81526020016000815250611a3d565b565b6000818152600c60205260409020546060906001600160a01b03166115b25760405162461bcd60e51b815260206004820152601b60248201527f517565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610aaf565b60008281526001602081815260409283902083518085019094528054600f0b84529091015490820152610d14836115e981426128d5565b60208401518451600f0b6129a7565b600082815260086020526040902054158015611623575060008281526009602052604090205460ff16155b61163f5760405162461bcd60e51b8152600401610aaf90613327565b8082141561164c57600080fd5b61165633836119d7565b61165f57600080fd5b61166933826119d7565b61167257600080fd5b6000828152600160208181526040808420815180830183528154600f90810b82529185015481850190815287875285855283872084518086019095528054840b855290950154938301849052805194519095929490910b9211156116da5782602001516116e0565b83602001515b604080518082018252600080825260208083018281528b83526001808352858420945185546001600160801b0319166001600160801b0390911617855590519301929092558251808401909352808352908201529091506117449087908690611a3d565b61174d8661205c565b61175b8583838660046126d0565b505050505050565b60135460009060ff1660011461177857600080fd5b6013805460ff1916600217905561179084848461211b565b90506013805460ff191660011790559392505050565b6000610d1483836128d5565b6000818152600260205260408120544314156117d057506000919050565b610a1c82426128d5565b60135460ff166001146117ec57600080fd5b6013805460ff1916600217905560008281526001602081815260409283902083518085019094528054600f0b845290910154908201528161182c57600080fd5b60008160000151600f0b1361187c5760405162461bcd60e51b8152602060048201526016602482015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b6044820152606401610aaf565b4281602001511161189f5760405162461bcd60e51b8152600401610aaf906133f4565b611136838360008460006126d0565b600a546001600160a01b031633146118c557600080fd5b600081815260086020526040902054611037906001613393565b600a546001600160a01b031633146118f657600080fd5b6000908152600960205260409020805460ff19166001179055565b60008281526008602052604090205415801561193c575060008281526009602052604090205460ff16155b6119585760405162461bcd60e51b8152600401610aaf90613327565b61196281836119d7565b61196b57600080fd5b6119758483612ade565b61197f8483612b45565b6119898383612bc6565b6000828152600260205260408082204390555183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050565b6000818152600c6020908152604080832054600d8352818420546001600160a01b039182168086526011855283862088841680885295529285205492938085149392909116149060ff168280611a2a5750815b80611a325750805b979650505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260035460009081908715611ba957428760200151118015611aad575060008760000151600f0b135b15611af2578651611ac390630784ce0090613488565b600f0b602080870191909152870151611add90429061335f565b8560200151611aec91906134c6565b600f0b85525b428660200151118015611b0c575060008660000151600f0b135b15611b51578551611b2290630784ce0090613488565b600f0b602080860191909152860151611b3c90429061335f565b8460200151611b4b91906134c6565b600f0b84525b602080880151600090815260078252604090205490870151600f9190910b935015611ba957866020015186602001511415611b8e57829150611ba9565b602080870151600090815260079091526040902054600f0b91505b604080516080810182526000808252602082015242918101919091524360608201528115611c1e575060008181526004602090815260409182902082516080810184528154600f81810b8352600160801b909104900b9281019290925260018101549282019290925260029091015460608201525b604081015181600042831015611c6b576040840151611c3d904261335f565b6060850151611c4c904361335f565b611c5e90670de0b6b3a76400006133ab565b611c6891906133e0565b90505b600062093a80611c7b81866133e0565b611c8591906133ab565b905060005b60ff811015611e0057611ca062093a8083613393565b9150600042831115611cb457429250611cc8565b50600082815260076020526040902054600f0b5b611cd2868461335f565b8760200151611ce191906134c6565b87518890611cf090839061355b565b600f0b905250602087018051829190611d0a9083906135ab565b600f90810b90915288516000910b12159050611d2557600087525b60008760200151600f0b1215611d3d57600060208801525b60408088018490528501519295508592670de0b6b3a764000090611d61908561335f565b611d6b90866133ab565b611d7591906133e0565b8560600151611d849190613393565b6060880152611d94600189613393565b975042831415611daa5750436060870152611e00565b6000888152600460209081526040918290208951918a01516001600160801b03908116600160801b029216919091178155908801516001820155606088015160029091015550611df9816135fa565b9050611c8a565b505060038590558b15611e8b5788602001518860200151611e21919061355b565b84602001818151611e3291906135ab565b600f0b90525088518851611e46919061355b565b84518590611e559083906135ab565b600f90810b90915260208601516000910b12159050611e7657600060208501525b60008460000151600f0b1215611e8b57600084525b6000858152600460209081526040918290208651918701516001600160801b03908116600160801b02921691909117815590850151600182015560608501516002909101558b1561204e57428b602001511115611f43576020890151611ef190886135ab565b96508a602001518a602001511415611f15576020880151611f12908861355b565b96505b60208b810151600090815260079091526040902080546001600160801b0319166001600160801b0389161790555b428a602001511115611f9e578a602001518a602001511115611f9e576020880151611f6e908761355b565b60208b810151600090815260079091526040902080546001600160801b0319166001600160801b03831617905595505b60008c815260066020526040812054611fb8906001613393565b905080600660008f815260200190815260200160002081905550428960400181815250504389606001818152505088600560008f815260200190815260200160002082633b9aca00811061200e5761200e6132fb565b825160208401516001600160801b03908116600160801b029116176003919091029190910190815560408201516001820155606090910151600290910155505b505050505050505050505050565b61206633826119d7565b6120b25760405162461bcd60e51b815260206004820181905260248201527f63616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610aaf565b6000818152600c60205260408120546001600160a01b0316906120d590836108af565b6120df3383612b45565b60405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008062093a808061212d8642613393565b61213791906133e0565b61214191906133ab565b90506000851161215057600080fd5b4281116121ae5760405162461bcd60e51b815260206004820152602660248201527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e207468652060448201526566757475726560d01b6064820152608401610aaf565b6121bc630784ce0042613393565b81111561220b5760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006044820152606401610aaf565b600b6000815461221a906135fa565b90915550600b5461222b8482612c5c565b5060008181526001602081815260409283902083518085019094528054600f0b845282015490830152612263918391899186916126d0565b95945050505050565b600080839050600062093a8080836040015161228891906133e0565b61229291906133ab565b905060005b60ff811015612346576122ad62093a8083613393565b91506000858311156122c1578592506122d5565b50600082815260076020526040902054600f0b5b60408401516122e4908461335f565b84602001516122f391906134c6565b8451859061230290839061355b565b600f0b905250828614156123165750612346565b808460200181815161232891906135ab565b600f0b905250506040830182905261233f816135fa565b9050612297565b5060008260000151600f0b121561235c57600082525b50516001600160801b03169392505050565b60004382111561238057612380613311565b600083815260066020526040812054815b6080811015612424578183106123a657612424565b600060026123b48486613393565b6123bf906001613393565b6123c991906133e0565b6000888152600560205260409020909150869082633b9aca0081106123f0576123f06132fb565b60030201600201541161240557809350612413565b61241060018261335f565b92505b5061241d816135fa565b9050612391565b50600085815260056020526040812083633b9aca008110612447576124476132fb565b604080516080810182526003928302939093018054600f81810b8652600160801b909104900b60208501526001810154918401919091526002015460608301525490915060006124978783612646565b600081815260046020908152604080832081516080810183528154600f81810b8352600160801b909104900b9381019390935260018101549183019190915260020154606082015291925080848410156125765760006004816124fb876001613393565b8152602080820192909252604090810160002081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060808301829052860151919250612558919061335f565b92508360400151816040015161256e919061335f565b91505061259a565b6060830151612585904361335f565b9150826040015142612597919061335f565b90505b604083015182156125d7578284606001518c6125b6919061335f565b6125c090846133ab565b6125ca91906133e0565b6125d49082613393565b90505b60408701516125e6908261335f565b87602001516125f591906134c6565b8751889061260490839061355b565b600f90810b90915288516000910b12905061263457505093516001600160801b03169650610a1c95505050505050565b60009950505050505050505050610a1c565b60008082815b60808110156126c657818310612661576126c6565b6000600261266f8486613393565b61267a906001613393565b61268491906133e0565b60008181526004602052604090206002015490915087106126a7578093506126b5565b6126b260018261335f565b92505b506126bf816135fa565b905061264c565b5090949350505050565b60005482906126df8682613393565b6000908155604080518082019091528181526020810191909152825160208085015190830152600f0b815282518790849061271b9083906135ab565b600f0b905250851561272f57602083018690525b6000888152600160208181526040909220855181546001600160801b0319166001600160801b039091161781559185015191015561276e888285611a3d565b3387158015906127905750600485600481111561278d5761278d613615565b14155b1561283a576040516323b872dd60e01b81526001600160a01b038281166004830152306024830152604482018a90527f000000000000000000000000000000000000000000000000000000000000000016906323b872dd906064016020604051808303816000875af115801561280a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282e9190613376565b61283a5761283a613311565b8360200151816001600160a01b03167fff04ccafc360e16b67d682d17bd9503c4c6b9a131f6be6325762dc9ffc7de6248b8b894260405161287e949392919061362b565b60405180910390a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c836128b28a82613393565b6040805192835260208301919091520160405180910390a1505050505050505050565b600082815260066020526040812054806128f3576000915050610a1c565b600084815260056020526040812082633b9aca008110612915576129156132fb565b60408051608081018252600392909202929092018054600f81810b8452600160801b909104900b6020830152600181015492820183905260020154606082015291506129619085613669565b816020015161297091906134c6565b8151829061297f90839061355b565b600f90810b90915282516000910b1215905061299a57600081525b51600f0b9150610a1c9050565b606060405180610120016040528060fd81526020016139ef60fd91399050806129cf86612cbf565b6040516020016129e09291906136a8565b6040516020818303038152906040529050806129fb85612cbf565b604051602001612a0c929190613724565b604051602081830303815290604052905080612a2784612cbf565b604051602001612a389291906137a4565b604051602081830303815290604052905080612a5383612cbf565b604051602001612a64929190613825565b60405160208183030381529060405290506000612ab1612a8387612cbf565b612a8c84612dbd565b604051602001612a9d929190613880565b604051602081830303815290604052612dbd565b905080604051602001612ac49190613995565b604051602081830303815290604052915050949350505050565b6000818152600c60205260409020546001600160a01b03838116911614612b0757612b07613311565b6000818152600d60205260409020546001600160a01b031615612b41576000818152600d6020526040902080546001600160a01b03191690555b5050565b6000818152600c60205260409020546001600160a01b03838116911614612b6e57612b6e613311565b6000818152600c6020526040902080546001600160a01b0319169055612b948282612f23565b6001600160a01b0382166000908152600e60205260408120805460019290612bbd90849061335f565b90915550505050565b6000818152600c60205260409020546001600160a01b031615612beb57612beb613311565b6000818152600c6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600e8084528285208054600f865284872081885286528487208890558787526010865293862093909355908452909152805460019290612bbd908490613393565b60006001600160a01b038316612c7457612c74613311565b612c7e8383612bc6565b60405182906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450600192915050565b606081612ce35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612d0d5780612cf7816135fa565b9150612d069050600a836133e0565b9150612ce7565b60008167ffffffffffffffff811115612d2857612d286131a1565b6040519080825280601f01601f191660200182016040528015612d52576020820181803683370190505b5090505b8415610e4f57612d6760018361335f565b9150612d74600a866139da565b612d7f906030613393565b60f81b818381518110612d9457612d946132fb565b60200101906001600160f81b031916908160001a905350612db6600a866133e0565b9450612d56565b805160609080612ddd575050604080516020810190915260008152919050565b60006003612dec836002613393565b612df691906133e0565b612e019060046133ab565b90506000612e10826020613393565b67ffffffffffffffff811115612e2857612e286131a1565b6040519080825280601f01601f191660200182016040528015612e52576020820181803683370190505b5090506000604051806060016040528060408152602001613aec604091399050600181016020830160005b86811015612ede576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612e7d565b506003860660018114612ef85760028114612f0957612f15565b613d3d60f01b600119830152612f15565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0382166000908152600e6020526040812054612f489060019061335f565b60008381526010602052604090205490915080821415612f98576001600160a01b0384166000908152600f60209081526040808320858452825280832083905585835260109091528120556114d6565b6001600160a01b03939093166000908152600f602090815260408083209383529281528282208054868452848420819055835260109091528282209490945592839055908252812055565b6001600160e01b031981168114612ff957600080fd5b50565b60006020828403121561300e57600080fd5b8135610d1481612fe3565b60005b8381101561303457818101518382015260200161301c565b838111156114d65750506000910152565b6000815180845261305d816020860160208601613019565b601f01601f19169290920160200192915050565b602081526000610d146020830184613045565b60006020828403121561309657600080fd5b5035919050565b80356001600160a01b03811681146130b457600080fd5b919050565b600080604083850312156130cc57600080fd5b6130d58361309d565b946020939093013593505050565b600080604083850312156130f657600080fd5b50508035926020909101359150565b60008060006060848603121561311a57600080fd5b6131238461309d565b92506131316020850161309d565b9150604084013590509250925092565b60006020828403121561315357600080fd5b610d148261309d565b8015158114612ff957600080fd5b6000806040838503121561317d57600080fd5b6131868361309d565b915060208301356131968161315c565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156131cd57600080fd5b6131d68561309d565b93506131e46020860161309d565b925060408501359150606085013567ffffffffffffffff8082111561320857600080fd5b818701915087601f83011261321c57600080fd5b81358181111561322e5761322e6131a1565b604051601f8201601f19908116603f01168101908382118183101715613256576132566131a1565b816040528281528a602084870101111561326f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000606084860312156132a857600080fd5b83359250602084013591506132bf6040850161309d565b90509250925092565b600080604083850312156132db57600080fd5b6132e48361309d565b91506132f26020840161309d565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b602080825260089082015267185d1d1858da195960c21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561337157613371613349565b500390565b60006020828403121561338857600080fd5b8151610d148161315c565b600082198211156133a6576133a6613349565b500190565b60008160001904831182151516156133c5576133c5613349565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826133ef576133ef6133ca565b500490565b60208082526024908201527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686040820152636472617760e01b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090610ffb90830184613045565b60006020828403121561347d57600080fd5b8151610d1481612fe3565b600081600f0b83600f0b8061349f5761349f6133ca565b60016001607f1b03198214600019821416156134bd576134bd613349565b90059392505050565b600081600f0b83600f0b60016001607f1b036000821360008413838304851182821616156134f6576134f6613349565b60016001607f1b0319600085128281168783058712161561351957613519613349565b6000871292508582058712848416161561353557613535613349565b8585058712818416161561354b5761354b613349565b5050509290910295945050505050565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561358657613586613349565b8160016001607f1b030183138116156135a1576135a1613349565b5090039392505050565b600081600f0b83600f0b600082128260016001607f1b03038213811516156135d5576135d5613349565b8260016001607f1b03190382128116156135f1576135f1613349565b50019392505050565b600060001982141561360e5761360e613349565b5060010190565b634e487b7160e01b600052602160045260246000fd5b84815260208101849052608081016005841061365757634e487b7160e01b600052602160045260246000fd5b60408201939093526060015292915050565b60008083128015600160ff1b85018412161561368757613687613349565b6001600160ff1b03840183138116156136a2576136a2613349565b50500390565b600083516136ba818460208801613019565b6503a37b5b2b7160d51b90830190815283516136dd816006840160208801613019565b7f3c2f746578743e3c7465787420783d2231302220793d2234302220636c61737360069290910191820152671e913130b9b2911f60c11b6026820152602e01949350505050565b60008351613736818460208801613019565b6903130b630b731b2a7b3160b51b908301908152835161375d81600a840160208801613019565b7f3c2f746578743e3c7465787420783d2231302220793d2236302220636c617373600a9290910191820152671e913130b9b2911f60c11b602a820152603201949350505050565b600083516137b6818460208801613019565b6a03637b1b5b2b22fb2b732160ad1b90830190815283516137de81600b840160208801613019565b7f3c2f746578743e3c7465787420783d2231302220793d2238302220636c617373600b9290910191820152671e913130b9b2911f60c11b602b820152603301949350505050565b60008351613837818460208801613019565b6503b30b63ab2960d51b908301908152835161385a816006840160208801613019565b6c1e17ba32bc3a1f1e17b9bb339f60991b60069290910191820152601301949350505050565b6f7b226e616d65223a20226c6f636b202360801b815282516000906138ac816010850160208801613019565b7f222c20226465736372697074696f6e223a2022536f6c69646c79206c6f636b736010918401918201527f2c2063616e206265207573656420746f20626f6f73742067617567652079696560308201527f6c64732c20766f7465206f6e20746f6b656e20656d697373696f6e2c20616e6460508201527f207265636569766520627269626573222c2022696d616765223a2022646174616070820152750e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60521b6090820152835161397a8160a6840160208801613019565b61227d60f01b60a6929091019182015260a801949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516139cd81601d850160208701613019565b91909101601d0192915050565b6000826139e9576139e96133ca565b50069056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220b8e45eee268a0b58708b81f2c83a4becdc8e9d194923a2690bdc24a6dd20b83764736f6c634300080b0033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef000000000000000000000000888ef71766ca594ded1f0fa3ae64ed2941740a20
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061030c5760003560e01c80638c2c9baf1161019d578063c87b56dd116100e9578063e7e242d4116100a2578063f8a057631161007c578063f8a057631461083e578063fbd3a29d14610862578063fc0c546a14610875578063fd4a77f11461089c57600080fd5b8063e7e242d4146107dc578063e985e9c5146107ef578063ee99fe281461082b57600080fd5b8063c87b56dd14610732578063d1c2babb14610745578063d1febfb914610758578063d4e54c3b14610796578063e0514aba146107a9578063e441135c146107bc57600080fd5b8063a183af5211610156578063b45a3c0e11610130578063b45a3c0e146106bc578063b88d4fde14610704578063c1f0fb9f14610717578063c2c4c5c11461072a57600080fd5b8063a183af5214610683578063a22cb46514610696578063a4d855df146106a957600080fd5b80638c2c9baf1461061e5780638fbb38ff14610631578063900cf0cf1461065457806395d89b411461036a578063981b24d01461065d578063986b7d8a1461067057600080fd5b8063313ce5671161025c57806354fd4d50116102155780636f548837116101ef5780636f548837146105b557806370a08231146105d55780637116c60c146105e857806371197484146105fb57600080fd5b806354fd4d50146105555780636352211e1461057957806365fc3873146105a257600080fd5b8063313ce567146104c957806342842e0e146104e3578063430c2081146104f6578063461f711c1461050957806346c96aac1461052f5780634bc2a6571461054257600080fd5b80631376f3da116102c957806323b872dd116102a357806323b872dd1461046757806325a58b561461047a5780632e1a7d4d146104805780632f745c591461049357600080fd5b80631376f3da1461041157806318160ddd1461044c5780631c984bc31461045457600080fd5b806301ffc9a714610311578063047fc9aa1461035357806306fdde031461036a578063081812fc1461039b578063095ea7b3146103dc5780630d6a2033146103f1575b600080fd5b61033e61031f366004612ffc565b6001600160e01b03191660009081526012602052604090205460ff1690565b60405190151581526020015b60405180910390f35b61035c60005481565b60405190815260200161034a565b61038e604051806040016040528060058152602001641d9953919560da1b81525081565b60405161034a9190613071565b6103c46103a9366004613084565b6000908152600d60205260409020546001600160a01b031690565b6040516001600160a01b03909116815260200161034a565b6103ef6103ea3660046130b9565b6108af565b005b61035c6103ff366004613084565b60086020526000908152604090205481565b61042461041f3660046130e3565b610998565b60408051600f95860b81529390940b602084015292820152606081019190915260800161034a565b61035c6109df565b61035c6104623660046130e3565b6109ef565b6103ef610475366004613105565b610a22565b4361035c565b6103ef61048e366004613084565b610a33565b61035c6104a13660046130b9565b6001600160a01b03919091166000908152600f60209081526040808320938352929052205490565b6104d1601281565b60405160ff909116815260200161034a565b6103ef6104f1366004613105565b610ced565b61033e6105043660046130b9565b610d08565b61051c610517366004613084565b610d1b565b604051600f9190910b815260200161034a565b600a546103c4906001600160a01b031681565b6103ef610550366004613141565b610d5e565b61038e604051806040016040528060058152602001640312e302e360dc1b81525081565b6103c4610587366004613084565b6000908152600c60205260409020546001600160a01b031690565b61035c6105b03660046130e3565b610d97565b61035c6105c3366004613084565b60026020526000908152604090205481565b61035c6105e3366004613141565b610dd9565b61035c6105f6366004613084565b610df7565b61051c610609366004613084565b600760205260009081526040902054600f0b81565b61035c61062c3660046130e3565b610e57565b61033e61063f366004613084565b60096020526000908152604090205460ff1681565b61035c60035481565b61035c61066b366004613084565b610e63565b6103ef61067e366004613084565b611005565b6103ef6106913660046130e3565b611049565b6103ef6106a436600461316a565b611148565b6103ef6106b73660046130e3565b6111cd565b6106ea6106ca366004613084565b60016020819052600091825260409091208054910154600f9190910b9082565b60408051600f9390930b835260208301919091520161034a565b6103ef6107123660046131b7565b6113af565b6103ef610725366004613084565b6114dc565b6103ef61150b565b61038e610740366004613084565b61154b565b6103ef6107533660046130e3565b6115f8565b610424610766366004613084565b600460205260009081526040902080546001820154600290920154600f82810b93600160801b909304900b919084565b61035c6107a4366004613293565b611763565b61035c6107b73660046130e3565b6117a6565b61035c6107ca366004613084565b60066020526000908152604090205481565b61035c6107ea366004613084565b6117b2565b61033e6107fd3660046132c8565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205460ff1690565b6103ef6108393660046130e3565b6117da565b61035c61084c366004613084565b6000908152600160208190526040909120015490565b6103ef610870366004613084565b6118ae565b6103c47f000000000000000000000000888ef71766ca594ded1f0fa3ae64ed2941740a2081565b6103ef6108aa366004613084565b6118df565b6000818152600c60205260409020546001600160a01b0316806108d157600080fd5b806001600160a01b0316836001600160a01b031614156108f057600080fd5b6000828152600c60209081526040808320546001600160a01b0385811685526011845282852033808752945291909320549216149060ff1681806109315750805b61093a57600080fd5b6000848152600d602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918716917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050505050565b600560205281600052604060002081633b9aca0081106109b757600080fd5b6003020180546001820154600290920154600f82810b9550600160801b90920490910b925084565b60006109ea42610df7565b905090565b600082815260056020526040812082633b9aca008110610a1157610a116132fb565b600302016001015490505b92915050565b610a2e83838333611911565b505050565b60135460ff16600114610a4557600080fd5b6013805460ff19166002179055610a5c33826119d7565b610a6857610a68613311565b600081815260086020526040902054158015610a93575060008181526009602052604090205460ff16155b610ab85760405162461bcd60e51b8152600401610aaf90613327565b60405180910390fd5b60008181526001602081815260409283902083518085019094528054600f0b845290910154908201819052421015610b2b5760405162461bcd60e51b8152602060048201526016602482015275546865206c6f636b206469646e27742065787069726560501b6044820152606401610aaf565b805160408051808201825260008082526020808301828152878352600191829052938220925183546001600160801b0319166001600160801b039091161783559251919092015554600f9190910b90610b84828261335f565b600081905550610bae848460405180604001604052806000600f0b81526020016000815250611a3d565b60405163a9059cbb60e01b8152336004820152602481018390527f000000000000000000000000888ef71766ca594ded1f0fa3ae64ed2941740a206001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610c1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3f9190613376565b610c4b57610c4b613311565b610c548461205c565b60408051858152602081018490524281830152905133917f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca94919081900360600190a27f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c81610cc2848261335f565b6040805192835260208301919091520160405180910390a150506013805460ff191660011790555050565b610a2e838383604051806020016040528060008152506113af565b6000610d1483836119d7565b9392505050565b6000818152600660209081526040808320546005909252822081633b9aca008110610d4857610d486132fb565b6003020154600160801b9004600f0b9392505050565b600a546001600160a01b03163314610d7557600080fd5b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60135460009060ff16600114610dac57600080fd5b6013805460ff19166002179055610dc483833361211b565b90506013805460ff1916600117905592915050565b6001600160a01b0381166000908152600e6020526040812054610a1c565b600354600081815260046020908152604080832081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060820152909190610e4f818561226c565b949350505050565b6000610d14838361236e565b600043821115610e7557610e75613311565b6003546000610e848483612646565b600081815260046020908152604080832081516080810183528154600f81810b8352600160801b909104900b9381019390935260018101549183019190915260020154606082015291925083831015610f93576000600481610ee7866001613393565b8152602080820192909252604090810160002081516080810183528154600f81810b8352600160801b909104900b9381019390935260018101549183019190915260020154606080830182905285015191925014610f8d5782606001518160600151610f53919061335f565b83604001518260400151610f67919061335f565b6060850151610f76908a61335f565b610f8091906133ab565b610f8a91906133e0565b91505b50610fe2565b43826060015114610fe2576060820151610fad904361335f565b6040830151610fbc904261335f565b6060840151610fcb908961335f565b610fd591906133ab565b610fdf91906133e0565b90505b610ffb82828460400151610ff69190613393565b61226c565b9695505050505050565b600a546001600160a01b0316331461101c57600080fd5b6000818152600860205260409020546110379060019061335f565b60009182526008602052604090912055565b60135460ff1660011461105b57600080fd5b6013805460ff1916600217905561107233836119d7565b61107e5761107e613311565b60008281526001602081815260409283902083518085019094528054600f0b84529091015490820152816110b4576110b4613311565b60008160000151600f0b136111045760405162461bcd60e51b8152602060048201526016602482015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b6044820152606401610aaf565b428160200151116111275760405162461bcd60e51b8152600401610aaf906133f4565b611136838360008460026126d0565b50506013805460ff1916600117905550565b6001600160a01b03821633141561116157611161613311565b3360008181526011602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60135460ff166001146111df57600080fd5b6013805460ff191660021790556111f633836119d7565b61120257611202613311565b600082815260016020818152604080842081518083019092528054600f0b825290920154908201529062093a808061123a8542613393565b61124491906133e0565b61124e91906133ab565b9050428260200151116112925760405162461bcd60e51b815260206004820152600c60248201526b131bd8dac8195e1c1a5c995960a21b6044820152606401610aaf565b60008260000151600f0b136112dd5760405162461bcd60e51b8152602060048201526011602482015270139bdd1a1a5b99c81a5cc81b1bd8dad959607a1b6044820152606401610aaf565b816020015181116113305760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c7920696e637265617365206c6f636b206475726174696f6e006044820152606401610aaf565b61133e630784ce0042613393565b81111561138d5760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006044820152606401610aaf565b61139c846000838560036126d0565b50506013805460ff191660011790555050565b6113bb84848433611911565b823b156114d657604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906113f4903390889087908790600401613438565b6020604051808303816000875af192505050801561142f575060408051601f3d908101601f1916820190925261142c9181019061346b565b60015b6114d4573d80801561145d576040519150601f19603f3d011682016040523d82523d6000602084013e611462565b606091505b5080516114cc5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610aaf565b805181602001fd5b505b50505050565b600a546001600160a01b031633146114f357600080fd5b6000908152600960205260409020805460ff19169055565b611549600060405180604001604052806000600f0b8152602001600081525060405180604001604052806000600f0b81526020016000815250611a3d565b565b6000818152600c60205260409020546060906001600160a01b03166115b25760405162461bcd60e51b815260206004820152601b60248201527f517565727920666f72206e6f6e6578697374656e7420746f6b656e00000000006044820152606401610aaf565b60008281526001602081815260409283902083518085019094528054600f0b84529091015490820152610d14836115e981426128d5565b60208401518451600f0b6129a7565b600082815260086020526040902054158015611623575060008281526009602052604090205460ff16155b61163f5760405162461bcd60e51b8152600401610aaf90613327565b8082141561164c57600080fd5b61165633836119d7565b61165f57600080fd5b61166933826119d7565b61167257600080fd5b6000828152600160208181526040808420815180830183528154600f90810b82529185015481850190815287875285855283872084518086019095528054840b855290950154938301849052805194519095929490910b9211156116da5782602001516116e0565b83602001515b604080518082018252600080825260208083018281528b83526001808352858420945185546001600160801b0319166001600160801b0390911617855590519301929092558251808401909352808352908201529091506117449087908690611a3d565b61174d8661205c565b61175b8583838660046126d0565b505050505050565b60135460009060ff1660011461177857600080fd5b6013805460ff1916600217905561179084848461211b565b90506013805460ff191660011790559392505050565b6000610d1483836128d5565b6000818152600260205260408120544314156117d057506000919050565b610a1c82426128d5565b60135460ff166001146117ec57600080fd5b6013805460ff1916600217905560008281526001602081815260409283902083518085019094528054600f0b845290910154908201528161182c57600080fd5b60008160000151600f0b1361187c5760405162461bcd60e51b8152602060048201526016602482015275139bc8195e1a5cdd1a5b99c81b1bd8dac8199bdd5b9960521b6044820152606401610aaf565b4281602001511161189f5760405162461bcd60e51b8152600401610aaf906133f4565b611136838360008460006126d0565b600a546001600160a01b031633146118c557600080fd5b600081815260086020526040902054611037906001613393565b600a546001600160a01b031633146118f657600080fd5b6000908152600960205260409020805460ff19166001179055565b60008281526008602052604090205415801561193c575060008281526009602052604090205460ff16155b6119585760405162461bcd60e51b8152600401610aaf90613327565b61196281836119d7565b61196b57600080fd5b6119758483612ade565b61197f8483612b45565b6119898383612bc6565b6000828152600260205260408082204390555183916001600160a01b0380871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a450505050565b6000818152600c6020908152604080832054600d8352818420546001600160a01b039182168086526011855283862088841680885295529285205492938085149392909116149060ff168280611a2a5750815b80611a325750805b979650505050505050565b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260035460009081908715611ba957428760200151118015611aad575060008760000151600f0b135b15611af2578651611ac390630784ce0090613488565b600f0b602080870191909152870151611add90429061335f565b8560200151611aec91906134c6565b600f0b85525b428660200151118015611b0c575060008660000151600f0b135b15611b51578551611b2290630784ce0090613488565b600f0b602080860191909152860151611b3c90429061335f565b8460200151611b4b91906134c6565b600f0b84525b602080880151600090815260078252604090205490870151600f9190910b935015611ba957866020015186602001511415611b8e57829150611ba9565b602080870151600090815260079091526040902054600f0b91505b604080516080810182526000808252602082015242918101919091524360608201528115611c1e575060008181526004602090815260409182902082516080810184528154600f81810b8352600160801b909104900b9281019290925260018101549282019290925260029091015460608201525b604081015181600042831015611c6b576040840151611c3d904261335f565b6060850151611c4c904361335f565b611c5e90670de0b6b3a76400006133ab565b611c6891906133e0565b90505b600062093a80611c7b81866133e0565b611c8591906133ab565b905060005b60ff811015611e0057611ca062093a8083613393565b9150600042831115611cb457429250611cc8565b50600082815260076020526040902054600f0b5b611cd2868461335f565b8760200151611ce191906134c6565b87518890611cf090839061355b565b600f0b905250602087018051829190611d0a9083906135ab565b600f90810b90915288516000910b12159050611d2557600087525b60008760200151600f0b1215611d3d57600060208801525b60408088018490528501519295508592670de0b6b3a764000090611d61908561335f565b611d6b90866133ab565b611d7591906133e0565b8560600151611d849190613393565b6060880152611d94600189613393565b975042831415611daa5750436060870152611e00565b6000888152600460209081526040918290208951918a01516001600160801b03908116600160801b029216919091178155908801516001820155606088015160029091015550611df9816135fa565b9050611c8a565b505060038590558b15611e8b5788602001518860200151611e21919061355b565b84602001818151611e3291906135ab565b600f0b90525088518851611e46919061355b565b84518590611e559083906135ab565b600f90810b90915260208601516000910b12159050611e7657600060208501525b60008460000151600f0b1215611e8b57600084525b6000858152600460209081526040918290208651918701516001600160801b03908116600160801b02921691909117815590850151600182015560608501516002909101558b1561204e57428b602001511115611f43576020890151611ef190886135ab565b96508a602001518a602001511415611f15576020880151611f12908861355b565b96505b60208b810151600090815260079091526040902080546001600160801b0319166001600160801b0389161790555b428a602001511115611f9e578a602001518a602001511115611f9e576020880151611f6e908761355b565b60208b810151600090815260079091526040902080546001600160801b0319166001600160801b03831617905595505b60008c815260066020526040812054611fb8906001613393565b905080600660008f815260200190815260200160002081905550428960400181815250504389606001818152505088600560008f815260200190815260200160002082633b9aca00811061200e5761200e6132fb565b825160208401516001600160801b03908116600160801b029116176003919091029190910190815560408201516001820155606090910151600290910155505b505050505050505050505050565b61206633826119d7565b6120b25760405162461bcd60e51b815260206004820181905260248201527f63616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610aaf565b6000818152600c60205260408120546001600160a01b0316906120d590836108af565b6120df3383612b45565b60405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008062093a808061212d8642613393565b61213791906133e0565b61214191906133ab565b90506000851161215057600080fd5b4281116121ae5760405162461bcd60e51b815260206004820152602660248201527f43616e206f6e6c79206c6f636b20756e74696c2074696d6520696e207468652060448201526566757475726560d01b6064820152608401610aaf565b6121bc630784ce0042613393565b81111561220b5760405162461bcd60e51b815260206004820152601e60248201527f566f74696e67206c6f636b2063616e2062652034207965617273206d617800006044820152606401610aaf565b600b6000815461221a906135fa565b90915550600b5461222b8482612c5c565b5060008181526001602081815260409283902083518085019094528054600f0b845282015490830152612263918391899186916126d0565b95945050505050565b600080839050600062093a8080836040015161228891906133e0565b61229291906133ab565b905060005b60ff811015612346576122ad62093a8083613393565b91506000858311156122c1578592506122d5565b50600082815260076020526040902054600f0b5b60408401516122e4908461335f565b84602001516122f391906134c6565b8451859061230290839061355b565b600f0b905250828614156123165750612346565b808460200181815161232891906135ab565b600f0b905250506040830182905261233f816135fa565b9050612297565b5060008260000151600f0b121561235c57600082525b50516001600160801b03169392505050565b60004382111561238057612380613311565b600083815260066020526040812054815b6080811015612424578183106123a657612424565b600060026123b48486613393565b6123bf906001613393565b6123c991906133e0565b6000888152600560205260409020909150869082633b9aca0081106123f0576123f06132fb565b60030201600201541161240557809350612413565b61241060018261335f565b92505b5061241d816135fa565b9050612391565b50600085815260056020526040812083633b9aca008110612447576124476132fb565b604080516080810182526003928302939093018054600f81810b8652600160801b909104900b60208501526001810154918401919091526002015460608301525490915060006124978783612646565b600081815260046020908152604080832081516080810183528154600f81810b8352600160801b909104900b9381019390935260018101549183019190915260020154606082015291925080848410156125765760006004816124fb876001613393565b8152602080820192909252604090810160002081516080810183528154600f81810b8352600160801b909104900b93810193909352600181015491830191909152600201546060808301829052860151919250612558919061335f565b92508360400151816040015161256e919061335f565b91505061259a565b6060830151612585904361335f565b9150826040015142612597919061335f565b90505b604083015182156125d7578284606001518c6125b6919061335f565b6125c090846133ab565b6125ca91906133e0565b6125d49082613393565b90505b60408701516125e6908261335f565b87602001516125f591906134c6565b8751889061260490839061355b565b600f90810b90915288516000910b12905061263457505093516001600160801b03169650610a1c95505050505050565b60009950505050505050505050610a1c565b60008082815b60808110156126c657818310612661576126c6565b6000600261266f8486613393565b61267a906001613393565b61268491906133e0565b60008181526004602052604090206002015490915087106126a7578093506126b5565b6126b260018261335f565b92505b506126bf816135fa565b905061264c565b5090949350505050565b60005482906126df8682613393565b6000908155604080518082019091528181526020810191909152825160208085015190830152600f0b815282518790849061271b9083906135ab565b600f0b905250851561272f57602083018690525b6000888152600160208181526040909220855181546001600160801b0319166001600160801b039091161781559185015191015561276e888285611a3d565b3387158015906127905750600485600481111561278d5761278d613615565b14155b1561283a576040516323b872dd60e01b81526001600160a01b038281166004830152306024830152604482018a90527f000000000000000000000000888ef71766ca594ded1f0fa3ae64ed2941740a2016906323b872dd906064016020604051808303816000875af115801561280a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061282e9190613376565b61283a5761283a613311565b8360200151816001600160a01b03167fff04ccafc360e16b67d682d17bd9503c4c6b9a131f6be6325762dc9ffc7de6248b8b894260405161287e949392919061362b565b60405180910390a37f5e2aa66efd74cce82b21852e317e5490d9ecc9e6bb953ae24d90851258cc2f5c836128b28a82613393565b6040805192835260208301919091520160405180910390a1505050505050505050565b600082815260066020526040812054806128f3576000915050610a1c565b600084815260056020526040812082633b9aca008110612915576129156132fb565b60408051608081018252600392909202929092018054600f81810b8452600160801b909104900b6020830152600181015492820183905260020154606082015291506129619085613669565b816020015161297091906134c6565b8151829061297f90839061355b565b600f90810b90915282516000910b1215905061299a57600081525b51600f0b9150610a1c9050565b606060405180610120016040528060fd81526020016139ef60fd91399050806129cf86612cbf565b6040516020016129e09291906136a8565b6040516020818303038152906040529050806129fb85612cbf565b604051602001612a0c929190613724565b604051602081830303815290604052905080612a2784612cbf565b604051602001612a389291906137a4565b604051602081830303815290604052905080612a5383612cbf565b604051602001612a64929190613825565b60405160208183030381529060405290506000612ab1612a8387612cbf565b612a8c84612dbd565b604051602001612a9d929190613880565b604051602081830303815290604052612dbd565b905080604051602001612ac49190613995565b604051602081830303815290604052915050949350505050565b6000818152600c60205260409020546001600160a01b03838116911614612b0757612b07613311565b6000818152600d60205260409020546001600160a01b031615612b41576000818152600d6020526040902080546001600160a01b03191690555b5050565b6000818152600c60205260409020546001600160a01b03838116911614612b6e57612b6e613311565b6000818152600c6020526040902080546001600160a01b0319169055612b948282612f23565b6001600160a01b0382166000908152600e60205260408120805460019290612bbd90849061335f565b90915550505050565b6000818152600c60205260409020546001600160a01b031615612beb57612beb613311565b6000818152600c6020908152604080832080546001600160a01b0319166001600160a01b038716908117909155808452600e8084528285208054600f865284872081885286528487208890558787526010865293862093909355908452909152805460019290612bbd908490613393565b60006001600160a01b038316612c7457612c74613311565b612c7e8383612bc6565b60405182906001600160a01b038516906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a450600192915050565b606081612ce35750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612d0d5780612cf7816135fa565b9150612d069050600a836133e0565b9150612ce7565b60008167ffffffffffffffff811115612d2857612d286131a1565b6040519080825280601f01601f191660200182016040528015612d52576020820181803683370190505b5090505b8415610e4f57612d6760018361335f565b9150612d74600a866139da565b612d7f906030613393565b60f81b818381518110612d9457612d946132fb565b60200101906001600160f81b031916908160001a905350612db6600a866133e0565b9450612d56565b805160609080612ddd575050604080516020810190915260008152919050565b60006003612dec836002613393565b612df691906133e0565b612e019060046133ab565b90506000612e10826020613393565b67ffffffffffffffff811115612e2857612e286131a1565b6040519080825280601f01601f191660200182016040528015612e52576020820181803683370190505b5090506000604051806060016040528060408152602001613aec604091399050600181016020830160005b86811015612ede576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612e7d565b506003860660018114612ef85760028114612f0957612f15565b613d3d60f01b600119830152612f15565b603d60f81b6000198301525b505050918152949350505050565b6001600160a01b0382166000908152600e6020526040812054612f489060019061335f565b60008381526010602052604090205490915080821415612f98576001600160a01b0384166000908152600f60209081526040808320858452825280832083905585835260109091528120556114d6565b6001600160a01b03939093166000908152600f602090815260408083209383529281528282208054868452848420819055835260109091528282209490945592839055908252812055565b6001600160e01b031981168114612ff957600080fd5b50565b60006020828403121561300e57600080fd5b8135610d1481612fe3565b60005b8381101561303457818101518382015260200161301c565b838111156114d65750506000910152565b6000815180845261305d816020860160208601613019565b601f01601f19169290920160200192915050565b602081526000610d146020830184613045565b60006020828403121561309657600080fd5b5035919050565b80356001600160a01b03811681146130b457600080fd5b919050565b600080604083850312156130cc57600080fd5b6130d58361309d565b946020939093013593505050565b600080604083850312156130f657600080fd5b50508035926020909101359150565b60008060006060848603121561311a57600080fd5b6131238461309d565b92506131316020850161309d565b9150604084013590509250925092565b60006020828403121561315357600080fd5b610d148261309d565b8015158114612ff957600080fd5b6000806040838503121561317d57600080fd5b6131868361309d565b915060208301356131968161315c565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156131cd57600080fd5b6131d68561309d565b93506131e46020860161309d565b925060408501359150606085013567ffffffffffffffff8082111561320857600080fd5b818701915087601f83011261321c57600080fd5b81358181111561322e5761322e6131a1565b604051601f8201601f19908116603f01168101908382118183101715613256576132566131a1565b816040528281528a602084870101111561326f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806000606084860312156132a857600080fd5b83359250602084013591506132bf6040850161309d565b90509250925092565b600080604083850312156132db57600080fd5b6132e48361309d565b91506132f26020840161309d565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052600160045260246000fd5b602080825260089082015267185d1d1858da195960c21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561337157613371613349565b500390565b60006020828403121561338857600080fd5b8151610d148161315c565b600082198211156133a6576133a6613349565b500190565b60008160001904831182151516156133c5576133c5613349565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826133ef576133ef6133ca565b500490565b60208082526024908201527f43616e6e6f742061646420746f2065787069726564206c6f636b2e20576974686040820152636472617760e01b606082015260800190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090610ffb90830184613045565b60006020828403121561347d57600080fd5b8151610d1481612fe3565b600081600f0b83600f0b8061349f5761349f6133ca565b60016001607f1b03198214600019821416156134bd576134bd613349565b90059392505050565b600081600f0b83600f0b60016001607f1b036000821360008413838304851182821616156134f6576134f6613349565b60016001607f1b0319600085128281168783058712161561351957613519613349565b6000871292508582058712848416161561353557613535613349565b8585058712818416161561354b5761354b613349565b5050509290910295945050505050565b600081600f0b83600f0b600081128160016001607f1b03190183128115161561358657613586613349565b8160016001607f1b030183138116156135a1576135a1613349565b5090039392505050565b600081600f0b83600f0b600082128260016001607f1b03038213811516156135d5576135d5613349565b8260016001607f1b03190382128116156135f1576135f1613349565b50019392505050565b600060001982141561360e5761360e613349565b5060010190565b634e487b7160e01b600052602160045260246000fd5b84815260208101849052608081016005841061365757634e487b7160e01b600052602160045260246000fd5b60408201939093526060015292915050565b60008083128015600160ff1b85018412161561368757613687613349565b6001600160ff1b03840183138116156136a2576136a2613349565b50500390565b600083516136ba818460208801613019565b6503a37b5b2b7160d51b90830190815283516136dd816006840160208801613019565b7f3c2f746578743e3c7465787420783d2231302220793d2234302220636c61737360069290910191820152671e913130b9b2911f60c11b6026820152602e01949350505050565b60008351613736818460208801613019565b6903130b630b731b2a7b3160b51b908301908152835161375d81600a840160208801613019565b7f3c2f746578743e3c7465787420783d2231302220793d2236302220636c617373600a9290910191820152671e913130b9b2911f60c11b602a820152603201949350505050565b600083516137b6818460208801613019565b6a03637b1b5b2b22fb2b732160ad1b90830190815283516137de81600b840160208801613019565b7f3c2f746578743e3c7465787420783d2231302220793d2238302220636c617373600b9290910191820152671e913130b9b2911f60c11b602b820152603301949350505050565b60008351613837818460208801613019565b6503b30b63ab2960d51b908301908152835161385a816006840160208801613019565b6c1e17ba32bc3a1f1e17b9bb339f60991b60069290910191820152601301949350505050565b6f7b226e616d65223a20226c6f636b202360801b815282516000906138ac816010850160208801613019565b7f222c20226465736372697074696f6e223a2022536f6c69646c79206c6f636b736010918401918201527f2c2063616e206265207573656420746f20626f6f73742067617567652079696560308201527f6c64732c20766f7465206f6e20746f6b656e20656d697373696f6e2c20616e6460508201527f207265636569766520627269626573222c2022696d616765223a2022646174616070820152750e9a5b5859d94bdcdd99cade1b5b0ed8985cd94d8d0b60521b6090820152835161397a8160a6840160208801613019565b61227d60f01b60a6929091019182015260a801949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516139cd81601d850160208701613019565b91909101601d0192915050565b6000826139e9576139e96133ca565b50069056fe3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220b8e45eee268a0b58708b81f2c83a4becdc8e9d194923a2690bdc24a6dd20b83764736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000888ef71766ca594ded1f0fa3ae64ed2941740a20
-----Decoded View---------------
Arg [0] : token_addr (address): 0x888EF71766ca594DED1F0FA3AE64eD2941740A20
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000888ef71766ca594ded1f0fa3ae64ed2941740a20
Deployed Bytecode Sourcemap
10686:43084:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14670:136;;;;;;:::i;:::-;-1:-1:-1;;;;;;14765:33:0;14741:4;14765:33;;;:19;:33;;;;;;;;;14670:136;;;;565:14:1;;558:22;540:41;;528:2;513:18;14670:136:0;;;;;;;;11472:18;;;;;;;;;738:25:1;;;726:2;711:18;11472::0;592:177:1;12056:37:0;;;;;;;;;;;;;;;-1:-1:-1;;;12056:37:0;;;;;;;;;;;;:::i;16858:117::-;;;;;;:::i;:::-;16917:7;16944:23;;;:13;:23;;;;;;-1:-1:-1;;;;;16944:23:0;;16858:117;;;;-1:-1:-1;;;;;1874:32:1;;;1856:51;;1844:2;1829:18;16858:117:0;1710:203:1;27056:658:0;;;;;;:::i;:::-;;:::i;:::-;;11939:40;;;;;;:::i;:::-;;;;;;;;;;;;;;11705:60;;;;;;:::i;:::-;;:::i;:::-;;;;2864:2:1;2853:22;;;2835:41;;2912:22;;;;2907:2;2892:18;;2885:50;2951:18;;;2944:34;3009:2;2994:18;;2987:34;;;;2822:3;2807:19;11705:60:0;2608:419:1;50170:109:0;;;:::i;15386:150::-;;;;;;:::i;:::-;;:::i;23379:174::-;;;;;;:::i;:::-;;:::i;38487:91::-;38558:12;38487:91;;42947:972;;;;;;:::i;:::-;;:::i;17379:159::-;;;;;;:::i;:::-;-1:-1:-1;;;;;17489:28:0;;;;17465:4;17489:28;;;:20;:28;;;;;;;;:41;;;;;;;;;17379:159;12193:35;;12226:2;12193:35;;;;;3537:4:1;3525:17;;;3507:36;;3495:2;3480:18;12193:35:0;3365:184:1;26327:173:0;;;;;;:::i;:::-;;:::i;18314:153::-;;;;;;:::i;:::-;;:::i;14985:194::-;;;;;;:::i;:::-;;:::i;:::-;;;3727:2:1;3716:22;;;;3698:41;;3686:2;3671:18;14985:194:0;3554:191:1;12027:20:0;;;;;-1:-1:-1;;;;;12027:20:0;;;37070:115;;;;;;:::i;:::-;;:::i;12146:40::-;;;;;;;;;;;;;;;-1:-1:-1;;;12146:40:0;;;;;16621:107;;;;;;:::i;:::-;16674:7;16701:19;;;:9;:19;;;;;;-1:-1:-1;;;;;16701:19:0;;16621:107;41126:166;;;;;;:::i;:::-;;:::i;11550:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;16396:106;;;;;;:::i;:::-;;:::i;49964:198::-;;;;;;:::i;:::-;;:::i;11855:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;48602:140;;;;;;:::i;:::-;;:::i;11986:34::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;11604:17;;;;;;50475:880;;;;;;:::i;:::-;;:::i;37604:145::-;;;;;;:::i;:::-;;:::i;41472:503::-;;;;;;:::i;:::-;;:::i;28226:301::-;;;;;;:::i;:::-;;:::i;42111:724::-;;;;;;:::i;:::-;;:::i;11497:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4585:2:1;4574:22;;;;4556:41;;4628:2;4613:18;;4606:34;;;;4529:18;11497:44:0;4384:262:1;24762:834:0;;;;;;:::i;:::-;;:::i;37321:122::-;;;;;;:::i;:::-;;:::i;38636:106::-;;;:::i;45834:415::-;;;;;;:::i;:::-;;:::i;37757:722::-;;;;;;:::i;:::-;;:::i;11628:43::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;11628:43:0;;;;;;;;;40714:176;;;;;;:::i;:::-;;:::i;46464:130::-;;;;;;:::i;:::-;;:::i;11803:45::-;;;;;;:::i;:::-;;;;;;;;;;;;;;46257:199;;;;;;:::i;:::-;;:::i;17184:153::-;;;;;;:::i;:::-;-1:-1:-1;;;;;17293:24:0;;;17268:4;17293:24;;;:16;:24;;;;;;;;17292:37;;;;;;;;;;;;;;;17184:153;39067:433;;;;;;:::i;:::-;;:::i;15685:111::-;;;;;;:::i;:::-;15744:4;15768:16;;;:6;:16;;;;;;;;:20;;;15685:111;37451:145;;;;;;:::i;:::-;;:::i;11435:30::-;;;;;37193:120;;;;;;:::i;:::-;;:::i;27056:658::-;27125:13;27141:19;;;:9;:19;;;;;;-1:-1:-1;;;;;27141:19:0;27231;27223:28;;;;;;27338:5;-1:-1:-1;;;;;27325:18:0;:9;-1:-1:-1;;;;;27325:18:0;;;27317:27;;;;;;27386:18;27408:19;;;:9;:19;;;;;;;;;-1:-1:-1;;;;;27484:23:0;;;;;:16;:23;;;;;27431:10;27483:37;;;;;;;;;;27408:19;;:33;;27483:37;;27408:33;;27539:39;;;27556:22;27539:39;27531:48;;;;;;27619:23;;;;:13;:23;;;;;;:35;;-1:-1:-1;;;;;;27619:35:0;-1:-1:-1;;;;;27619:35:0;;;;;;;;;27670:36;;27619:23;;27670:36;;;;;;;27114:600;;;27056:658;;:::o;11705:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;11705:60:0;;;;;;;-1:-1:-1;11705:60:0;:::o;50170:109::-;50216:4;50240:31;50255:15;50240:14;:31::i;:::-;50233:38;;50170:109;:::o;15386:150::-;15467:4;15491:28;;;:18;:28;;;;;15520:4;15491:34;;;;;;;:::i;:::-;;;;:37;;;15484:44;;15386:150;;;;;:::o;23379:174::-;23498:47;23512:5;23519:3;23524:8;23534:10;23498:13;:47::i;:::-;23379:174;;;:::o;42947:972::-;13767:14;;:30;:14;13633:1;13767:30;13759:39;;;;;;13809:14;:25;;-1:-1:-1;;13809:25:0;13676:1;13809:25;;;43020:40:::1;43039:10;43051:8:::0;43020:18:::1;:40::i;:::-;43013:48;;;;:::i;:::-;43080:21;::::0;;;:11:::1;:21;::::0;;;;;:26;:46;::::1;;;-1:-1:-1::0;43111:15:0::1;::::0;;;:5:::1;:15;::::0;;;;;::::1;;43110:16;43080:46;43072:67;;;;-1:-1:-1::0;;;43072:67:0::1;;;;;;;:::i;:::-;;;;;;;;;43152:28;43183:16:::0;;;:6:::1;:16;::::0;;;;;;;;43152:47;;;;::::1;::::0;;;;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;;43218:15:::1;:30;;43210:65;;;::::0;-1:-1:-1;;;43210:65:0;;7320:2:1;43210:65:0::1;::::0;::::1;7302:21:1::0;7359:2;7339:18;;;7332:30;-1:-1:-1;;;7378:18:1;;;7371:52;7440:18;;43210:65:0::1;7118:346:1::0;43210:65:0::1;43311:14:::0;;43359:18:::1;::::0;;;;::::1;::::0;;-1:-1:-1;43359:18:0;;;::::1;::::0;;::::1;::::0;;;43340:16;;;:6:::1;:16:::0;;;;;;;:37;;;;-1:-1:-1;;;;;;43340:37:0::1;-1:-1:-1::0;;;;;43340:37:0;;;::::1;::::0;;;;;;;::::1;::::0;43409:6;43304:22:::1;::::0;;;::::1;::::0;43435:21:::1;43304:22:::0;43409:6;43435:21:::1;:::i;:::-;43426:6;:30;;;;43614:50;43626:8;43636:7;43645:18;;;;;;;;43659:1;43645:18;;;;;;43661:1;43645:18;;::::0;43614:11:::1;:50::i;:::-;43684:41;::::0;-1:-1:-1;;;43684:41:0;;43707:10:::1;43684:41;::::0;::::1;7905:51:1::0;7972:18;;;7965:34;;;43691:5:0::1;-1:-1:-1::0;;;;;43684:22:0::1;::::0;::::1;::::0;7878:18:1;;43684:41:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43677:49;;;;:::i;:::-;43764:15;43770:8;43764:5;:15::i;:::-;43797:54;::::0;;8462:25:1;;;8518:2;8503:18;;8496:34;;;43835:15:0::1;8546:18:1::0;;;8539:34;43797:54:0;;43806:10:::1;::::0;43797:54:::1;::::0;;;;;8450:2:1;43797:54:0;;::::1;43867:44;43874:13:::0;43889:21:::1;43905:5:::0;43874:13;43889:21:::1;:::i;:::-;43867:44;::::0;;8758:25:1;;;8814:2;8799:18;;8792:34;;;;8731:18;43867:44:0::1;;;;;;;-1:-1:-1::0;;13857:14:0;:29;;-1:-1:-1;;13857:29:0;13633:1;13857:29;;;-1:-1:-1;;42947:972:0:o;26327:173::-;26450:42;26467:5;26474:3;26479:8;26450:42;;;;;;;;;;;;:16;:42::i;18314:153::-;18397:4;18421:38;18440:8;18450;18421:18;:38::i;:::-;18414:45;18314:153;-1:-1:-1;;;18314:153:0:o;14985:194::-;15052:6;15085:26;;;:16;:26;;;;;;;;;15129:18;:28;;;;;15085:26;15129:36;;;;;;;:::i;:::-;;;;:42;-1:-1:-1;;;15129:42:0;;;;;14985:194;-1:-1:-1;;;14985:194:0:o;37070:115::-;37146:5;;-1:-1:-1;;;;;37146:5:0;37132:10;:19;37124:28;;;;;;37163:5;:14;;-1:-1:-1;;;;;;37163:14:0;-1:-1:-1;;;;;37163:14:0;;;;;;;;;;37070:115::o;41126:166::-;13767:14;;41212:4;;13767:30;:14;13633:1;13767:30;13759:39;;;;;;13809:14;:25;;-1:-1:-1;;13809:25:0;13676:1;13809:25;;;41236:48:::1;41249:6:::0;41257:14;41273:10:::1;41236:12;:48::i;:::-;41229:55;;13857:14:::0;:29;;-1:-1:-1;;13857:29:0;13633:1;13857:29;;;41126:166;;-1:-1:-1;;41126:166:0:o;16396:106::-;-1:-1:-1;;;;;16119:27:0;;16454:4;16119:27;;;:19;:27;;;;;;16478:16;16038:116;49964:198;50048:5;;50017:4;50090:21;;;:13;:21;;;;;;;;50064:47;;;;;;;;;;;;;;;-1:-1:-1;;;50064:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50017:4;;50048:5;50129:25;50064:47;50152:1;50129:10;:25::i;:::-;50122:32;49964:198;-1:-1:-1;;;;49964:198:0:o;48602:140::-;48677:4;48701:33;48717:8;48727:6;48701:15;:33::i;50475:880::-;50534:4;50568:12;50558:6;:22;;50551:30;;;;:::i;:::-;50606:5;;50592:11;50642:33;50660:6;50606:5;50642:17;:33::i;:::-;50688:18;50709:27;;;:13;:27;;;;;;;;50688:48;;;;;;;;;;;;;;;-1:-1:-1;;;50688:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50622:53;;-1:-1:-1;50773:21:0;;;50769:465;;;50811:23;50837:13;50811:23;50851:16;:12;50866:1;50851:16;:::i;:::-;50837:31;;;;;;;;;;;;;;-1:-1:-1;50837:31:0;50811:57;;;;;;;;;;;;;;;-1:-1:-1;;;50811:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50887:9;;;50811:57;;-1:-1:-1;50887:27:0;50883:155;;51012:5;:9;;;50995:10;:14;;;:26;;;;:::i;:::-;50981:5;:8;;;50965:10;:13;;;:24;;;;:::i;:::-;50951:9;;;;50942:18;;:6;:18;:::i;:::-;50941:49;;;;:::i;:::-;50940:82;;;;:::i;:::-;50935:87;;50883:155;50796:253;50769:465;;;51087:12;51074:5;:9;;;:25;51070:153;;51197:9;;;;51182:24;;:12;:24;:::i;:::-;51168:8;;;;51150:26;;:15;:26;:::i;:::-;51136:9;;;;51127:18;;:6;:18;:::i;:::-;51126:51;;;;:::i;:::-;51125:82;;;;:::i;:::-;51120:87;;51070:153;51315:32;51326:5;51344:2;51333:5;:8;;;:13;;;;:::i;:::-;51315:10;:32::i;:::-;51308:39;50475:880;-1:-1:-1;;;;;;50475:880:0:o;37604:145::-;37677:5;;-1:-1:-1;;;;;37677:5:0;37663:10;:19;37655:28;;;;;;37718:21;;;;:11;:21;;;;;;:23;;37740:1;;37718:23;:::i;:::-;37694:21;;;;:11;:21;;;;;;:47;37604:145::o;41472:503::-;13767:14;;:30;:14;13633:1;13767:30;13759:39;;;;;;13809:14;:25;;-1:-1:-1;;13809:25:0;13676:1;13809:25;;;41565:40:::1;41584:10;41596:8:::0;41565:18:::1;:40::i;:::-;41558:48;;;;:::i;:::-;41619:28;41650:16:::0;;;:6:::1;:16;::::0;;;;;;;;41619:47;;;;::::1;::::0;;;;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;41686:10;41679:18:::1;;;;:::i;:::-;41761:1;41744:7;:14;;;:18;;;41736:53;;;::::0;-1:-1:-1;;;41736:53:0;;9602:2:1;41736:53:0::1;::::0;::::1;9584:21:1::0;9641:2;9621:18;;;9614:30;-1:-1:-1;;;9660:18:1;;;9653:52;9722:18;;41736:53:0::1;9400:346:1::0;41736:53:0::1;41822:15;41808:7;:11;;;:29;41800:78;;;;-1:-1:-1::0;;;41800:78:0::1;;;;;;;:::i;:::-;41891:76;41904:8;41914:6;41922:1;41925:7;41934:32;41891:12;:76::i;:::-;-1:-1:-1::0;;13857:14:0;:29;;-1:-1:-1;;13857:29:0;13633:1;13857:29;;;-1:-1:-1;41472:503:0:o;28226:301::-;-1:-1:-1;;;;;28369:23:0;;28382:10;28369:23;;28362:31;;;;:::i;:::-;28421:10;28404:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;28404:39:0;;;;;;;;;;;;:51;;-1:-1:-1;;28404:51:0;;;;;;;;;;28471:48;;540:41:1;;;28404:39:0;;28421:10;28471:48;;513:18:1;28471:48:0;;;;;;;28226:301;;:::o;42111:724::-;13767:14;;:30;:14;13633:1;13767:30;13759:39;;;;;;13809:14;:25;;-1:-1:-1;;13809:25:0;13676:1;13809:25;;;42217:40:::1;42236:10;42248:8:::0;42217:18:::1;:40::i;:::-;42210:48;;;;:::i;:::-;42271:28;42302:16:::0;;;:6:::1;:16;::::0;;;;;;;42271:47;;;;::::1;::::0;;;;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;;11256:7:::1;::::0;42349:32:::1;42367:14:::0;42349:15:::1;:32;:::i;:::-;42348:41;;;;:::i;:::-;:48;;;;:::i;:::-;42329:67;;42468:15;42454:7;:11;;;:29;42446:54;;;::::0;-1:-1:-1;;;42446:54:0;;10358:2:1;42446:54:0::1;::::0;::::1;10340:21:1::0;10397:2;10377:18;;;10370:30;-1:-1:-1;;;10416:18:1;;;10409:42;10468:18;;42446:54:0::1;10156:336:1::0;42446:54:0::1;42536:1;42519:7;:14;;;:18;;;42511:48;;;::::0;-1:-1:-1;;;42511:48:0;;10699:2:1;42511:48:0::1;::::0;::::1;10681:21:1::0;10738:2;10718:18;;;10711:30;-1:-1:-1;;;10757:18:1;;;10750:47;10814:18;;42511:48:0::1;10497:341:1::0;42511:48:0::1;42592:7;:11;;;42578;:25;42570:69;;;::::0;-1:-1:-1;;;42570:69:0;;11045:2:1;42570:69:0::1;::::0;::::1;11027:21:1::0;11084:2;11064:18;;;11057:30;11123:33;11103:18;;;11096:61;11174:18;;42570:69:0::1;10843:355:1::0;42570:69:0::1;42673:25;11303:15;42673;:25;:::i;:::-;42658:11;:40;;42650:83;;;::::0;-1:-1:-1;;;42650:83:0;;11405:2:1;42650:83:0::1;::::0;::::1;11387:21:1::0;11444:2;11424:18;;;11417:30;11483:32;11463:18;;;11456:60;11533:18;;42650:83:0::1;11203:354:1::0;42650:83:0::1;42746:81;42759:8;42769:1;42772:11;42785:7;42794:32;42746:12;:81::i;:::-;-1:-1:-1::0;;13857:14:0;:29;;-1:-1:-1;;13857:29:0;13633:1;13857:29;;;-1:-1:-1;;42111:724:0:o;24762:834::-;24912:47;24926:5;24933:3;24938:8;24948:10;24912:13;:47::i;:::-;23880:20;;23928:8;24972:617;;25118:73;;-1:-1:-1;;;25118:73:0;;-1:-1:-1;;;;;25118:37:0;;;;;:73;;25156:10;;25168:5;;25175:8;;25185:5;;25118:73;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25118:73:0;;;;;;;;-1:-1:-1;;25118:73:0;;;;;;;;;;;;:::i;:::-;;;25114:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25295:13:0;;25291:272;;25338:60;;-1:-1:-1;;;25338:60:0;;12512:2:1;25338:60:0;;;12494:21:1;12551:2;12531:18;;;12524:30;12590:34;12570:18;;;12563:62;-1:-1:-1;;;12641:18:1;;;12634:48;12699:19;;25338:60:0;12310:414:1;25291:272:0;25513:6;25507:13;25498:6;25494:2;25490:15;25483:38;25114:464;25192:19;25114:464;24762:834;;;;:::o;37321:122::-;37395:5;;-1:-1:-1;;;;;37395:5:0;37381:10;:19;37373:28;;;;;;37430:5;37412:15;;;:5;:15;;;;;:23;;-1:-1:-1;;37412:23:0;;;37321:122::o;38636:106::-;38678:56;38690:1;38693:19;;;;;;;;38707:1;38693:19;;;;;;38710:1;38693:19;;;38714;;;;;;;;38728:1;38714:19;;;;;;38731:1;38714:19;;;38678:11;:56::i;:::-;38636:106::o;45834:415::-;45955:1;45924:19;;;:9;:19;;;;;;45890:13;;-1:-1:-1;;;;;45924:19:0;45916:73;;;;-1:-1:-1;;;45916:73:0;;12931:2:1;45916:73:0;;;12913:21:1;12970:2;12950:18;;;12943:30;13009:29;12989:18;;;12982:57;13056:18;;45916:73:0;12729:351:1;45916:73:0;46000:28;46031:16;;;:6;:16;;;;;;;;;46000:47;;;;;;;;;;;;;;;;;;;;;;46074:167;46038:8;46121:40;46038:8;46145:15;46121:13;:40::i;:::-;46176:11;;;;46214:14;;46207:22;;46074:9;:167::i;37757:722::-;37822:18;;;;:11;:18;;;;;;:23;:40;;;;-1:-1:-1;37850:12:0;;;;:5;:12;;;;;;;;37849:13;37822:40;37814:61;;;;-1:-1:-1;;;37814:61:0;;;;;;;:::i;:::-;37903:3;37894:5;:12;;37886:21;;;;;;37926:37;37945:10;37957:5;37926:18;:37::i;:::-;37918:46;;;;;;37983:35;38002:10;38014:3;37983:18;:35::i;:::-;37975:44;;;;;;38032:29;38064:13;;;:6;:13;;;;;;;;38032:45;;;;;;;;;;;;;;;;;;;;;;;;;38120:11;;;;;;;;;38088:43;;;;;;;;;;;;;;;;;;;;;;;;38168:15;;38207:12;;38032:45;;38088:43;;38161:23;;;;-1:-1:-1;38207:28:0;:58;;38253:8;:12;;;38207:58;;;38238:8;:12;;;38207:58;38294:19;;;;;;;;-1:-1:-1;38294:19:0;;;;;;;;;;38278:13;;;:6;:13;;;;;;:35;;;;-1:-1:-1;;;;;;38278:35:0;-1:-1:-1;;;;;38278:35:0;;;;;;;;;;;;;;38353:19;;;;;;;;;;;;;;;38196:69;;-1:-1:-1;38324:49:0;;38278:13;;38343:8;;38324:11;:49::i;:::-;38384:12;38390:5;38384;:12::i;:::-;38407:64;38420:3;38425:6;38433:3;38438:8;38448:22;38407:12;:64::i;:::-;37803:676;;;;37757:722;;:::o;40714:176::-;13767:14;;40817:4;;13767:30;:14;13633:1;13767:30;13759:39;;;;;;13809:14;:25;;-1:-1:-1;;13809:25:0;13676:1;13809:25;;;40841:41:::1;40854:6:::0;40862:14;40878:3;40841:12:::1;:41::i;:::-;40834:48;;13857:14:::0;:29;;-1:-1:-1;;13857:29:0;13633:1;13857:29;;;40714:176;;-1:-1:-1;;;40714:176:0:o;46464:130::-;46535:4;46559:27;46573:8;46583:2;46559:13;:27::i;46257:199::-;46317:4;46338:26;;;:16;:26;;;;;;46368:12;46338:42;46334:56;;;-1:-1:-1;46389:1:0;;46257:199;-1:-1:-1;46257:199:0:o;46334:56::-;46408:40;46422:8;46432:15;46408:13;:40::i;39067:433::-;13767:14;;:30;:14;13633:1;13767:30;13759:39;;;;;;13809:14;:25;;-1:-1:-1;;13809:25:0;13676:1;13809:25;;;:14;39180:16;;;13809:25;39180:16:::1;::::0;;;;;;;;39149:47;;;;::::1;::::0;;;;;::::1;;::::0;;;;::::1;::::0;;;::::1;::::0;39217:10;39209:19:::1;;;::::0;::::1;;39292:1;39275:7;:14;;;:18;;;39267:53;;;::::0;-1:-1:-1;;;39267:53:0;;9602:2:1;39267:53:0::1;::::0;::::1;9584:21:1::0;9641:2;9621:18;;;9614:30;-1:-1:-1;;;9660:18:1;;;9653:52;9722:18;;39267:53:0::1;9400:346:1::0;39267:53:0::1;39353:15;39339:7;:11;;;:29;39331:78;;;;-1:-1:-1::0;;;39331:78:0::1;;;;;;;:::i;:::-;39420:72;39433:8;39443:6;39451:1;39454:7;39463:28;39420:12;:72::i;37451:145::-:0;37524:5;;-1:-1:-1;;;;;37524:5:0;37510:10;:19;37502:28;;;;;;37565:21;;;;:11;:21;;;;;;:23;;37587:1;37565:23;:::i;37193:120::-;37266:5;;-1:-1:-1;;;;;37266:5:0;37252:10;:19;37244:28;;;;;;37283:15;;;;:5;:15;;;;;:22;;-1:-1:-1;;37283:22:0;37301:4;37283:22;;;37193:120::o;21980:789::-;22134:21;;;;:11;:21;;;;;;:26;:46;;;;-1:-1:-1;22165:15:0;;;;:5;:15;;;;;;;;22164:16;22134:46;22126:67;;;;-1:-1:-1;;;22126:67:0;;;;;;;:::i;:::-;22243:37;22262:7;22271:8;22243:18;:37::i;:::-;22235:46;;;;;;22363:31;22378:5;22385:8;22363:14;:31::i;:::-;22469:33;22486:5;22493:8;22469:16;:33::i;:::-;22533:26;22545:3;22550:8;22533:11;:26::i;:::-;22645;;;;:16;:26;;;;;;22674:12;22645:41;;22731:30;22662:8;;-1:-1:-1;;;;;22731:30:0;;;;;;;;;;;21980:789;;;;:::o;17884:422::-;17968:4;18001:19;;;:9;:19;;;;;;;;;18118:13;:23;;;;;;-1:-1:-1;;;;;18001:19:0;;;18184:23;;;:16;:23;;;;;18053:17;;;18183:35;;;;;;;;;18001:19;;18053:17;;;;18118:23;;;;18106:35;;18183;;18053:17;;18236:35;;;18254:17;18236:35;:62;;;;18275:23;18236:62;18229:69;17884:422;-1:-1:-1;;;;;;;17884:422:0:o;29480:5882::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29772:5:0;;29694:17;;;;29794:13;;29790:1170;;29936:15;29919:10;:14;;;:32;:57;;;;;29975:1;29955:10;:17;;;:21;;;29919:57;29915:234;;;30011:17;;:28;;11361:15;;30011:28;:::i;:::-;29997:42;;:11;;;;:42;;;;30099:14;;;:32;;30116:15;;30099:32;:::i;:::-;30071:5;:11;;;:62;;;;:::i;:::-;30058:75;;;;29915:234;30184:15;30167:10;:14;;;:32;:57;;;;;30223:1;30203:10;:17;;;:21;;;30167:57;30163:234;;;30259:17;;:28;;11361:15;;30259:28;:::i;:::-;30245:42;;:11;;;;:42;;;;30347:14;;;:32;;30364:15;;30347:32;:::i;:::-;30319:5;:11;;;:62;;;;:::i;:::-;30306:75;;;;30163:234;30665:14;;;;;30651:29;;;;:13;:29;;;;;;30699:14;;;;30651:29;;;;;;-1:-1:-1;30699:19:0;30695:254;;30761:10;:14;;;30743:10;:14;;;:32;30739:195;;;30813:10;30800:23;;30739:195;;;30899:14;;;;;30885:29;;;;:13;:29;;;;;;;;;;-1:-1:-1;30739:195:0;30998:66;;;;;;;;30972:23;30998:66;;;;;;;31028:15;30998:66;;;;;;;31050:12;30998:66;;;;31079:10;;31075:77;;-1:-1:-1;31119:21:0;;;;:13;:21;;;;;;;;;31106:34;;;;;;;;;;;;;;;-1:-1:-1;;;31106:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31075:77;31185:13;;;;:10;31162:20;31528:15;:31;-1:-1:-1;31524:160:0;;;31658:13;;;;31640:31;;:15;:31;:::i;:::-;31620:14;;;;31605:29;;:12;:29;:::i;:::-;31591:44;;11419:7;31591:44;:::i;:::-;31590:82;;;;:::i;:::-;31576:96;;31524:160;31923:8;11256:7;31935:22;11256:7;31935:15;:22;:::i;:::-;31934:31;;;;:::i;:::-;31923:42;;31985:6;31980:1383;32001:3;31997:1;:7;31980:1383;;;32207:11;11256:7;32207:11;;:::i;:::-;;;32237:14;32284:15;32278:3;:21;32274:168;;;32330:15;32324:21;;32274:168;;;-1:-1:-1;32404:18:0;;;;:13;:18;;;;;;;;32274:168;32512:21;32518:15;32512:3;:21;:::i;:::-;32479:10;:16;;;:56;;;;:::i;:::-;32460:75;;:10;;:75;;;;;:::i;:::-;;;;;-1:-1:-1;32554:16:0;;;:27;;32574:7;;32554:16;:27;;32574:7;;32554:27;:::i;:::-;;;;;;;;32604:15;;32622:1;32604:19;;;32600:127;;-1:-1:-1;32600:127:0;;32706:1;32688:19;;32600:127;32768:1;32749:10;:16;;;:20;;;32745:147;;;32871:1;32852:16;;;:20;32745:147;32950:13;;;;:19;;;33052:21;;;32928:3;;-1:-1:-1;32928:3:0;;11419:7;;33046:27;;32928:3;33046:27;:::i;:::-;33031:43;;:11;:43;:::i;:::-;33030:58;;;;:::i;:::-;33005:18;:22;;;:83;;;;:::i;:::-;32988:14;;;:100;33107:11;33117:1;33107:11;;:::i;:::-;;;33148:15;33141:3;:22;33137:211;;;-1:-1:-1;33205:12:0;33188:14;;;:29;33240:5;;33137:211;33294:21;;;;:13;:21;;;;;;;;;:34;;;;;;-1:-1:-1;;;;;33294:34:0;;;-1:-1:-1;;;33294:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32006:3:0;;;:::i;:::-;;;31980:1383;;;-1:-1:-1;;33386:5:0;:14;;;33469:13;;33465:483;;33677:5;:11;;;33663:5;:11;;;:25;;;;:::i;:::-;33642:10;:16;;:47;;;;;;;:::i;:::-;;;;;-1:-1:-1;33737:10:0;;33724;;:23;;33737:10;33724:23;:::i;:::-;33704:44;;:10;;:44;;;;;:::i;:::-;;;;;;;;33767:16;;;;33786:1;33767:20;;;33763:81;;-1:-1:-1;33763:81:0;;33827:1;33808:16;;;:20;33763:81;33880:1;33862:10;:15;;;:19;;;33858:79;;;33920:1;33902:19;;33858:79;34010:21;;;;:13;:21;;;;;;;;;:34;;;;;;-1:-1:-1;;;;;34010:34:0;;;-1:-1:-1;;;34010:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;34061:13;;34057:1298;;34301:15;34284:10;:14;;;:32;34280:402;;;34431:11;;;;34417:25;;;;:::i;:::-;;;34483:10;:14;;;34465:10;:14;;;:32;34461:145;;;34536:11;;;;34522:25;;;;:::i;:::-;;;34461:145;34638:14;;;;;34624:29;;;;:13;:29;;;;;;:42;;-1:-1:-1;;;;;;34624:42:0;-1:-1:-1;;;;;34624:42:0;;;;;34280:402;34719:15;34702:10;:14;;;:32;34698:344;;;34776:10;:14;;;34759:10;:14;;;:31;34755:209;;;34829:11;;;;34815:25;;;;:::i;:::-;34916:14;;;;;34902:29;;;;:13;:29;;;;;;:42;;-1:-1:-1;;;;;;34902:42:0;-1:-1:-1;;;;;34902:42:0;;;;;;-1:-1:-1;34755:209:0;35096:15;35114:26;;;:16;:26;;;;;;:30;;35143:1;35114:30;:::i;:::-;35096:48;;35190:10;35161:16;:26;35178:8;35161:26;;;;;;;;;;;:39;;;;35226:15;35215:5;:8;;:26;;;;;35268:12;35256:5;:9;;:24;;;;;35338:5;35295:18;:28;35314:8;35295:28;;;;;;;;;;;35324:10;35295:40;;;;;;;:::i;:::-;:48;;;;;;-1:-1:-1;;;;;35295:48:0;;;-1:-1:-1;;;35295:48:0;;;;:40;;;;;;;;;:48;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34057:1298:0;29625:5737;;;;;;;;;29480:5882;;;:::o;53382:385::-;53440:40;53459:10;53471:8;53440:18;:40::i;:::-;53432:85;;;;-1:-1:-1;;;53432:85:0;;15244:2:1;53432:85:0;;;15226:21:1;;;15263:18;;;15256:30;15322:34;15302:18;;;15295:62;15374:18;;53432:85:0;15042:356:1;53432:85:0;53530:13;16701:19;;;:9;:19;;;;;;-1:-1:-1;;;;;16701:19:0;;53603:29;;16701:19;53603:7;:29::i;:::-;53668:38;53685:10;53697:8;53668:16;:38::i;:::-;53722:37;;53750:8;;53746:1;;-1:-1:-1;;;;;53722:37:0;;;;;53746:1;;53722:37;53421:346;53382:385;:::o;39768:678::-;39855:4;;11256:7;;39892:32;39910:14;39892:15;:32;:::i;:::-;39891:41;;;;:::i;:::-;:48;;;;:::i;:::-;39872:67;;40006:1;39997:6;:10;39989:19;;;;;;40069:15;40055:11;:29;40047:80;;;;-1:-1:-1;;;40047:80:0;;15605:2:1;40047:80:0;;;15587:21:1;15644:2;15624:18;;;15617:30;15683:34;15663:18;;;15656:62;-1:-1:-1;;;15734:18:1;;;15727:36;15780:19;;40047:80:0;15403:402:1;40047:80:0;40161:25;11303:15;40161;:25;:::i;:::-;40146:11;:40;;40138:83;;;;-1:-1:-1;;;40138:83:0;;11405:2:1;40138:83:0;;;11387:21:1;11444:2;11424:18;;;11417:30;11483:32;11463:18;;;11456:60;11533:18;;40138:83:0;11203:354:1;40138:83:0;40236:7;;40234:9;;;;;:::i;:::-;;;;-1:-1:-1;40270:7:0;;40288:20;40294:3;40270:7;40288:5;:20::i;:::-;-1:-1:-1;40365:16:0;;;;:6;:16;;;;;;;;;40321:91;;;;;;;;;;;;;;;;;;;;;;;40334:8;;40344:6;;40352:11;;40321:12;:91::i;:::-;40430:8;39768:678;-1:-1:-1;;;;;39768:678:0:o;48999:791::-;49070:4;49087:23;49113:5;49087:31;;49129:8;11256:7;;49141:10;:13;;;:20;;;;:::i;:::-;49140:29;;;;:::i;:::-;49129:40;;49185:6;49180:472;49201:3;49197:1;:7;49180:472;;;49226:11;11256:7;49226:11;;:::i;:::-;;;49252:14;49295:1;49289:3;:7;49285:124;;;49323:1;49317:7;;49285:124;;;-1:-1:-1;49375:18:0;;;;:13;:18;;;;;;;;49285:124;49481:13;;;;49475:19;;:3;:19;:::i;:::-;49442:10;:16;;;:54;;;;:::i;:::-;49423:73;;:10;;:73;;;;;:::i;:::-;;;;;-1:-1:-1;49515:8:0;;;49511:54;;;49544:5;;;49511:54;49599:7;49579:10;:16;;:27;;;;;;;:::i;:::-;;;;;-1:-1:-1;;49621:13:0;;;:19;;;49206:3;;;:::i;:::-;;;49180:472;;;;49686:1;49668:10;:15;;;:19;;;49664:71;;;49722:1;49704:19;;49664:71;-1:-1:-1;49765:15:0;-1:-1:-1;;;;;49752:30:0;;48999:791;-1:-1:-1;;;48999:791:0:o;46904:1690::-;46980:4;47118:12;47108:6;:22;;47101:30;;;;:::i;:::-;47170:9;47206:26;;;:16;:26;;;;;;47170:9;47243:391;47264:3;47260:1;:7;47243:391;;;47359:4;47351;:12;47347:58;;47384:5;;47347:58;47419:9;47451:1;47432:11;47439:4;47432;:11;:::i;:::-;:15;;47446:1;47432:15;:::i;:::-;47431:21;;;;:::i;:::-;47471:28;;;;:18;:28;;;;;47419:33;;-1:-1:-1;47513:6:0;;47419:33;47471:34;;;;;;;:::i;:::-;;;;:38;;;:48;47467:156;;47547:4;47540:11;;47467:156;;;47599:8;47606:1;47599:4;:8;:::i;:::-;47592:15;;47467:156;-1:-1:-1;47269:3:0;;;:::i;:::-;;;47243:391;;;-1:-1:-1;47646:19:0;47668:28;;;:18;:28;;;;;47697:4;47668:34;;;;;;;:::i;:::-;47646:56;;;;;;;;47668:34;;;;;;;;47646:56;;;;;;;;-1:-1:-1;;;47646:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;47732:5;47646:56;;-1:-1:-1;;47762:36:0;47780:6;47732:5;47762:17;:36::i;:::-;47809:20;47832:21;;;:13;:21;;;;;;;;47809:44;;;;;;;;;;;;;;;-1:-1:-1;;;47809:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47748:50;;-1:-1:-1;47809:20:0;47918:18;;;47914:311;;;47953:20;47976:13;47953:20;47990:10;:6;47999:1;47990:10;:::i;:::-;47976:25;;;;;;;;;;;;;;-1:-1:-1;47976:25:0;47953:48;;;;;;;;;;;;;;;-1:-1:-1;;;47953:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48040:11;;;47953:48;;-1:-1:-1;48026:25:0;;48040:11;48026:25;:::i;:::-;48016:35;;48085:7;:10;;;48072:7;:10;;;:23;;;;:::i;:::-;48066:29;;47938:169;47914:311;;;48153:11;;;;48138:26;;:12;:26;:::i;:::-;48128:36;;48203:7;:10;;;48185:15;:28;;;;:::i;:::-;48179:34;;47914:311;48253:10;;;;48278:12;;48274:99;;48354:7;48338;:11;;;48329:6;:20;;;;:::i;:::-;48322:28;;:3;:28;:::i;:::-;48321:40;;;;:::i;:::-;48307:54;;;;:::i;:::-;;;48274:99;48442:9;;;;48429:22;;:10;:22;:::i;:::-;48400:6;:12;;;:53;;;;:::i;:::-;48385:68;;:6;;:68;;;;;:::i;:::-;;;;;;;;48468:11;;48483:1;48468:16;;;;-1:-1:-1;48464:123:0;;-1:-1:-1;;48521:11:0;;-1:-1:-1;;;;;48508:26:0;;-1:-1:-1;48501:33:0;;-1:-1:-1;;;;;;48501:33:0;48464:123;48574:1;48567:8;;;;;;;;;;;;;44331:583;44410:4;;44489:9;44410:4;44509:376;44530:3;44526:1;:7;44509:376;;;44625:4;44617;:12;44613:58;;44650:5;;44613:58;44685:9;44717:1;44698:11;44705:4;44698;:11;:::i;:::-;:15;;44712:1;44698:15;:::i;:::-;44697:21;;;;:::i;:::-;44737:19;;;;:13;:19;;;;;:23;;;44685:33;;-1:-1:-1;44737:33:0;-1:-1:-1;44733:141:0;;44798:4;44791:11;;44733:141;;;44850:8;44857:1;44850:4;:8;:::i;:::-;44843:15;;44733:141;-1:-1:-1;44535:3:0;;;:::i;:::-;;;44509:376;;;-1:-1:-1;44902:4:0;;44331:583;-1:-1:-1;;;;44331:583:0:o;35705:1357::-;35908:28;35985:6;35939:14;;36013:22;36029:6;35985;36013:22;:::i;:::-;36004:6;:31;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;36127:14:0;;36143:11;;;;;36108:14;;;36088:67;;;;;36248:40;;36280:6;;36127:7;;36248:40;;36280:6;;36248:40;:::i;:::-;;;;;-1:-1:-1;36303:16:0;;36299:74;;36336:11;;;:25;;;36299:74;36383:16;;;;:6;:16;;;;;;;;:26;;;;-1:-1:-1;;;;;;36383:26:0;-1:-1:-1;;;;;36383:26:0;;;;;;;;;;;;;36661:42;36383:16;36683:10;36383:26;36661:11;:42::i;:::-;36731:10;36756:11;;;;;:53;;-1:-1:-1;36787:22:0;36771:12;:38;;;;;;;;:::i;:::-;;;36756:53;36752:149;;;36833:55;;-1:-1:-1;;;36833:55:0;;-1:-1:-1;;;;;16200:15:1;;;36833:55:0;;;16182:34:1;36874:4:0;16232:18:1;;;16225:43;16284:18;;;16277:34;;;36840:5:0;36833:26;;;;16117:18:1;;36833:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36826:63;;;;:::i;:::-;36950:7;:11;;;36926:4;-1:-1:-1;;;;;36918:75:0;;36932:8;36942:6;36963:12;36977:15;36918:75;;;;;;;;;:::i;:::-;;;;;;;;37009:45;37016:13;37031:22;37047:6;37016:13;37031:22;:::i;:::-;37009:45;;;8758:25:1;;;8814:2;8799:18;;8792:34;;;;8731:18;37009:45:0;;;;;;;35897:1165;;;;35705:1357;;;;;:::o;45194:531::-;45264:4;45295:26;;;:16;:26;;;;;;45336:11;45332:386;;45371:1;45364:8;;;;;45332:386;45405:23;45431:28;;;:18;:28;;;;;45460:6;45431:36;;;;;;;:::i;:::-;45405:62;;;;;;;;45431:36;;;;;;;;;45405:62;;;;;;;;-1:-1:-1;;;45405:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45527:34:0;;45534:2;45527:34;:::i;:::-;45501:10;:16;;;:61;;;;:::i;:::-;45482:80;;:10;;:80;;;;;:::i;:::-;;;;;;;;45581:15;;45599:1;45581:19;;;45577:79;;-1:-1:-1;45577:79:0;;45639:1;45621:19;;45577:79;45689:15;45682:23;;;-1:-1:-1;45670:36:0;;-1:-1:-1;45670:36:0;51363:1292;51468:20;51501:264;;;;;;;;;;;;;;;;;;;51809:6;51827:18;51836:8;51827;:18::i;:::-;51792:98;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51776:115;;51935:6;51957:20;51966:10;51957:8;:20::i;:::-;51918:104;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51902:121;;52067:6;52090:21;52099:11;52090:8;:21::i;:::-;52050:106;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52034:123;;52201:6;52219:16;52228:6;52219:8;:16::i;:::-;52184:69;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52168:86;;52267:18;52288:276;52352:18;52361:8;52352;:18::i;:::-;52526:28;52546:6;52526:13;:28::i;:::-;52315:246;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52288:13;:276::i;:::-;52267:297;;52641:4;52591:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;52575:72;;51490:1165;51363:1292;;;;;;:::o;21232:324::-;21370:19;;;;:9;:19;;;;;;-1:-1:-1;;;;;21370:29:0;;;:19;;:29;21363:37;;;;:::i;:::-;21450:1;21415:23;;;:13;:23;;;;;;-1:-1:-1;;;;;21415:23:0;:37;21411:138;;21535:1;21501:23;;;:13;:23;;;;;:36;;-1:-1:-1;;;;;;21501:36:0;;;21411:138;21232:324;;:::o;20692:422::-;20830:19;;;;:9;:19;;;;;;-1:-1:-1;;;;;20830:28:0;;;:19;;:28;20823:36;;;;:::i;:::-;20929:1;20899:19;;;:9;:19;;;;;:32;;-1:-1:-1;;;;;;20899:32:0;;;20988:42;21014:5;20909:8;20988:25;:42::i;:::-;-1:-1:-1;;;;;21075:26:0;;;;;;:19;:26;;;;;:31;;21105:1;;21075:26;:31;;21105:1;;21075:31;:::i;:::-;;;;-1:-1:-1;;;;20692:422:0:o;20176:402::-;20336:1;20305:19;;;:9;:19;;;;;;-1:-1:-1;;;;;20305:19:0;:33;20298:41;;;;:::i;:::-;20379:19;;;;:9;:19;;;;;;;;:25;;-1:-1:-1;;;;;;20379:25:0;-1:-1:-1;;;;;20379:25:0;;;;;;;;16119:27;;;:19;:27;;;;;;;;18765:20;:25;;;;;:40;;;;;;;;:51;;;18827:27;;;:17;:27;;;;;:43;;;;20541:24;;;;;;:29;;-1:-1:-1;;20379:19:0;20541:29;;-1:-1:-1;;20541:29:0;:::i;28867:327::-;28928:4;-1:-1:-1;;;;;28996:17:0;;28989:25;;;;:::i;:::-;29087:26;29099:3;29104:8;29087:11;:26::i;:::-;29129:35;;29155:8;;-1:-1:-1;;;;;29129:35:0;;;29146:1;;29129:35;;29146:1;;29129:35;-1:-1:-1;29182:4:0;28867:327;;;;:::o;52663:711::-;52716:13;52937:10;52933:53;;-1:-1:-1;;52964:10:0;;;;;;;;;;;;-1:-1:-1;;;52964:10:0;;;;;52663:711::o;52933:53::-;53008:5;52996:9;53046:78;53053:9;;53046:78;;53079:8;;;;:::i;:::-;;-1:-1:-1;53102:10:0;;-1:-1:-1;53110:2:0;53102:10;;:::i;:::-;;;53046:78;;;53134:19;53166:6;53156:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53156:17:0;;53134:39;;53184:151;53191:10;;53184:151;;53218:11;53228:1;53218:11;;:::i;:::-;;-1:-1:-1;53284:10:0;53292:2;53284:5;:10;:::i;:::-;53274:21;;:2;:21;:::i;:::-;53261:36;;53244:6;53251;53244:14;;;;;;;;:::i;:::-;;;;:53;-1:-1:-1;;;;;53244:53:0;;;;;;;;-1:-1:-1;53312:11:0;53321:2;53312:11;;:::i;:::-;;;53184:151;;1077:1601;1172:11;;1135:13;;1198:8;1194:23;;-1:-1:-1;;1208:9:0;;;;;;;;;-1:-1:-1;1208:9:0;;;1077:1601;-1:-1:-1;1077:1601:0:o;1194:23::-;1269:15;1304:1;1293:7;:3;1299:1;1293:7;:::i;:::-;1292:13;;;;:::i;:::-;1287:19;;:1;:19;:::i;:::-;1269:37;-1:-1:-1;1364:19:0;1396:15;1269:37;1409:2;1396:15;:::i;:::-;1386:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1386:26:0;;1364:48;;1425:18;1446:5;;;;;;;;;;;;;;;;;1425:26;;1515:1;1508:5;1504:13;1560:2;1552:6;1548:15;1611:1;1579:777;1634:3;1631:1;1628:10;1579:777;;;1689:1;1732:12;;;;;1726:19;1827:4;1815:2;1811:14;;;;;1793:40;;1787:47;1936:2;1932:14;;;1928:25;;1914:40;;1908:47;2065:1;2061:13;;;2057:24;;2043:39;;2037:46;2185:16;;;;2171:31;;2165:38;1863:1;1859:11;;;1957:4;1904:58;;;1895:68;1988:11;;2033:57;;;2024:67;;;;2116:11;;2161:49;;2152:59;2240:3;2236:13;2269:22;;2339:1;2324:17;;;;1682:9;1579:777;;;1583:44;2388:1;2383:3;2379:11;2409:1;2404:84;;;;2507:1;2502:82;;;;2372:212;;2404:84;-1:-1:-1;;;;;2437:17:0;;2430:43;2404:84;;2502:82;-1:-1:-1;;;;;2535:17:0;;2528:41;2372:212;-1:-1:-1;;;2600:26:0;;;2607:6;1077:1601;-1:-1:-1;;;;1077:1601:0:o;19058:1011::-;-1:-1:-1;;;;;16119:27:0;;19162:18;16119:27;;;:19;:27;;;;;;19183:17;;19199:1;;19183:17;:::i;:::-;19211:18;19232:27;;;:17;:27;;;;;;19162:38;;-1:-1:-1;19276:30:0;;;19272:790;;;-1:-1:-1;;;;;19367:27:0;;19412:1;19367:27;;;:20;:27;;;;;;;;:42;;;;;;;;:46;;;19469:27;;;:17;:27;;;;;:31;19272:790;;;-1:-1:-1;;;;;19552:27:0;;;;19533:16;19552:27;;;:20;:27;;;;;;;;:42;;;;;;;;;;;19675;;;;;;:56;;;19787:30;;:17;:30;;;;;;:46;;;;19917;;;;20019:27;;;;;:31;19058:1011::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:::-;1079:3;1117:5;1111:12;1144:6;1139:3;1132:19;1160:63;1216:6;1209:4;1204:3;1200:14;1193:4;1186:5;1182:16;1160:63;:::i;:::-;1277:2;1256:15;-1:-1:-1;;1252:29:1;1243:39;;;;1284:4;1239:50;;1037:258;-1:-1:-1;;1037:258:1:o;1300:220::-;1449:2;1438:9;1431:21;1412:4;1469:45;1510:2;1499:9;1495:18;1487:6;1469:45;:::i;1525:180::-;1584:6;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;-1:-1:-1;1676:23:1;;1525:180;-1:-1:-1;1525:180:1:o;1918:173::-;1986:20;;-1:-1:-1;;;;;2035:31:1;;2025:42;;2015:70;;2081:1;2078;2071:12;2015:70;1918:173;;;:::o;2096:254::-;2164:6;2172;2225:2;2213:9;2204:7;2200:23;2196:32;2193:52;;;2241:1;2238;2231:12;2193:52;2264:29;2283:9;2264:29;:::i;:::-;2254:39;2340:2;2325:18;;;;2312:32;;-1:-1:-1;;;2096:254:1:o;2355:248::-;2423:6;2431;2484:2;2472:9;2463:7;2459:23;2455:32;2452:52;;;2500:1;2497;2490:12;2452:52;-1:-1:-1;;2523:23:1;;;2593:2;2578:18;;;2565:32;;-1:-1:-1;2355:248:1:o;3032:328::-;3109:6;3117;3125;3178:2;3166:9;3157:7;3153:23;3149:32;3146:52;;;3194:1;3191;3184:12;3146:52;3217:29;3236:9;3217:29;:::i;:::-;3207:39;;3265:38;3299:2;3288:9;3284:18;3265:38;:::i;:::-;3255:48;;3350:2;3339:9;3335:18;3322:32;3312:42;;3032:328;;;;;:::o;3750:186::-;3809:6;3862:2;3850:9;3841:7;3837:23;3833:32;3830:52;;;3878:1;3875;3868:12;3830:52;3901:29;3920:9;3901:29;:::i;3941:118::-;4027:5;4020:13;4013:21;4006:5;4003:32;3993:60;;4049:1;4046;4039:12;4064:315;4129:6;4137;4190:2;4178:9;4169:7;4165:23;4161:32;4158:52;;;4206:1;4203;4196:12;4158:52;4229:29;4248:9;4229:29;:::i;:::-;4219:39;;4308:2;4297:9;4293:18;4280:32;4321:28;4343:5;4321:28;:::i;:::-;4368:5;4358:15;;;4064:315;;;;;:::o;4651:127::-;4712:10;4707:3;4703:20;4700:1;4693:31;4743:4;4740:1;4733:15;4767:4;4764:1;4757:15;4783:1138;4878:6;4886;4894;4902;4955:3;4943:9;4934:7;4930:23;4926:33;4923:53;;;4972:1;4969;4962:12;4923:53;4995:29;5014:9;4995:29;:::i;:::-;4985:39;;5043:38;5077:2;5066:9;5062:18;5043:38;:::i;:::-;5033:48;;5128:2;5117:9;5113:18;5100:32;5090:42;;5183:2;5172:9;5168:18;5155:32;5206:18;5247:2;5239:6;5236:14;5233:34;;;5263:1;5260;5253:12;5233:34;5301:6;5290:9;5286:22;5276:32;;5346:7;5339:4;5335:2;5331:13;5327:27;5317:55;;5368:1;5365;5358:12;5317:55;5404:2;5391:16;5426:2;5422;5419:10;5416:36;;;5432:18;;:::i;:::-;5507:2;5501:9;5475:2;5561:13;;-1:-1:-1;;5557:22:1;;;5581:2;5553:31;5549:40;5537:53;;;5605:18;;;5625:22;;;5602:46;5599:72;;;5651:18;;:::i;:::-;5691:10;5687:2;5680:22;5726:2;5718:6;5711:18;5766:7;5761:2;5756;5752;5748:11;5744:20;5741:33;5738:53;;;5787:1;5784;5777:12;5738:53;5843:2;5838;5834;5830:11;5825:2;5817:6;5813:15;5800:46;5888:1;5883:2;5878;5870:6;5866:15;5862:24;5855:35;5909:6;5899:16;;;;;;;4783:1138;;;;;;;:::o;5926:322::-;6003:6;6011;6019;6072:2;6060:9;6051:7;6047:23;6043:32;6040:52;;;6088:1;6085;6078:12;6040:52;6124:9;6111:23;6101:33;;6181:2;6170:9;6166:18;6153:32;6143:42;;6204:38;6238:2;6227:9;6223:18;6204:38;:::i;:::-;6194:48;;5926:322;;;;;:::o;6253:260::-;6321:6;6329;6382:2;6370:9;6361:7;6357:23;6353:32;6350:52;;;6398:1;6395;6388:12;6350:52;6421:29;6440:9;6421:29;:::i;:::-;6411:39;;6469:38;6503:2;6492:9;6488:18;6469:38;:::i;:::-;6459:48;;6253:260;;;;;:::o;6518:127::-;6579:10;6574:3;6570:20;6567:1;6560:31;6610:4;6607:1;6600:15;6634:4;6631:1;6624:15;6650:127;6711:10;6706:3;6702:20;6699:1;6692:31;6742:4;6739:1;6732:15;6766:4;6763:1;6756:15;6782:331;6984:2;6966:21;;;7023:1;7003:18;;;6996:29;-1:-1:-1;;;7056:2:1;7041:18;;7034:38;7104:2;7089:18;;6782:331::o;7469:127::-;7530:10;7525:3;7521:20;7518:1;7511:31;7561:4;7558:1;7551:15;7585:4;7582:1;7575:15;7601:125;7641:4;7669:1;7666;7663:8;7660:34;;;7674:18;;:::i;:::-;-1:-1:-1;7711:9:1;;7601:125::o;8010:245::-;8077:6;8130:2;8118:9;8109:7;8105:23;8101:32;8098:52;;;8146:1;8143;8136:12;8098:52;8178:9;8172:16;8197:28;8219:5;8197:28;:::i;8837:128::-;8877:3;8908:1;8904:6;8901:1;8898:13;8895:39;;;8914:18;;:::i;:::-;-1:-1:-1;8950:9:1;;8837:128::o;8970:168::-;9010:7;9076:1;9072;9068:6;9064:14;9061:1;9058:21;9053:1;9046:9;9039:17;9035:45;9032:71;;;9083:18;;:::i;:::-;-1:-1:-1;9123:9:1;;8970:168::o;9143:127::-;9204:10;9199:3;9195:20;9192:1;9185:31;9235:4;9232:1;9225:15;9259:4;9256:1;9249:15;9275:120;9315:1;9341;9331:35;;9346:18;;:::i;:::-;-1:-1:-1;9380:9:1;;9275:120::o;9751:400::-;9953:2;9935:21;;;9992:2;9972:18;;;9965:30;10031:34;10026:2;10011:18;;10004:62;-1:-1:-1;;;10097:2:1;10082:18;;10075:34;10141:3;10126:19;;9751:400::o;11562:489::-;-1:-1:-1;;;;;11831:15:1;;;11813:34;;11883:15;;11878:2;11863:18;;11856:43;11930:2;11915:18;;11908:34;;;11978:3;11973:2;11958:18;;11951:31;;;11756:4;;11999:46;;12025:19;;12017:6;11999:46;:::i;12056:249::-;12125:6;12178:2;12166:9;12157:7;12153:23;12149:32;12146:52;;;12194:1;12191;12184:12;12146:52;12226:9;12220:16;12245:30;12269:5;12245:30;:::i;13085:305::-;13124:1;13166;13162:2;13151:17;13203:1;13199:2;13188:17;13224:3;13214:37;;13231:18;;:::i;:::-;-1:-1:-1;;;;;;13267:48:1;;-1:-1:-1;;13317:15:1;;13263:70;13260:96;;;13336:18;;:::i;:::-;13370:14;;;13085:305;-1:-1:-1;;;13085:305:1:o;13395:698::-;13434:7;13482:1;13478:2;13467:17;13519:1;13515:2;13504:17;-1:-1:-1;;;;;13602:1:1;13597:3;13593:11;13632:1;13627:3;13623:11;13679:3;13675:2;13671:12;13666:3;13663:21;13658:2;13654;13650:11;13646:39;13643:65;;;13688:18;;:::i;:::-;-1:-1:-1;;;;;;13794:1:1;13785:11;;13812;;;13834:13;;;13825:23;;13808:41;13805:67;;;13852:18;;:::i;:::-;13900:1;13895:3;13891:11;13881:21;;13949:3;13945:2;13940:13;13935:3;13931:23;13926:2;13922;13918:11;13914:41;13911:67;;;13958:18;;:::i;:::-;14025:3;14021:2;14016:13;14011:3;14007:23;14002:2;13998;13994:11;13990:41;13987:67;;;14034:18;;:::i;:::-;-1:-1:-1;;;14074:13:1;;;;;13395:698;-1:-1:-1;;;;;13395:698:1:o;14098:398::-;14137:4;14182:1;14178:2;14167:17;14219:1;14215:2;14204:17;14249:1;14244:3;14240:11;14333:3;-1:-1:-1;;;;;14292:39:1;14288:49;14283:3;14279:59;14274:2;14267:10;14263:76;14260:102;;;14342:18;;:::i;:::-;14431:3;-1:-1:-1;;;;;14391:44:1;14386:3;14382:54;14378:2;14374:63;14371:89;;;14440:18;;:::i;:::-;-1:-1:-1;14477:13:1;;;14098:398;-1:-1:-1;;;14098:398:1:o;14501:396::-;14540:3;14584:1;14580:2;14569:17;14621:1;14617:2;14606:17;14651:1;14646:3;14642:11;14730:3;-1:-1:-1;;;;;14690:44:1;14685:3;14681:54;14676:2;14669:10;14665:71;14662:97;;;14739:18;;:::i;:::-;14833:3;-1:-1:-1;;;;;14792:39:1;14788:49;14783:3;14779:59;14775:2;14771:68;14768:94;;;14842:18;;:::i;:::-;-1:-1:-1;14878:13:1;;14501:396;-1:-1:-1;;;14501:396:1:o;14902:135::-;14941:3;-1:-1:-1;;14962:17:1;;14959:43;;;14982:18;;:::i;:::-;-1:-1:-1;15029:1:1;15018:13;;14902:135::o;15810:127::-;15871:10;15866:3;15862:20;15859:1;15852:31;15902:4;15899:1;15892:15;15926:4;15923:1;15916:15;16322:557;16566:25;;;16622:2;16607:18;;16600:34;;;16553:3;16538:19;;16664:1;16653:13;;16643:144;;16709:10;16704:3;16700:20;16697:1;16690:31;16744:4;16741:1;16734:15;16772:4;16769:1;16762:15;16643:144;16818:2;16803:18;;16796:34;;;;16861:2;16846:18;16839:34;16322:557;;-1:-1:-1;;16322:557:1:o;16884:267::-;16923:4;16952:9;;;16977:10;;-1:-1:-1;;;16996:19:1;;16989:27;;16973:44;16970:70;;;17020:18;;:::i;:::-;-1:-1:-1;;;;;17067:27:1;;17060:35;;17052:44;;17049:70;;;17099:18;;:::i;:::-;-1:-1:-1;;17136:9:1;;16884:267::o;17156:895::-;17537:3;17575:6;17569:13;17591:53;17637:6;17632:3;17625:4;17617:6;17613:17;17591:53;:::i;:::-;-1:-1:-1;;;17666:16:1;;;17691:23;;;17739:13;;17761:65;17739:13;17813:1;17802:13;;17795:4;17783:17;;17761:65;:::i;:::-;17893:66;17889:1;17845:20;;;;17881:10;;;17874:86;-1:-1:-1;;;17984:2:1;17976:11;;17969:49;18042:2;18034:11;;17156:895;-1:-1:-1;;;;17156:895:1:o;18056:901::-;18437:3;18475:6;18469:13;18491:53;18537:6;18532:3;18525:4;18517:6;18513:17;18491:53;:::i;:::-;-1:-1:-1;;;18566:16:1;;;18591:27;;;18643:13;;18665:66;18643:13;18717:2;18706:14;;18699:4;18687:17;;18665:66;:::i;:::-;18799;18794:2;18750:20;;;;18786:11;;;18779:87;-1:-1:-1;;;18890:2:1;18882:11;;18875:49;18948:2;18940:11;;18056:901;-1:-1:-1;;;;18056:901:1:o;18962:902::-;19343:3;19381:6;19375:13;19397:53;19443:6;19438:3;19431:4;19423:6;19419:17;19397:53;:::i;:::-;-1:-1:-1;;;19472:16:1;;;19497:28;;;19550:13;;19572:66;19550:13;19624:2;19613:14;;19606:4;19594:17;;19572:66;:::i;:::-;19706;19701:2;19657:20;;;;19693:11;;;19686:87;-1:-1:-1;;;19797:2:1;19789:11;;19782:49;19855:2;19847:11;;18962:902;-1:-1:-1;;;;18962:902:1:o;19869:786::-;20250:3;20288:6;20282:13;20304:53;20350:6;20345:3;20338:4;20330:6;20326:17;20304:53;:::i;:::-;-1:-1:-1;;;20379:16:1;;;20404:23;;;20452:13;;20474:65;20452:13;20526:1;20515:13;;20508:4;20496:17;;20474:65;:::i;:::-;-1:-1:-1;;;20602:1:1;20558:20;;;;20594:10;;;20587:35;20646:2;20638:11;;19869:786;-1:-1:-1;;;;19869:786:1:o;20660:1301::-;-1:-1:-1;;;21160:57:1;;21240:13;;21142:3;;21262:62;21240:13;21312:2;21303:12;;21296:4;21284:17;;21262:62;:::i;:::-;21388:66;21383:2;21343:16;;;21375:11;;;21368:87;21484:34;21479:2;21471:11;;21464:55;21548:34;21543:2;21535:11;;21528:55;21613:66;21607:3;21599:12;;21592:88;-1:-1:-1;;;21704:3:1;21696:12;;21689:46;21760:13;;21782:64;21760:13;21831:3;21823:12;;21816:4;21804:17;;21782:64;:::i;:::-;-1:-1:-1;;;21906:3:1;21865:17;;;;21898:12;;;21891:36;21951:3;21943:12;;20660:1301;-1:-1:-1;;;;20660:1301:1:o;21966:448::-;22228:31;22223:3;22216:44;22198:3;22289:6;22283:13;22305:62;22360:6;22355:2;22350:3;22346:12;22339:4;22331:6;22327:17;22305:62;:::i;:::-;22387:16;;;;22405:2;22383:25;;21966:448;-1:-1:-1;;21966:448:1:o;22419:112::-;22451:1;22477;22467:35;;22482:18;;:::i;:::-;-1:-1:-1;22516:9:1;;22419:112::o
Swarm Source
ipfs://b8e45eee268a0b58708b81f2c83a4becdc8e9d194923a2690bdc24a6dd20b837
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.