ETH Price: $3,452.11 (-1.08%)
Gas: 12 Gwei

Token

Hatchlingz (HTLZ)
 

Overview

Max Total Supply

413 HTLZ

Holders

159

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
bam17.eth
Balance
2 HTLZ
0x8ba45ad7f325c8db0a33b9490b97bf2583cc61f7
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Hatchlingz

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 6 of 13: Hatchlingz.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Ownable.sol";
import "./ERC721Enumerable.sol";
import "./Strings.sol";


interface IYolk {
    function burn (address from, uint256 amount) external;
    function updateReward (address from, address to) external;
}


contract Hatchlingz is ERC721, ERC721Enumerable, Ownable {
  
    IYolk public Yolk;

    using Strings for uint256;
    using Strings for uint8;

    bool public isSaleActive = false;
    bool public isAllowListActive = false;
    bool public isLayingEggActive = false;
    
    string private _baseURIextended;


    // Numerical Constants
    uint16 public constant MAX_SUPPLY = 10000;
    uint8 public constant MAX_PUBLIC_MINT = 6;
    uint256 public constant PRICE_PER_TOKEN = 0.085 ether;

    uint8 public constant HATCH_ODDS = 3;
    uint8 public constant HATCH_ODDS_FIFTY = 2;

    uint256 public constant PAYTOHATCH_THIRTY = 30 ether;
    uint256 public constant PAYTOHATCH_FIFTY = 50 ether;
    uint256 public constant PAYTOHATCH_HUNDRED = 100 ether;
    
    // String Constants
    string public constant phoenix = "phoenix";
    string public constant dragon = "dragon";
    string public constant chicken = "chicken";
    string public constant egg = "egg";
    string public constant generation = "gen1";

    //track wallet balance for each type after hatching
    mapping(address => uint256) public _walletBalanceOfLegendary;
    mapping(address => uint256) public _walletBalanceOfRare;
    mapping(address => uint256) public _walletBalanceOfCommon;
    mapping(address => uint256) public _walletBalanceOfEggs;
    mapping(uint256 => string) public _tokenMetadata;
    mapping(uint256 => bool) public _isTokenHatched;
    
    uint256 public commonMetadataCount = 1;
    uint256 public rareMetadataCount = 6001;
    uint256 public legendaryMetadataCount = 9001;

    mapping(address => uint8) private _allowList;

    modifier HatchlingzOwner(uint256 tokenId) {
        require(ownerOf(tokenId) == msg.sender, "Cannot interact with a Hatchlingz you do not own");
        _;
    }

    constructor() ERC721 ("Hatchlingz", "HTLZ") { }

    function setIsAllowListActive(bool _isAllowListActive) external onlyOwner {
        isAllowListActive = _isAllowListActive;
    }

    function setAllowList(address[] calldata addresses, uint8 numAllowedToMint) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            _allowList[addresses[i]] = numAllowedToMint;
        }
    }  
    
    function setSaleState(bool newState) public onlyOwner {
        isSaleActive = newState;
    }
    
    function numAvailableToMint(address addr) external view returns (uint8) {
        return _allowList[addr];
    }
 

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function setBaseURI(string memory baseURI_) virtual external onlyOwner {
        _baseURIextended = baseURI_;
    }
  
     function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
      
        string memory URIString = _tokenMetadata[tokenId];
      
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, URIString,".json")) : "";
    }
 
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIextended;
    }
    
    function setYolk(address yolkAddress) external onlyOwner {
        Yolk = IYolk(yolkAddress);
    }
  
    function reserveEggs(address to, uint8 n) public onlyOwner {
        uint256 supply = totalSupply();
        require( supply + n <= MAX_SUPPLY, "reserving too many");
        
        Yolk.updateReward(to, address(0));
        _walletBalanceOfEggs[to] += n;

        for (uint8 i = 1; i <= n; i++) {
            uint256 currentToken = supply+i;
            _tokenMetadata[currentToken] = string(abi.encodePacked(generation,egg));
            _safeMint(to, currentToken);
        }
    }

    //#region MINTING FUNCTIONS 
    function mintAllowList(uint8 numberOfTokens) external payable {

        uint256 ts = totalSupply();

        require(isAllowListActive, "Allowlist inactive.");
        require(!isSaleActive, "Sale must be inactive.");
        require(numberOfTokens <= _allowList[msg.sender] && numberOfTokens > 0, "Exceeded max available to purchase.");
        require(ts + numberOfTokens <= MAX_SUPPLY, "Purchase exceeds MAX_SUPPLY.");
        require(PRICE_PER_TOKEN * numberOfTokens <= msg.value, "Ether value sent incorrect.");

        _allowList[msg.sender] -= numberOfTokens;

        Yolk.updateReward(msg.sender, address(0));
        _walletBalanceOfEggs[msg.sender] += numberOfTokens;

        for (uint256 i = 1; i <= numberOfTokens; ++i) {
            uint256 currentToken = ts+i;
            _tokenMetadata[currentToken] = string(abi.encodePacked(generation,egg));
            _safeMint(msg.sender, currentToken);
            rollForHatch(currentToken, msg.sender, HATCH_ODDS);
        }
    }

    function mint(uint8 numberOfTokens) external payable {

        uint256 ts = totalSupply();
        
        require(isSaleActive, "Sale inactive.");
        require(!isAllowListActive, "AllowList must be inactive.");
        require(numberOfTokens > 0 && numberOfTokens <= MAX_PUBLIC_MINT, "Exceeded max token purchase");
        require(ts + numberOfTokens <= MAX_SUPPLY, "Purchase exceeds MAX_SUPPLY.");
        require(PRICE_PER_TOKEN * numberOfTokens <= msg.value, "Ether value sent incorrect");

        Yolk.updateReward(msg.sender, address(0));
        _walletBalanceOfEggs[msg.sender] += numberOfTokens;

        for (uint256 i = 1; i <= numberOfTokens; ++i) {
            uint256 currentToken = ts + i;
            _tokenMetadata[currentToken] = string(abi.encodePacked(generation,egg));
            _safeMint(msg.sender, currentToken);
            rollForHatch(currentToken, msg.sender, HATCH_ODDS);
        }
    }
    //#endregion MINTING FUNCTIONS 


   
 
    function reserveHatched(uint8 n, uint8 hatchlingType) public onlyOwner {
        uint256 supply = totalSupply();   
        require( hatchlingType == 0 || hatchlingType == 1 || hatchlingType == 2, "you aren't hatching a valid type");
        require( supply + n <= MAX_SUPPLY, "reserving too many");
      
        
        uint8 i;
        Yolk.updateReward(msg.sender, address(0));
        //hatchlingType Enter 0 for common, 1 for rare, 2 for legendary
        
        if (hatchlingType == 2){
            require(n + legendaryMetadataCount <= 10001, "Reserving more Phoenixes than exists.");
            for (i = 1; i <= n; ++i) {
                uint256 currentToken = supply+i;
                 _tokenMetadata[currentToken] = string(abi.encodePacked(phoenix,legendaryMetadataCount.toString()));
                ++_walletBalanceOfLegendary[msg.sender];
                ++legendaryMetadataCount;

                _safeMint(msg.sender, currentToken);
                _isTokenHatched[currentToken] = true;
            }
        } else if (hatchlingType == 1){
            require(n + rareMetadataCount <= 9001, "Reserving more Dragons than exists.");
            for (i = 1; i <= n; ++i) {
                uint256 currentToken = supply+i;
                 _tokenMetadata[currentToken] = string(abi.encodePacked(dragon,rareMetadataCount.toString()));
                ++_walletBalanceOfRare[msg.sender];
                ++rareMetadataCount;

                _safeMint(msg.sender, currentToken);
                _isTokenHatched[currentToken] = true;
            } 
        } else if (hatchlingType == 0){
            require(n + commonMetadataCount <= 6001, "Reserving more Chickens than exists.");
            for (i = 1; i <= n; ++i) {
                uint256 currentToken = supply + i;
                 _tokenMetadata[currentToken] = string(abi.encodePacked(chicken,commonMetadataCount.toString()));
                ++_walletBalanceOfCommon[msg.sender];
                ++commonMetadataCount;

                _safeMint(msg.sender, currentToken);
                _isTokenHatched[currentToken] = true;
            }
        }  
    }
    
        
    function _transfer(address from, address to, uint256 tokenId) internal virtual override (ERC721) {
        
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not owned");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
    
        Yolk.updateReward(from, to);
     
        if (!(keccak256(abi.encodePacked(_tokenMetadata[tokenId])) == keccak256(abi.encodePacked(generation,egg)))){
            logTypeUpdates(tokenId, from, to);
        }
        
        if (keccak256(abi.encodePacked(_tokenMetadata[tokenId])) == keccak256(abi.encodePacked(generation,egg))){
            --_walletBalanceOfEggs[from];
            ++_walletBalanceOfEggs[to];
            rollForHatch(tokenId, to, HATCH_ODDS);
        }
        
        --_balances[from];
        ++_balances[to];
        _owners[tokenId] = to;
        
        emit Transfer(from, to, tokenId);
    }
   
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
    
    //using HatchlingzOwner Modifier
    function payYolkRollToHatch(uint256 tokenId) external HatchlingzOwner(tokenId) {
        require(keccak256(abi.encodePacked(_tokenMetadata[tokenId])) == keccak256(abi.encodePacked(generation,egg)), "Your egg or Hatchlingz is not eligible to be hatched!");
        require(!_isTokenHatched[tokenId], "your token is already hatched");

       
        Yolk.burn(msg.sender, PAYTOHATCH_THIRTY);
        
        rollForHatch(tokenId, msg.sender, HATCH_ODDS);
    }

    function payYolkRollToHatchFifty(uint256 tokenId) external HatchlingzOwner(tokenId) {
        require(keccak256(abi.encodePacked(_tokenMetadata[tokenId])) == keccak256(abi.encodePacked(generation,egg)), "Your egg or Hatchlingz is not eligible to be hatched!");
        require(!_isTokenHatched[tokenId], "your token is already hatched");

        
        Yolk.burn(msg.sender, PAYTOHATCH_FIFTY);
        
        rollForHatch(tokenId, msg.sender, HATCH_ODDS_FIFTY);
    }
    
    function payForGuaranteedHatch(uint256 tokenId) external HatchlingzOwner(tokenId) {
        require(keccak256(abi.encodePacked(_tokenMetadata[tokenId])) == keccak256(abi.encodePacked(generation,egg)), "Your egg or Hatchlingz is not eligible to be hatched!");
        require(!_isTokenHatched[tokenId], "your token is already hatched");

     
        Yolk.burn(msg.sender, PAYTOHATCH_HUNDRED);
        
        rollForHatch(tokenId, msg.sender, 1);
    }
    
    function rollForHatch (uint256 tokenId, address to, uint256 odds) internal returns ( string memory){
     
        require(keccak256(abi.encodePacked(_tokenMetadata[tokenId])) == keccak256(abi.encodePacked(generation,"egg")), "Your egg has already hatched or not eligible to hatch!");
        
        uint256 hatchNum = 0;
        uint256 randNumGenerated = randNumGen(tokenId * randNumGen(tokenId, 1000), odds);
        string memory result;
        uint256 tokenMultiplied = tokenId * 123 * randNumGen(tokenId, 1000);
      
        if (hatchNum == randNumGenerated){
            result = "Your egg hatched.";
            uint256 randTypeSelection = randNumGen(tokenMultiplied, 10);
            --_walletBalanceOfEggs[to];
        
            if (randTypeSelection == 1 || randTypeSelection == 0 || randTypeSelection == 2 || randTypeSelection == 4 || randTypeSelection == 6 || randTypeSelection == 8){
                if (commonMetadataCount <= 6000){
                    _tokenMetadata[tokenId] = string(abi.encodePacked(chicken,commonMetadataCount.toString()));
                    ++_walletBalanceOfCommon[to];
                    ++commonMetadataCount;
                } else if (rareMetadataCount <= 9000){
                    _tokenMetadata[tokenId] = string(abi.encodePacked(dragon,rareMetadataCount.toString()));
                    ++_walletBalanceOfRare[to];
                    ++rareMetadataCount;
                } else if (legendaryMetadataCount <= 10000 ) {
                    _tokenMetadata[tokenId] = string(abi.encodePacked(phoenix,legendaryMetadataCount.toString()));
                    ++_walletBalanceOfLegendary[to];
                    ++legendaryMetadataCount;
                }
            } else if (randTypeSelection == 3 || randTypeSelection == 5 || randTypeSelection == 7){
                if (rareMetadataCount <= 9000){
                    _tokenMetadata[tokenId] = string(abi.encodePacked(dragon,rareMetadataCount.toString()));
                    ++_walletBalanceOfRare[to];
                    ++rareMetadataCount;
                } else if (commonMetadataCount <= 6000){
                    _tokenMetadata[tokenId] = string(abi.encodePacked(chicken,commonMetadataCount.toString()));
                    ++_walletBalanceOfCommon[to];
                    ++commonMetadataCount;
                } else if (legendaryMetadataCount <= 10000 ) {
                    _tokenMetadata[tokenId] = string(abi.encodePacked(phoenix,legendaryMetadataCount.toString()));
                    ++_walletBalanceOfLegendary[to];
                    ++legendaryMetadataCount;
                }
            } else if (randTypeSelection == 9){
                if (legendaryMetadataCount <= 10000 ) {
                    _tokenMetadata[tokenId] = string(abi.encodePacked(phoenix,legendaryMetadataCount.toString()));
                    _walletBalanceOfLegendary[to] ++;
                    legendaryMetadataCount ++;
                } else if (rareMetadataCount <= 9000){
                    _tokenMetadata[tokenId] = string(abi.encodePacked(dragon,rareMetadataCount.toString()));
                    ++_walletBalanceOfRare[to];
                    ++rareMetadataCount;
                } else if (commonMetadataCount <= 6000){
                    _tokenMetadata[tokenId] = string(abi.encodePacked(chicken,commonMetadataCount.toString()));
                    ++_walletBalanceOfCommon[to];
                    ++commonMetadataCount;
                }
            }
            _isTokenHatched[tokenId] = true;
        } else {
            result = "Your egg didn't hatch this time, good luck next time!";
        }
        return  result;
    }

    function randNumGen (uint256 tokenId, uint256 mod) internal view returns (uint256) {
        
        uint256 randNumLong = uint(keccak256(abi.encodePacked(tokenId.toString(),msg.sender,block.timestamp)));
       
        uint256 randNum = randNumLong % mod;
        return randNum;
    }
 
 
    function logTypeUpdates(uint256 tokenId, address from, address to) internal {
        require(from == ownerOf(tokenId), "You are not the owner of this egg.");
        string memory temp = subStringWork(_tokenMetadata[tokenId],0,4);
        
        if (keccak256(abi.encodePacked(temp)) == keccak256(abi.encodePacked("phoe"))){
            --_walletBalanceOfLegendary[from];
            ++_walletBalanceOfLegendary[to];
        } else if (keccak256(abi.encodePacked(temp)) == keccak256(abi.encodePacked("drag"))){
            --_walletBalanceOfRare[from];
            ++_walletBalanceOfRare[to];
        } else if (keccak256(abi.encodePacked(temp)) == keccak256(abi.encodePacked("chic"))){
            --_walletBalanceOfCommon[from];
            ++_walletBalanceOfCommon[to];
        }
    }
    
 
    function subStringWork(string memory str, uint8  startIndex, uint8  endIndex) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex-startIndex);
        for(uint i = startIndex; i < endIndex; ++i) {
            result[i-startIndex] = strBytes[i];
        }
        return string(result);
    }
}

File 1 of 13: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
   
    function isContract(address account) internal view returns (bool) {
     

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

  
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

  
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

   
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

   
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

  
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

   
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

   
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

   
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 13: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 3 of 13: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 4 of 13: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;


import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;
     using Strings for uint8;


    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) internal _owners;

    // Mapping owner address to token count
    mapping(address => uint256) internal _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(),".json")) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}

       
       
       
  

 



}

File 5 of 13: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs


    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 7 of 13: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface 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);
}

File 8 of 13: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
    
    
    
}

File 9 of 13: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 10 of 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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(uint256 tokenId) external view returns (string memory);
}

File 11 of 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 12 of 13: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 13 of 13: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[],"name":"HATCH_ODDS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HATCH_ODDS_FIFTY","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYTOHATCH_FIFTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYTOHATCH_HUNDRED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAYTOHATCH_THIRTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Yolk","outputs":[{"internalType":"contract IYolk","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_isTokenHatched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_walletBalanceOfCommon","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_walletBalanceOfEggs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_walletBalanceOfLegendary","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_walletBalanceOfRare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chicken","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"commonMetadataCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dragon","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"egg","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generation","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":[],"name":"isLayingEggActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"legendaryMetadataCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mintAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"numAvailableToMint","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"tokenId","type":"uint256"}],"name":"payForGuaranteedHatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"payYolkRollToHatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"payYolkRollToHatchFifty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"phoenix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rareMetadataCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint8","name":"n","type":"uint8"}],"name":"reserveEggs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"n","type":"uint8"},{"internalType":"uint8","name":"hatchlingType","type":"uint8"}],"name":"reserveHatched","outputs":[],"stateMutability":"nonpayable","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":"addresses","type":"address[]"},{"internalType":"uint8","name":"numAllowedToMint","type":"uint8"}],"name":"setAllowList","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":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isAllowListActive","type":"bool"}],"name":"setIsAllowListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newState","type":"bool"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"yolkAddress","type":"address"}],"name":"setYolk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","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":"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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600b805462ffffff60a01b1916905560016013556117716014556123296015553480156200003157600080fd5b50604080518082018252600a8152692430ba31b43634b733bd60b11b602080830191825283518085019094526004845263242a262d60e11b90840152815191929162000080916000916200010f565b508051620000969060019060208401906200010f565b505050620000b3620000ad620000b960201b60201c565b620000bd565b620001f2565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200011d90620001b5565b90600052602060002090601f0160209004810192826200014157600085556200018c565b82601f106200015c57805160ff19168380011785556200018c565b828001600101855582156200018c579182015b828111156200018c5782518255916020019190600101906200016f565b506200019a9291506200019e565b5090565b5b808211156200019a57600081556001016200019f565b600181811c90821680620001ca57607f821691505b60208210811415620001ec57634e487b7160e01b600052602260045260246000fd5b50919050565b6149ff80620002026000396000f3fe60806040526004361061038c5760003560e01c8063718bc4af116101dc578063aa94b2e111610102578063c4e37095116100a0578063e985e9c51161006f578063e985e9c514610af8578063f031653d14610b41578063f2fde38b14610b61578063fddd5a8414610b8157600080fd5b8063c4e3709514610a73578063c87b56dd14610a93578063d972ea3e14610ab3578063ddff5b1c14610ae557600080fd5b8063b88d4fde116100dc578063b88d4fde146109cb578063c04a2836146109eb578063c06abfc714610a24578063c0e7ec8d14610a5357600080fd5b8063aa94b2e11461095b578063ae6a70ee14610978578063b13237791461099857600080fd5b80638da5cb5b1161017a5780639e166bdf116101495780639e166bdf146108ab578063a22cb465146108de578063a56d8ae9146108fe578063a6587a371461092b57600080fd5b80638da5cb5b14610842578063909d6c8f1461086057806392cbc2881461087657806395d89b411461089657600080fd5b80638295784d116101b65780638295784d146107c3578063833b9499146107e35780638c004c9c146107ff5780638cd91dfe1461081557600080fd5b8063718bc4af146107665780637a8ab7c3146107865780637be2ffc1146107a357600080fd5b806337c1e2dc116102c157806355f804b31161025f57806365f130971161022e57806365f13097146107095780636ecd23061461071e57806370a0823114610731578063715018a61461075157600080fd5b806355f804b31461067b578063564566a81461069b5780636352211e146106bc57806364bff354146106dc57600080fd5b806342842e0e1161029b57806342842e0e146105fb5780634eb964511461061b5780634f6ccce71461063b578063505887771461065b57600080fd5b806337c1e2dc146105b45780633991e074146105c95780633ccfd60b146105e657600080fd5b806318160ddd1161032e5780632f745c59116103085780632f745c591461052a57806332cb6b0c1461054a578063360ef1dc14610573578063375877e61461059457600080fd5b806318160ddd146104d457806323b872dd146104e957806329fc6bae1461050957600080fd5b8063081812fc1161036a578063081812fc14610423578063095ea7b31461045b57806315fd53431461047d57806317219522146104a457600080fd5b806301ffc9a71461039157806304bf4cd5146103c657806306fdde0314610401575b600080fd5b34801561039d57600080fd5b506103b16103ac366004614068565b610b97565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103f36103e13660046140a8565b60106020526000908152604090205481565b6040519081526020016103bd565b34801561040d57600080fd5b50610416610ba8565b6040516103bd919061411b565b34801561042f57600080fd5b5061044361043e36600461412e565b610c3a565b6040516001600160a01b0390911681526020016103bd565b34801561046757600080fd5b5061047b610476366004614147565b610cd4565b005b34801561048957600080fd5b50610492600281565b60405160ff90911681526020016103bd565b3480156104b057600080fd5b506104166040518060400160405280600481526020016367656e3160e01b81525081565b3480156104e057600080fd5b506008546103f3565b3480156104f557600080fd5b5061047b610504366004614171565b610dea565b34801561051557600080fd5b50600b546103b190600160a81b900460ff1681565b34801561053657600080fd5b506103f3610545366004614147565b610e1b565b34801561055657600080fd5b5061056061271081565b60405161ffff90911681526020016103bd565b34801561057f57600080fd5b50600b546103b190600160b01b900460ff1681565b3480156105a057600080fd5b5061047b6105af3660046141be565b610eb1565b3480156105c057600080fd5b50610492600381565b3480156105d557600080fd5b506103f36801a055690d9db8000081565b3480156105f257600080fd5b5061047b611091565b34801561060757600080fd5b5061047b610616366004614171565b6110ee565b34801561062757600080fd5b5061047b61063636600461412e565b611109565b34801561064757600080fd5b506103f361065636600461412e565b61128a565b34801561066757600080fd5b5061047b6106763660046140a8565b61131d565b34801561068757600080fd5b5061047b61069636600461427d565b611369565b3480156106a757600080fd5b50600b546103b190600160a01b900460ff1681565b3480156106c857600080fd5b506104436106d736600461412e565b6113a6565b3480156106e857600080fd5b506103f36106f73660046140a8565b600e6020526000908152604090205481565b34801561071557600080fd5b50610492600681565b61047b61072c3660046142c6565b61141d565b34801561073d57600080fd5b506103f361074c3660046140a8565b611740565b34801561075d57600080fd5b5061047b6117c7565b34801561077257600080fd5b5061047b6107813660046142f1565b6117fd565b34801561079257600080fd5b506103f368056bc75e2d6310000081565b3480156107af57600080fd5b5061047b6107be36600461412e565b611845565b3480156107cf57600080fd5b5061047b6107de36600461430c565b6119c3565b3480156107ef57600080fd5b506103f367012dfb0cb5e8800081565b34801561080b57600080fd5b506103f360135481565b34801561082157600080fd5b506103f36108303660046140a8565b600d6020526000908152604090205481565b34801561084e57600080fd5b50600a546001600160a01b0316610443565b34801561086c57600080fd5b506103f360145481565b34801561088257600080fd5b5061047b61089136600461412e565b611a61565b3480156108a257600080fd5b50610416611be2565b3480156108b757600080fd5b506104166040518060400160405280600781526020016631b434b1b5b2b760c91b81525081565b3480156108ea57600080fd5b5061047b6108f9366004614390565b611bf1565b34801561090a57600080fd5b506103f36109193660046140a8565b600f6020526000908152604090205481565b34801561093757600080fd5b506103b161094636600461412e565b60126020526000908152604090205460ff1681565b34801561096757600080fd5b506103f36802b5e3af16b188000081565b34801561098457600080fd5b5061041661099336600461412e565b611cb6565b3480156109a457600080fd5b50610416604051806040016040528060078152602001660e0d0decadcd2f60cb1b81525081565b3480156109d757600080fd5b5061047b6109e63660046143ba565b611d50565b3480156109f757600080fd5b50610492610a063660046140a8565b6001600160a01b031660009081526016602052604090205460ff1690565b348015610a3057600080fd5b506104166040518060400160405280600381526020016265676760e81b81525081565b348015610a5f57600080fd5b50600b54610443906001600160a01b031681565b348015610a7f57600080fd5b5061047b610a8e3660046142f1565b611d82565b348015610a9f57600080fd5b50610416610aae36600461412e565b611dca565b348015610abf57600080fd5b5061041660405180604001604052806006815260200165323930b3b7b760d11b81525081565b61047b610af33660046142c6565b611f3a565b348015610b0457600080fd5b506103b1610b13366004614436565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610b4d57600080fd5b5061047b610b5c366004614460565b6122b8565b348015610b6d57600080fd5b5061047b610b7c3660046140a8565b612869565b348015610b8d57600080fd5b506103f360155481565b6000610ba282612904565b92915050565b606060008054610bb79061447c565b80601f0160208091040260200160405190810160405280929190818152602001828054610be39061447c565b8015610c305780601f10610c0557610100808354040283529160200191610c30565b820191906000526020600020905b815481529060010190602001808311610c1357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610cb85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610cdf826113a6565b9050806001600160a01b0316836001600160a01b03161415610d4d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610caf565b336001600160a01b0382161480610d695750610d698133610b13565b610ddb5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610caf565b610de58383612929565b505050565b610df43382612997565b610e105760405162461bcd60e51b8152600401610caf906144b7565b610de5838383612a8a565b6000610e2683611740565b8210610e885760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610caf565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610edb5760405162461bcd60e51b8152600401610caf90614508565b6000610ee660085490565b9050612710610ef860ff841683614553565b1115610f3b5760405162461bcd60e51b8152602060048201526012602482015271726573657276696e6720746f6f206d616e7960701b6044820152606401610caf565b600b54604051636918579d60e11b81526001600160a01b038581166004830152600060248301529091169063d230af3a90604401600060405180830381600087803b158015610f8957600080fd5b505af1158015610f9d573d6000803e3d6000fd5b505050506001600160a01b0383166000908152601060205260408120805460ff85169290610fcc908490614553565b90915550600190505b8260ff168160ff161161108b576000610ff160ff831684614553565b90506040518060400160405280600481526020016367656e3160e01b8152506040518060400160405280600381526020016265676760e81b81525060405160200161103d92919061456b565b60408051601f19818403018152918152600083815260116020908152919020825161106d93919290910190613fb9565b506110788582612e29565b50806110838161459a565b915050610fd5565b50505050565b600a546001600160a01b031633146110bb5760405162461bcd60e51b8152600401610caf90614508565b6040514790339082156108fc029083906000818181858888f193505050501580156110ea573d6000803e3d6000fd5b5050565b610de583838360405180602001604052806000815250611d50565b8033611114826113a6565b6001600160a01b03161461113a5760405162461bcd60e51b8152600401610caf906145ba565b604080518082018252600481526367656e3160e01b60208083019190915282518084018452600381526265676760e81b81830152925161117b93910161456b565b60408051601f1981840301815282825280516020918201206000868152601183529290922091926111ad92910161460a565b60405160208183030381529060405280519060200120146111e05760405162461bcd60e51b8152600401610caf906146a6565b60008281526012602052604090205460ff161561120f5760405162461bcd60e51b8152600401610caf906146fb565b600b54604051632770a7eb60e21b81523360048201526802b5e3af16b188000060248201526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561126357600080fd5b505af1158015611277573d6000803e3d6000fd5b50505050610de58233600260ff16612e43565b600061129560085490565b82106112f85760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610caf565b6008828154811061130b5761130b614732565b90600052602060002001549050919050565b600a546001600160a01b031633146113475760405162461bcd60e51b8152600401610caf90614508565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031633146113935760405162461bcd60e51b8152600401610caf90614508565b80516110ea90600c906020840190613fb9565b6000818152600260205260408120546001600160a01b031680610ba25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610caf565b600061142860085490565b600b54909150600160a01b900460ff166114755760405162461bcd60e51b815260206004820152600e60248201526d29b0b6329034b730b1ba34bb329760911b6044820152606401610caf565b600b54600160a81b900460ff16156114cf5760405162461bcd60e51b815260206004820152601b60248201527f416c6c6f774c697374206d75737420626520696e6163746976652e00000000006044820152606401610caf565b60008260ff161180156114e65750600660ff831611155b6115325760405162461bcd60e51b815260206004820152601b60248201527f4578636565646564206d617820746f6b656e20707572636861736500000000006044820152606401610caf565b61271061154260ff841683614553565b11156115905760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473204d41585f535550504c592e000000006044820152606401610caf565b346115a660ff841667012dfb0cb5e88000614748565b11156115f45760405162461bcd60e51b815260206004820152601a60248201527f45746865722076616c75652073656e7420696e636f72726563740000000000006044820152606401610caf565b600b54604051636918579d60e11b8152336004820152600060248201526001600160a01b039091169063d230af3a90604401600060405180830381600087803b15801561164057600080fd5b505af1158015611654573d6000803e3d6000fd5b5050336000908152601060205260408120805460ff8716945090925061167b908490614553565b90915550600190505b8260ff168111610de557600061169a8284614553565b90506040518060400160405280600481526020016367656e3160e01b8152506040518060400160405280600381526020016265676760e81b8152506040516020016116e692919061456b565b60408051601f19818403018152918152600083815260116020908152919020825161171693919290910190613fb9565b506117213382612e29565b61172d81336003612e43565b50508061173990614767565b9050611684565b60006001600160a01b0382166117ab5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610caf565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146117f15760405162461bcd60e51b8152600401610caf90614508565b6117fb60006134be565b565b600a546001600160a01b031633146118275760405162461bcd60e51b8152600401610caf90614508565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b8033611850826113a6565b6001600160a01b0316146118765760405162461bcd60e51b8152600401610caf906145ba565b604080518082018252600481526367656e3160e01b60208083019190915282518084018452600381526265676760e81b8183015292516118b793910161456b565b60408051601f1981840301815282825280516020918201206000868152601183529290922091926118e992910161460a565b604051602081830303815290604052805190602001201461191c5760405162461bcd60e51b8152600401610caf906146a6565b60008281526012602052604090205460ff161561194b5760405162461bcd60e51b8152600401610caf906146fb565b600b54604051632770a7eb60e21b815233600482015268056bc75e2d6310000060248201526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561199f57600080fd5b505af11580156119b3573d6000803e3d6000fd5b50505050610de582336001612e43565b600a546001600160a01b031633146119ed5760405162461bcd60e51b8152600401610caf90614508565b60005b8281101561108b578160166000868685818110611a0f57611a0f614732565b9050602002016020810190611a2491906140a8565b6001600160a01b031681526020810191909152604001600020805460ff191660ff9290921691909117905580611a5981614767565b9150506119f0565b8033611a6c826113a6565b6001600160a01b031614611a925760405162461bcd60e51b8152600401610caf906145ba565b604080518082018252600481526367656e3160e01b60208083019190915282518084018452600381526265676760e81b818301529251611ad393910161456b565b60408051601f198184030181528282528051602091820120600086815260118352929092209192611b0592910161460a565b6040516020818303038152906040528051906020012014611b385760405162461bcd60e51b8152600401610caf906146a6565b60008281526012602052604090205460ff1615611b675760405162461bcd60e51b8152600401610caf906146fb565b600b54604051632770a7eb60e21b81523360048201526801a055690d9db8000060248201526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015611bbb57600080fd5b505af1158015611bcf573d6000803e3d6000fd5b50505050610de58233600360ff16612e43565b606060018054610bb79061447c565b6001600160a01b038216331415611c4a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610caf565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60116020526000908152604090208054611ccf9061447c565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfb9061447c565b8015611d485780601f10611d1d57610100808354040283529160200191611d48565b820191906000526020600020905b815481529060010190602001808311611d2b57829003601f168201915b505050505081565b611d5a3383612997565b611d765760405162461bcd60e51b8152600401610caf906144b7565b61108b84848484613510565b600a546001600160a01b03163314611dac5760405162461bcd60e51b8152600401610caf90614508565b600b8054911515600160a01b0260ff60a01b19909216919091179055565b6000818152600260205260409020546060906001600160a01b0316611e495760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610caf565b6000611e53613543565b600084815260116020526040812080549293509091611e719061447c565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9d9061447c565b8015611eea5780601f10611ebf57610100808354040283529160200191611eea565b820191906000526020600020905b815481529060010190602001808311611ecd57829003601f168201915b505050505090506000825111611f0f5760405180602001604052806000815250611f32565b8181604051602001611f22929190614782565b6040516020818303038152906040525b949350505050565b6000611f4560085490565b600b54909150600160a81b900460ff16611f975760405162461bcd60e51b815260206004820152601360248201527220b63637bbb634b9ba1034b730b1ba34bb329760691b6044820152606401610caf565b600b54600160a01b900460ff1615611fea5760405162461bcd60e51b815260206004820152601660248201527529b0b6329036bab9ba1031329034b730b1ba34bb329760511b6044820152606401610caf565b3360009081526016602052604090205460ff90811690831611801590612013575060008260ff16115b61206b5760405162461bcd60e51b815260206004820152602360248201527f4578636565646564206d617820617661696c61626c6520746f2070757263686160448201526239b29760e91b6064820152608401610caf565b61271061207b60ff841683614553565b11156120c95760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473204d41585f535550504c592e000000006044820152606401610caf565b346120df60ff841667012dfb0cb5e88000614748565b111561212d5760405162461bcd60e51b815260206004820152601b60248201527f45746865722076616c75652073656e7420696e636f72726563742e00000000006044820152606401610caf565b336000908152601660205260408120805484929061214f90849060ff166147c1565b825460ff9182166101009390930a928302919092021990911617905550600b54604051636918579d60e11b8152336004820152600060248201526001600160a01b039091169063d230af3a90604401600060405180830381600087803b1580156121b857600080fd5b505af11580156121cc573d6000803e3d6000fd5b5050336000908152601060205260408120805460ff871694509092506121f3908490614553565b90915550600190505b8260ff168111610de55760006122128284614553565b90506040518060400160405280600481526020016367656e3160e01b8152506040518060400160405280600381526020016265676760e81b81525060405160200161225e92919061456b565b60408051601f19818403018152918152600083815260116020908152919020825161228e93919290910190613fb9565b506122993382612e29565b6122a581336003612e43565b5050806122b190614767565b90506121fc565b600a546001600160a01b031633146122e25760405162461bcd60e51b8152600401610caf90614508565b60006122ed60085490565b905060ff8216158061230257508160ff166001145b8061231057508160ff166002145b61235c5760405162461bcd60e51b815260206004820181905260248201527f796f75206172656e2774206861746368696e6720612076616c696420747970656044820152606401610caf565b61271061236c60ff851683614553565b11156123af5760405162461bcd60e51b8152602060048201526012602482015271726573657276696e6720746f6f206d616e7960701b6044820152606401610caf565b600b54604051636918579d60e11b8152336004820152600060248201819052916001600160a01b03169063d230af3a90604401600060405180830381600087803b1580156123fc57600080fd5b505af1158015612410573d6000803e3d6000fd5b505050508260ff166002141561258c576127116015548560ff166124349190614553565b11156124905760405162461bcd60e51b815260206004820152602560248201527f526573657276696e67206d6f72652050686f656e69786573207468616e20657860448201526434b9ba399760d91b6064820152608401610caf565b5060015b8360ff168160ff16116125875760006124b060ff831684614553565b9050604051806040016040528060078152602001660e0d0decadcd2f60cb1b8152506124dd601554613552565b6040516020016124ee92919061456b565b60408051601f19818403018152918152600083815260116020908152919020825161251e93919290910190613fb9565b50336000908152600d60205260408120805490919061253c90614767565b909155506015805460009061255090614767565b9091555061255e3382612e29565b6000908152601260205260409020805460ff191660011790556125808161459a565b9050612494565b61108b565b8260ff16600114156126fc576123296014548560ff166125ac9190614553565b11156126065760405162461bcd60e51b815260206004820152602360248201527f526573657276696e67206d6f726520447261676f6e73207468616e20657869736044820152623a399760e91b6064820152608401610caf565b5060015b8360ff168160ff161161258757600061262660ff831684614553565b905060405180604001604052806006815260200165323930b3b7b760d11b815250612652601454613552565b60405160200161266392919061456b565b60408051601f19818403018152918152600083815260116020908152919020825161269393919290910190613fb9565b50336000908152600e6020526040812080549091906126b190614767565b90915550601480546000906126c590614767565b909155506126d33382612e29565b6000908152601260205260409020805460ff191660011790556126f58161459a565b905061260a565b60ff831661108b576117716013548560ff166127189190614553565b11156127725760405162461bcd60e51b8152602060048201526024808201527f526573657276696e67206d6f726520436869636b656e73207468616e2065786960448201526339ba399760e11b6064820152608401610caf565b5060015b8360ff168160ff161161108b57600061279260ff831684614553565b90506040518060400160405280600781526020016631b434b1b5b2b760c91b8152506127bf601354613552565b6040516020016127d092919061456b565b60408051601f19818403018152918152600083815260116020908152919020825161280093919290910190613fb9565b50336000908152600f60205260408120805490919061281e90614767565b909155506013805460009061283290614767565b909155506128403382612e29565b6000908152601260205260409020805460ff191660011790556128628161459a565b9050612776565b600a546001600160a01b031633146128935760405162461bcd60e51b8152600401610caf90614508565b6001600160a01b0381166128f85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610caf565b612901816134be565b50565b60006001600160e01b0319821663780e9d6360e01b1480610ba25750610ba282613650565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061295e826113a6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316612a105760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610caf565b6000612a1b836113a6565b9050806001600160a01b0316846001600160a01b03161480612a565750836001600160a01b0316612a4b84610c3a565b6001600160a01b0316145b80611f3257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611f32565b826001600160a01b0316612a9d826113a6565b6001600160a01b031614612b075760405162461bcd60e51b815260206004820152602b60248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526a1cc81b9bdd081bdddb995960aa1b6064820152608401610caf565b6001600160a01b038216612b695760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610caf565b612b748383836136a0565b612b7f600082612929565b600b54604051636918579d60e11b81526001600160a01b03858116600483015284811660248301529091169063d230af3a90604401600060405180830381600087803b158015612bce57600080fd5b505af1158015612be2573d6000803e3d6000fd5b505050506040518060400160405280600481526020016367656e3160e01b8152506040518060400160405280600381526020016265676760e81b815250604051602001612c3092919061456b565b60408051601f198184030181528282528051602091820120600085815260118352929092209192612c6292910161460a565b6040516020818303038152906040528051906020012014612c8857612c888184846136ab565b604080518082018252600481526367656e3160e01b60208083019190915282518084018452600381526265676760e81b818301529251612cc993910161456b565b60408051601f198184030181528282528051602091820120600085815260118352929092209192612cfb92910161460a565b604051602081830303815290604052805190602001201415612d79576001600160a01b03831660009081526010602052604081208054909190612d3d906147e4565b909155506001600160a01b03821660009081526010602052604081208054909190612d6790614767565b90915550612d7781836003612e43565b505b6001600160a01b03831660009081526003602052604081208054909190612d9f906147e4565b909155506001600160a01b03821660009081526003602052604081208054909190612dc990614767565b9091555060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6110ea8282604051806020016040528060008152506139cc565b60606040518060400160405280600481526020016367656e3160e01b815250604051602001612e7291906147fb565b60408051601f198184030181528282528051602091820120600088815260118352929092209192612ea492910161460a565b6040516020818303038152906040528051906020012014612f265760405162461bcd60e51b815260206004820152603660248201527f596f7572206567672068617320616c72656164792068617463686564206f72206044820152756e6f7420656c696769626c6520746f2068617463682160501b6064820152608401610caf565b600080612f48612f38876103e86139ff565b612f429088614748565b856139ff565b905060606000612f5a886103e86139ff565b612f6589607b614748565b612f6f9190614748565b90508284141561349757604051806040016040528060118152602001702cb7bab91032b3b3903430ba31b432b21760791b81525091506000612fb282600a6139ff565b6001600160a01b0389166000908152601060205260408120805492935091612fd9906147e4565b909155506001811480612fea575080155b80612ff55750806002145b806130005750806004145b8061300b5750806006145b806130165750806008145b1561323e57611770601354116130d6576040518060400160405280600781526020016631b434b1b5b2b760c91b815250613051601354613552565b60405160200161306292919061456b565b60408051601f1981840301815291815260008b815260116020908152919020825161309293919290910190613fb9565b506001600160a01b0388166000908152600f6020526040812080549091906130b990614767565b90915550601380546000906130cd90614767565b90915550613478565b612328601454116131875760405180604001604052806006815260200165323930b3b7b760d11b81525061310b601454613552565b60405160200161311c92919061456b565b60408051601f1981840301815291815260008b815260116020908152919020825161314c93919290910190613fb9565b506001600160a01b0388166000908152600e60205260408120805490919061317390614767565b90915550601480546000906130cd90614767565b6127106015541161323957604051806040016040528060078152602001660e0d0decadcd2f60cb1b8152506131bd601554613552565b6040516020016131ce92919061456b565b60408051601f1981840301815291815260008b81526011602090815291902082516131fe93919290910190613fb9565b506001600160a01b0388166000908152600d60205260408120805490919061322590614767565b90915550601580546000906130cd90614767565b613478565b806003148061324d5750806005145b806132585750806007145b156132c857612328601454116132925760405180604001604052806006815260200165323930b3b7b760d11b81525061310b601454613552565b61177060135411613187576040518060400160405280600781526020016631b434b1b5b2b760c91b815250613051601354613552565b8060091415613478576127106015541161338c57604051806040016040528060078152602001660e0d0decadcd2f60cb1b815250613307601554613552565b60405160200161331892919061456b565b60408051601f1981840301815291815260008b815260116020908152919020825161334893919290910190613fb9565b506001600160a01b0388166000908152600d6020526040812080549161336d83614767565b90915550506015805490600061338283614767565b9190505550613478565b612328601454116133c15760405180604001604052806006815260200165323930b3b7b760d11b81525061310b601454613552565b61177060135411613478576040518060400160405280600781526020016631b434b1b5b2b760c91b8152506133f7601354613552565b60405160200161340892919061456b565b60408051601f1981840301815291815260008b815260116020908152919020825161343893919290910190613fb9565b506001600160a01b0388166000908152600f60205260408120805490919061345f90614767565b909155506013805460009061347390614767565b909155505b506000888152601260205260409020805460ff191660011790556134b3565b6040518060600160405280603581526020016149956035913991505b509695505050505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61351b848484612a8a565b61352784848484613a4e565b61108b5760405162461bcd60e51b8152600401610caf90614822565b6060600c8054610bb79061447c565b6060816135765750506040805180820190915260018152600360fc1b602082015290565b8160005b81156135a0578061358a81614767565b91506135999050600a8361488a565b915061357a565b60008167ffffffffffffffff8111156135bb576135bb6141f1565b6040519080825280601f01601f1916602001820160405280156135e5576020820181803683370190505b5090505b8415611f32576135fa60018361489e565b9150613607600a866148b5565b613612906030614553565b60f81b81838151811061362757613627614732565b60200101906001600160f81b031916908160001a905350613649600a8661488a565b94506135e9565b60006001600160e01b031982166380ac58cd60e01b148061368157506001600160e01b03198216635b5e139f60e01b145b80610ba257506301ffc9a760e01b6001600160e01b0319831614610ba2565b610de5838383613b4c565b6136b4836113a6565b6001600160a01b0316826001600160a01b03161461371f5760405162461bcd60e51b815260206004820152602260248201527f596f7520617265206e6f7420746865206f776e6572206f662074686973206567604482015261339760f11b6064820152608401610caf565b600083815260116020526040812080546137c4919061373d9061447c565b80601f01602080910402602001604051908101604052809291908181526020018280546137699061447c565b80156137b65780601f1061378b576101008083540402835291602001916137b6565b820191906000526020600020905b81548152906001019060200180831161379957829003601f168201915b505050505060006004613c04565b6040516370686f6560e01b6020820152909150602401604051602081830303815290604052805190602001208160405160200161380191906148c9565b604051602081830303815290604052805190602001201415613876576001600160a01b0383166000908152600d602052604081208054909190613843906147e4565b909155506001600160a01b0382166000908152600d60205260408120805490919061386d90614767565b9091555061108b565b604051636472616760e01b602082015260240160405160208183030381529060405280519060200120816040516020016138b091906148c9565b60405160208183030381529060405280519060200120141561391c576001600160a01b0383166000908152600e6020526040812080549091906138f2906147e4565b909155506001600160a01b0382166000908152600e60205260408120805490919061386d90614767565b604051636368696360e01b6020820152602401604051602081830303815290604052805190602001208160405160200161395691906148c9565b60405160208183030381529060405280519060200120141561108b576001600160a01b0383166000908152600f602052604081208054909190613998906147e4565b909155506001600160a01b0382166000908152600f6020526040812080549091906139c290614767565b9091555050505050565b6139d68383613cdb565b6139e36000848484613a4e565b610de55760405162461bcd60e51b8152600401610caf90614822565b600080613a0b84613552565b3342604051602001613a1f939291906148e5565b60408051601f19818403018152919052805160209091012090506000613a4584836148b5565b95945050505050565b60006001600160a01b0384163b15613b4157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613a92903390899088908890600401614924565b6020604051808303816000875af1925050508015613acd575060408051601f3d908101601f19168201909252613aca91810190614961565b60015b613b27573d808015613afb576040519150601f19603f3d011682016040523d82523d6000602084013e613b00565b606091505b508051613b1f5760405162461bcd60e51b8152600401610caf90614822565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f32565b506001949350505050565b6001600160a01b038316613ba757613ba281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613bca565b816001600160a01b0316836001600160a01b031614613bca57613bca8382613e29565b6001600160a01b038216613be157610de581613ec6565b826001600160a01b0316826001600160a01b031614610de557610de58282613f75565b6060836000613c1385856147c1565b60ff1667ffffffffffffffff811115613c2e57613c2e6141f1565b6040519080825280601f01601f191660200182016040528015613c58576020820181803683370190505b50905060ff85165b8460ff16811015613cd157828181518110613c7d57613c7d614732565b01602001516001600160f81b03191682613c9a60ff89168461489e565b81518110613caa57613caa614732565b60200101906001600160f81b031916908160001a905350613cca81614767565b9050613c60565b5095945050505050565b6001600160a01b038216613d315760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610caf565b6000818152600260205260409020546001600160a01b031615613d965760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610caf565b613da2600083836136a0565b6001600160a01b0382166000908152600360205260408120805460019290613dcb908490614553565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001613e3684611740565b613e40919061489e565b600083815260076020526040902054909150808214613e93576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613ed89060019061489e565b60008381526009602052604081205460088054939450909284908110613f0057613f00614732565b906000526020600020015490508060088381548110613f2157613f21614732565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613f5957613f5961497e565b6001900381819060005260206000200160009055905550505050565b6000613f8083611740565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054613fc59061447c565b90600052602060002090601f016020900481019282613fe7576000855561402d565b82601f1061400057805160ff191683800117855561402d565b8280016001018555821561402d579182015b8281111561402d578251825591602001919060010190614012565b5061403992915061403d565b5090565b5b80821115614039576000815560010161403e565b6001600160e01b03198116811461290157600080fd5b60006020828403121561407a57600080fd5b813561408581614052565b9392505050565b80356001600160a01b03811681146140a357600080fd5b919050565b6000602082840312156140ba57600080fd5b6140858261408c565b60005b838110156140de5781810151838201526020016140c6565b8381111561108b5750506000910152565b600081518084526141078160208601602086016140c3565b601f01601f19169290920160200192915050565b60208152600061408560208301846140ef565b60006020828403121561414057600080fd5b5035919050565b6000806040838503121561415a57600080fd5b6141638361408c565b946020939093013593505050565b60008060006060848603121561418657600080fd5b61418f8461408c565b925061419d6020850161408c565b9150604084013590509250925092565b803560ff811681146140a357600080fd5b600080604083850312156141d157600080fd5b6141da8361408c565b91506141e8602084016141ad565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115614222576142226141f1565b604051601f8501601f19908116603f0116810190828211818310171561424a5761424a6141f1565b8160405280935085815286868601111561426357600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561428f57600080fd5b813567ffffffffffffffff8111156142a657600080fd5b8201601f810184136142b757600080fd5b611f3284823560208401614207565b6000602082840312156142d857600080fd5b614085826141ad565b803580151581146140a357600080fd5b60006020828403121561430357600080fd5b614085826142e1565b60008060006040848603121561432157600080fd5b833567ffffffffffffffff8082111561433957600080fd5b818601915086601f83011261434d57600080fd5b81358181111561435c57600080fd5b8760208260051b850101111561437157600080fd5b60209283019550935061438791860190506141ad565b90509250925092565b600080604083850312156143a357600080fd5b6143ac8361408c565b91506141e8602084016142e1565b600080600080608085870312156143d057600080fd5b6143d98561408c565b93506143e76020860161408c565b925060408501359150606085013567ffffffffffffffff81111561440a57600080fd5b8501601f8101871361441b57600080fd5b61442a87823560208401614207565b91505092959194509250565b6000806040838503121561444957600080fd5b6144528361408c565b91506141e86020840161408c565b6000806040838503121561447357600080fd5b6141da836141ad565b600181811c9082168061449057607f821691505b602082108114156144b157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156145665761456661453d565b500190565b6000835161457d8184602088016140c3565b8351908301906145918183602088016140c3565b01949350505050565b600060ff821660ff8114156145b1576145b161453d565b60010192915050565b60208082526030908201527f43616e6e6f7420696e746572616374207769746820612048617463686c696e6760408201526f3d103cb7ba903237903737ba1037bbb760811b606082015260800190565b600080835481600182811c91508083168061462657607f831692505b602080841082141561464657634e487b7160e01b86526022600452602486fd5b81801561465a576001811461466b57614698565b60ff19861689528489019650614698565b60008a81526020902060005b868110156146905781548b820152908501908301614677565b505084890196505b509498975050505050505050565b60208082526035908201527f596f757220656767206f722048617463686c696e677a206973206e6f7420656c604082015274696769626c6520746f20626520686174636865642160581b606082015260800190565b6020808252601d908201527f796f757220746f6b656e20697320616c72656164792068617463686564000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156147625761476261453d565b500290565b600060001982141561477b5761477b61453d565b5060010190565b600083516147948184602088016140c3565b8351908301906147a88183602088016140c3565b64173539b7b760d91b9101908152600501949350505050565b600060ff821660ff8416808210156147db576147db61453d565b90039392505050565b6000816147f3576147f361453d565b506000190190565b6000825161480d8184602087016140c3565b6265676760e81b920191825250600301919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261489957614899614874565b500490565b6000828210156148b0576148b061453d565b500390565b6000826148c4576148c4614874565b500690565b600082516148db8184602087016140c3565b9190910192915050565b600084516148f78184602089016140c3565b60609490941b6bffffffffffffffffffffffff191691909301908152601481019190915260340192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614957908301846140ef565b9695505050505050565b60006020828403121561497357600080fd5b815161408581614052565b634e487b7160e01b600052603160045260246000fdfe596f757220656767206469646e277420686174636820746869732074696d652c20676f6f64206c75636b206e6578742074696d6521a264697066735822122089a61c144345083266671e06438f37c42b6c0befe5f191ff698f151cc1b1826064736f6c634300080c0033

Deployed Bytecode

0x60806040526004361061038c5760003560e01c8063718bc4af116101dc578063aa94b2e111610102578063c4e37095116100a0578063e985e9c51161006f578063e985e9c514610af8578063f031653d14610b41578063f2fde38b14610b61578063fddd5a8414610b8157600080fd5b8063c4e3709514610a73578063c87b56dd14610a93578063d972ea3e14610ab3578063ddff5b1c14610ae557600080fd5b8063b88d4fde116100dc578063b88d4fde146109cb578063c04a2836146109eb578063c06abfc714610a24578063c0e7ec8d14610a5357600080fd5b8063aa94b2e11461095b578063ae6a70ee14610978578063b13237791461099857600080fd5b80638da5cb5b1161017a5780639e166bdf116101495780639e166bdf146108ab578063a22cb465146108de578063a56d8ae9146108fe578063a6587a371461092b57600080fd5b80638da5cb5b14610842578063909d6c8f1461086057806392cbc2881461087657806395d89b411461089657600080fd5b80638295784d116101b65780638295784d146107c3578063833b9499146107e35780638c004c9c146107ff5780638cd91dfe1461081557600080fd5b8063718bc4af146107665780637a8ab7c3146107865780637be2ffc1146107a357600080fd5b806337c1e2dc116102c157806355f804b31161025f57806365f130971161022e57806365f13097146107095780636ecd23061461071e57806370a0823114610731578063715018a61461075157600080fd5b806355f804b31461067b578063564566a81461069b5780636352211e146106bc57806364bff354146106dc57600080fd5b806342842e0e1161029b57806342842e0e146105fb5780634eb964511461061b5780634f6ccce71461063b578063505887771461065b57600080fd5b806337c1e2dc146105b45780633991e074146105c95780633ccfd60b146105e657600080fd5b806318160ddd1161032e5780632f745c59116103085780632f745c591461052a57806332cb6b0c1461054a578063360ef1dc14610573578063375877e61461059457600080fd5b806318160ddd146104d457806323b872dd146104e957806329fc6bae1461050957600080fd5b8063081812fc1161036a578063081812fc14610423578063095ea7b31461045b57806315fd53431461047d57806317219522146104a457600080fd5b806301ffc9a71461039157806304bf4cd5146103c657806306fdde0314610401575b600080fd5b34801561039d57600080fd5b506103b16103ac366004614068565b610b97565b60405190151581526020015b60405180910390f35b3480156103d257600080fd5b506103f36103e13660046140a8565b60106020526000908152604090205481565b6040519081526020016103bd565b34801561040d57600080fd5b50610416610ba8565b6040516103bd919061411b565b34801561042f57600080fd5b5061044361043e36600461412e565b610c3a565b6040516001600160a01b0390911681526020016103bd565b34801561046757600080fd5b5061047b610476366004614147565b610cd4565b005b34801561048957600080fd5b50610492600281565b60405160ff90911681526020016103bd565b3480156104b057600080fd5b506104166040518060400160405280600481526020016367656e3160e01b81525081565b3480156104e057600080fd5b506008546103f3565b3480156104f557600080fd5b5061047b610504366004614171565b610dea565b34801561051557600080fd5b50600b546103b190600160a81b900460ff1681565b34801561053657600080fd5b506103f3610545366004614147565b610e1b565b34801561055657600080fd5b5061056061271081565b60405161ffff90911681526020016103bd565b34801561057f57600080fd5b50600b546103b190600160b01b900460ff1681565b3480156105a057600080fd5b5061047b6105af3660046141be565b610eb1565b3480156105c057600080fd5b50610492600381565b3480156105d557600080fd5b506103f36801a055690d9db8000081565b3480156105f257600080fd5b5061047b611091565b34801561060757600080fd5b5061047b610616366004614171565b6110ee565b34801561062757600080fd5b5061047b61063636600461412e565b611109565b34801561064757600080fd5b506103f361065636600461412e565b61128a565b34801561066757600080fd5b5061047b6106763660046140a8565b61131d565b34801561068757600080fd5b5061047b61069636600461427d565b611369565b3480156106a757600080fd5b50600b546103b190600160a01b900460ff1681565b3480156106c857600080fd5b506104436106d736600461412e565b6113a6565b3480156106e857600080fd5b506103f36106f73660046140a8565b600e6020526000908152604090205481565b34801561071557600080fd5b50610492600681565b61047b61072c3660046142c6565b61141d565b34801561073d57600080fd5b506103f361074c3660046140a8565b611740565b34801561075d57600080fd5b5061047b6117c7565b34801561077257600080fd5b5061047b6107813660046142f1565b6117fd565b34801561079257600080fd5b506103f368056bc75e2d6310000081565b3480156107af57600080fd5b5061047b6107be36600461412e565b611845565b3480156107cf57600080fd5b5061047b6107de36600461430c565b6119c3565b3480156107ef57600080fd5b506103f367012dfb0cb5e8800081565b34801561080b57600080fd5b506103f360135481565b34801561082157600080fd5b506103f36108303660046140a8565b600d6020526000908152604090205481565b34801561084e57600080fd5b50600a546001600160a01b0316610443565b34801561086c57600080fd5b506103f360145481565b34801561088257600080fd5b5061047b61089136600461412e565b611a61565b3480156108a257600080fd5b50610416611be2565b3480156108b757600080fd5b506104166040518060400160405280600781526020016631b434b1b5b2b760c91b81525081565b3480156108ea57600080fd5b5061047b6108f9366004614390565b611bf1565b34801561090a57600080fd5b506103f36109193660046140a8565b600f6020526000908152604090205481565b34801561093757600080fd5b506103b161094636600461412e565b60126020526000908152604090205460ff1681565b34801561096757600080fd5b506103f36802b5e3af16b188000081565b34801561098457600080fd5b5061041661099336600461412e565b611cb6565b3480156109a457600080fd5b50610416604051806040016040528060078152602001660e0d0decadcd2f60cb1b81525081565b3480156109d757600080fd5b5061047b6109e63660046143ba565b611d50565b3480156109f757600080fd5b50610492610a063660046140a8565b6001600160a01b031660009081526016602052604090205460ff1690565b348015610a3057600080fd5b506104166040518060400160405280600381526020016265676760e81b81525081565b348015610a5f57600080fd5b50600b54610443906001600160a01b031681565b348015610a7f57600080fd5b5061047b610a8e3660046142f1565b611d82565b348015610a9f57600080fd5b50610416610aae36600461412e565b611dca565b348015610abf57600080fd5b5061041660405180604001604052806006815260200165323930b3b7b760d11b81525081565b61047b610af33660046142c6565b611f3a565b348015610b0457600080fd5b506103b1610b13366004614436565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610b4d57600080fd5b5061047b610b5c366004614460565b6122b8565b348015610b6d57600080fd5b5061047b610b7c3660046140a8565b612869565b348015610b8d57600080fd5b506103f360155481565b6000610ba282612904565b92915050565b606060008054610bb79061447c565b80601f0160208091040260200160405190810160405280929190818152602001828054610be39061447c565b8015610c305780601f10610c0557610100808354040283529160200191610c30565b820191906000526020600020905b815481529060010190602001808311610c1357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610cb85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610cdf826113a6565b9050806001600160a01b0316836001600160a01b03161415610d4d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610caf565b336001600160a01b0382161480610d695750610d698133610b13565b610ddb5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610caf565b610de58383612929565b505050565b610df43382612997565b610e105760405162461bcd60e51b8152600401610caf906144b7565b610de5838383612a8a565b6000610e2683611740565b8210610e885760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610caf565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610edb5760405162461bcd60e51b8152600401610caf90614508565b6000610ee660085490565b9050612710610ef860ff841683614553565b1115610f3b5760405162461bcd60e51b8152602060048201526012602482015271726573657276696e6720746f6f206d616e7960701b6044820152606401610caf565b600b54604051636918579d60e11b81526001600160a01b038581166004830152600060248301529091169063d230af3a90604401600060405180830381600087803b158015610f8957600080fd5b505af1158015610f9d573d6000803e3d6000fd5b505050506001600160a01b0383166000908152601060205260408120805460ff85169290610fcc908490614553565b90915550600190505b8260ff168160ff161161108b576000610ff160ff831684614553565b90506040518060400160405280600481526020016367656e3160e01b8152506040518060400160405280600381526020016265676760e81b81525060405160200161103d92919061456b565b60408051601f19818403018152918152600083815260116020908152919020825161106d93919290910190613fb9565b506110788582612e29565b50806110838161459a565b915050610fd5565b50505050565b600a546001600160a01b031633146110bb5760405162461bcd60e51b8152600401610caf90614508565b6040514790339082156108fc029083906000818181858888f193505050501580156110ea573d6000803e3d6000fd5b5050565b610de583838360405180602001604052806000815250611d50565b8033611114826113a6565b6001600160a01b03161461113a5760405162461bcd60e51b8152600401610caf906145ba565b604080518082018252600481526367656e3160e01b60208083019190915282518084018452600381526265676760e81b81830152925161117b93910161456b565b60408051601f1981840301815282825280516020918201206000868152601183529290922091926111ad92910161460a565b60405160208183030381529060405280519060200120146111e05760405162461bcd60e51b8152600401610caf906146a6565b60008281526012602052604090205460ff161561120f5760405162461bcd60e51b8152600401610caf906146fb565b600b54604051632770a7eb60e21b81523360048201526802b5e3af16b188000060248201526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561126357600080fd5b505af1158015611277573d6000803e3d6000fd5b50505050610de58233600260ff16612e43565b600061129560085490565b82106112f85760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610caf565b6008828154811061130b5761130b614732565b90600052602060002001549050919050565b600a546001600160a01b031633146113475760405162461bcd60e51b8152600401610caf90614508565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b031633146113935760405162461bcd60e51b8152600401610caf90614508565b80516110ea90600c906020840190613fb9565b6000818152600260205260408120546001600160a01b031680610ba25760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610caf565b600061142860085490565b600b54909150600160a01b900460ff166114755760405162461bcd60e51b815260206004820152600e60248201526d29b0b6329034b730b1ba34bb329760911b6044820152606401610caf565b600b54600160a81b900460ff16156114cf5760405162461bcd60e51b815260206004820152601b60248201527f416c6c6f774c697374206d75737420626520696e6163746976652e00000000006044820152606401610caf565b60008260ff161180156114e65750600660ff831611155b6115325760405162461bcd60e51b815260206004820152601b60248201527f4578636565646564206d617820746f6b656e20707572636861736500000000006044820152606401610caf565b61271061154260ff841683614553565b11156115905760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473204d41585f535550504c592e000000006044820152606401610caf565b346115a660ff841667012dfb0cb5e88000614748565b11156115f45760405162461bcd60e51b815260206004820152601a60248201527f45746865722076616c75652073656e7420696e636f72726563740000000000006044820152606401610caf565b600b54604051636918579d60e11b8152336004820152600060248201526001600160a01b039091169063d230af3a90604401600060405180830381600087803b15801561164057600080fd5b505af1158015611654573d6000803e3d6000fd5b5050336000908152601060205260408120805460ff8716945090925061167b908490614553565b90915550600190505b8260ff168111610de557600061169a8284614553565b90506040518060400160405280600481526020016367656e3160e01b8152506040518060400160405280600381526020016265676760e81b8152506040516020016116e692919061456b565b60408051601f19818403018152918152600083815260116020908152919020825161171693919290910190613fb9565b506117213382612e29565b61172d81336003612e43565b50508061173990614767565b9050611684565b60006001600160a01b0382166117ab5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610caf565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146117f15760405162461bcd60e51b8152600401610caf90614508565b6117fb60006134be565b565b600a546001600160a01b031633146118275760405162461bcd60e51b8152600401610caf90614508565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b8033611850826113a6565b6001600160a01b0316146118765760405162461bcd60e51b8152600401610caf906145ba565b604080518082018252600481526367656e3160e01b60208083019190915282518084018452600381526265676760e81b8183015292516118b793910161456b565b60408051601f1981840301815282825280516020918201206000868152601183529290922091926118e992910161460a565b604051602081830303815290604052805190602001201461191c5760405162461bcd60e51b8152600401610caf906146a6565b60008281526012602052604090205460ff161561194b5760405162461bcd60e51b8152600401610caf906146fb565b600b54604051632770a7eb60e21b815233600482015268056bc75e2d6310000060248201526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b15801561199f57600080fd5b505af11580156119b3573d6000803e3d6000fd5b50505050610de582336001612e43565b600a546001600160a01b031633146119ed5760405162461bcd60e51b8152600401610caf90614508565b60005b8281101561108b578160166000868685818110611a0f57611a0f614732565b9050602002016020810190611a2491906140a8565b6001600160a01b031681526020810191909152604001600020805460ff191660ff9290921691909117905580611a5981614767565b9150506119f0565b8033611a6c826113a6565b6001600160a01b031614611a925760405162461bcd60e51b8152600401610caf906145ba565b604080518082018252600481526367656e3160e01b60208083019190915282518084018452600381526265676760e81b818301529251611ad393910161456b565b60408051601f198184030181528282528051602091820120600086815260118352929092209192611b0592910161460a565b6040516020818303038152906040528051906020012014611b385760405162461bcd60e51b8152600401610caf906146a6565b60008281526012602052604090205460ff1615611b675760405162461bcd60e51b8152600401610caf906146fb565b600b54604051632770a7eb60e21b81523360048201526801a055690d9db8000060248201526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015611bbb57600080fd5b505af1158015611bcf573d6000803e3d6000fd5b50505050610de58233600360ff16612e43565b606060018054610bb79061447c565b6001600160a01b038216331415611c4a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610caf565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60116020526000908152604090208054611ccf9061447c565b80601f0160208091040260200160405190810160405280929190818152602001828054611cfb9061447c565b8015611d485780601f10611d1d57610100808354040283529160200191611d48565b820191906000526020600020905b815481529060010190602001808311611d2b57829003601f168201915b505050505081565b611d5a3383612997565b611d765760405162461bcd60e51b8152600401610caf906144b7565b61108b84848484613510565b600a546001600160a01b03163314611dac5760405162461bcd60e51b8152600401610caf90614508565b600b8054911515600160a01b0260ff60a01b19909216919091179055565b6000818152600260205260409020546060906001600160a01b0316611e495760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610caf565b6000611e53613543565b600084815260116020526040812080549293509091611e719061447c565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9d9061447c565b8015611eea5780601f10611ebf57610100808354040283529160200191611eea565b820191906000526020600020905b815481529060010190602001808311611ecd57829003601f168201915b505050505090506000825111611f0f5760405180602001604052806000815250611f32565b8181604051602001611f22929190614782565b6040516020818303038152906040525b949350505050565b6000611f4560085490565b600b54909150600160a81b900460ff16611f975760405162461bcd60e51b815260206004820152601360248201527220b63637bbb634b9ba1034b730b1ba34bb329760691b6044820152606401610caf565b600b54600160a01b900460ff1615611fea5760405162461bcd60e51b815260206004820152601660248201527529b0b6329036bab9ba1031329034b730b1ba34bb329760511b6044820152606401610caf565b3360009081526016602052604090205460ff90811690831611801590612013575060008260ff16115b61206b5760405162461bcd60e51b815260206004820152602360248201527f4578636565646564206d617820617661696c61626c6520746f2070757263686160448201526239b29760e91b6064820152608401610caf565b61271061207b60ff841683614553565b11156120c95760405162461bcd60e51b815260206004820152601c60248201527f50757263686173652065786365656473204d41585f535550504c592e000000006044820152606401610caf565b346120df60ff841667012dfb0cb5e88000614748565b111561212d5760405162461bcd60e51b815260206004820152601b60248201527f45746865722076616c75652073656e7420696e636f72726563742e00000000006044820152606401610caf565b336000908152601660205260408120805484929061214f90849060ff166147c1565b825460ff9182166101009390930a928302919092021990911617905550600b54604051636918579d60e11b8152336004820152600060248201526001600160a01b039091169063d230af3a90604401600060405180830381600087803b1580156121b857600080fd5b505af11580156121cc573d6000803e3d6000fd5b5050336000908152601060205260408120805460ff871694509092506121f3908490614553565b90915550600190505b8260ff168111610de55760006122128284614553565b90506040518060400160405280600481526020016367656e3160e01b8152506040518060400160405280600381526020016265676760e81b81525060405160200161225e92919061456b565b60408051601f19818403018152918152600083815260116020908152919020825161228e93919290910190613fb9565b506122993382612e29565b6122a581336003612e43565b5050806122b190614767565b90506121fc565b600a546001600160a01b031633146122e25760405162461bcd60e51b8152600401610caf90614508565b60006122ed60085490565b905060ff8216158061230257508160ff166001145b8061231057508160ff166002145b61235c5760405162461bcd60e51b815260206004820181905260248201527f796f75206172656e2774206861746368696e6720612076616c696420747970656044820152606401610caf565b61271061236c60ff851683614553565b11156123af5760405162461bcd60e51b8152602060048201526012602482015271726573657276696e6720746f6f206d616e7960701b6044820152606401610caf565b600b54604051636918579d60e11b8152336004820152600060248201819052916001600160a01b03169063d230af3a90604401600060405180830381600087803b1580156123fc57600080fd5b505af1158015612410573d6000803e3d6000fd5b505050508260ff166002141561258c576127116015548560ff166124349190614553565b11156124905760405162461bcd60e51b815260206004820152602560248201527f526573657276696e67206d6f72652050686f656e69786573207468616e20657860448201526434b9ba399760d91b6064820152608401610caf565b5060015b8360ff168160ff16116125875760006124b060ff831684614553565b9050604051806040016040528060078152602001660e0d0decadcd2f60cb1b8152506124dd601554613552565b6040516020016124ee92919061456b565b60408051601f19818403018152918152600083815260116020908152919020825161251e93919290910190613fb9565b50336000908152600d60205260408120805490919061253c90614767565b909155506015805460009061255090614767565b9091555061255e3382612e29565b6000908152601260205260409020805460ff191660011790556125808161459a565b9050612494565b61108b565b8260ff16600114156126fc576123296014548560ff166125ac9190614553565b11156126065760405162461bcd60e51b815260206004820152602360248201527f526573657276696e67206d6f726520447261676f6e73207468616e20657869736044820152623a399760e91b6064820152608401610caf565b5060015b8360ff168160ff161161258757600061262660ff831684614553565b905060405180604001604052806006815260200165323930b3b7b760d11b815250612652601454613552565b60405160200161266392919061456b565b60408051601f19818403018152918152600083815260116020908152919020825161269393919290910190613fb9565b50336000908152600e6020526040812080549091906126b190614767565b90915550601480546000906126c590614767565b909155506126d33382612e29565b6000908152601260205260409020805460ff191660011790556126f58161459a565b905061260a565b60ff831661108b576117716013548560ff166127189190614553565b11156127725760405162461bcd60e51b8152602060048201526024808201527f526573657276696e67206d6f726520436869636b656e73207468616e2065786960448201526339ba399760e11b6064820152608401610caf565b5060015b8360ff168160ff161161108b57600061279260ff831684614553565b90506040518060400160405280600781526020016631b434b1b5b2b760c91b8152506127bf601354613552565b6040516020016127d092919061456b565b60408051601f19818403018152918152600083815260116020908152919020825161280093919290910190613fb9565b50336000908152600f60205260408120805490919061281e90614767565b909155506013805460009061283290614767565b909155506128403382612e29565b6000908152601260205260409020805460ff191660011790556128628161459a565b9050612776565b600a546001600160a01b031633146128935760405162461bcd60e51b8152600401610caf90614508565b6001600160a01b0381166128f85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610caf565b612901816134be565b50565b60006001600160e01b0319821663780e9d6360e01b1480610ba25750610ba282613650565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061295e826113a6565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316612a105760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610caf565b6000612a1b836113a6565b9050806001600160a01b0316846001600160a01b03161480612a565750836001600160a01b0316612a4b84610c3a565b6001600160a01b0316145b80611f3257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16611f32565b826001600160a01b0316612a9d826113a6565b6001600160a01b031614612b075760405162461bcd60e51b815260206004820152602b60248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526a1cc81b9bdd081bdddb995960aa1b6064820152608401610caf565b6001600160a01b038216612b695760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610caf565b612b748383836136a0565b612b7f600082612929565b600b54604051636918579d60e11b81526001600160a01b03858116600483015284811660248301529091169063d230af3a90604401600060405180830381600087803b158015612bce57600080fd5b505af1158015612be2573d6000803e3d6000fd5b505050506040518060400160405280600481526020016367656e3160e01b8152506040518060400160405280600381526020016265676760e81b815250604051602001612c3092919061456b565b60408051601f198184030181528282528051602091820120600085815260118352929092209192612c6292910161460a565b6040516020818303038152906040528051906020012014612c8857612c888184846136ab565b604080518082018252600481526367656e3160e01b60208083019190915282518084018452600381526265676760e81b818301529251612cc993910161456b565b60408051601f198184030181528282528051602091820120600085815260118352929092209192612cfb92910161460a565b604051602081830303815290604052805190602001201415612d79576001600160a01b03831660009081526010602052604081208054909190612d3d906147e4565b909155506001600160a01b03821660009081526010602052604081208054909190612d6790614767565b90915550612d7781836003612e43565b505b6001600160a01b03831660009081526003602052604081208054909190612d9f906147e4565b909155506001600160a01b03821660009081526003602052604081208054909190612dc990614767565b9091555060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6110ea8282604051806020016040528060008152506139cc565b60606040518060400160405280600481526020016367656e3160e01b815250604051602001612e7291906147fb565b60408051601f198184030181528282528051602091820120600088815260118352929092209192612ea492910161460a565b6040516020818303038152906040528051906020012014612f265760405162461bcd60e51b815260206004820152603660248201527f596f7572206567672068617320616c72656164792068617463686564206f72206044820152756e6f7420656c696769626c6520746f2068617463682160501b6064820152608401610caf565b600080612f48612f38876103e86139ff565b612f429088614748565b856139ff565b905060606000612f5a886103e86139ff565b612f6589607b614748565b612f6f9190614748565b90508284141561349757604051806040016040528060118152602001702cb7bab91032b3b3903430ba31b432b21760791b81525091506000612fb282600a6139ff565b6001600160a01b0389166000908152601060205260408120805492935091612fd9906147e4565b909155506001811480612fea575080155b80612ff55750806002145b806130005750806004145b8061300b5750806006145b806130165750806008145b1561323e57611770601354116130d6576040518060400160405280600781526020016631b434b1b5b2b760c91b815250613051601354613552565b60405160200161306292919061456b565b60408051601f1981840301815291815260008b815260116020908152919020825161309293919290910190613fb9565b506001600160a01b0388166000908152600f6020526040812080549091906130b990614767565b90915550601380546000906130cd90614767565b90915550613478565b612328601454116131875760405180604001604052806006815260200165323930b3b7b760d11b81525061310b601454613552565b60405160200161311c92919061456b565b60408051601f1981840301815291815260008b815260116020908152919020825161314c93919290910190613fb9565b506001600160a01b0388166000908152600e60205260408120805490919061317390614767565b90915550601480546000906130cd90614767565b6127106015541161323957604051806040016040528060078152602001660e0d0decadcd2f60cb1b8152506131bd601554613552565b6040516020016131ce92919061456b565b60408051601f1981840301815291815260008b81526011602090815291902082516131fe93919290910190613fb9565b506001600160a01b0388166000908152600d60205260408120805490919061322590614767565b90915550601580546000906130cd90614767565b613478565b806003148061324d5750806005145b806132585750806007145b156132c857612328601454116132925760405180604001604052806006815260200165323930b3b7b760d11b81525061310b601454613552565b61177060135411613187576040518060400160405280600781526020016631b434b1b5b2b760c91b815250613051601354613552565b8060091415613478576127106015541161338c57604051806040016040528060078152602001660e0d0decadcd2f60cb1b815250613307601554613552565b60405160200161331892919061456b565b60408051601f1981840301815291815260008b815260116020908152919020825161334893919290910190613fb9565b506001600160a01b0388166000908152600d6020526040812080549161336d83614767565b90915550506015805490600061338283614767565b9190505550613478565b612328601454116133c15760405180604001604052806006815260200165323930b3b7b760d11b81525061310b601454613552565b61177060135411613478576040518060400160405280600781526020016631b434b1b5b2b760c91b8152506133f7601354613552565b60405160200161340892919061456b565b60408051601f1981840301815291815260008b815260116020908152919020825161343893919290910190613fb9565b506001600160a01b0388166000908152600f60205260408120805490919061345f90614767565b909155506013805460009061347390614767565b909155505b506000888152601260205260409020805460ff191660011790556134b3565b6040518060600160405280603581526020016149956035913991505b509695505050505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61351b848484612a8a565b61352784848484613a4e565b61108b5760405162461bcd60e51b8152600401610caf90614822565b6060600c8054610bb79061447c565b6060816135765750506040805180820190915260018152600360fc1b602082015290565b8160005b81156135a0578061358a81614767565b91506135999050600a8361488a565b915061357a565b60008167ffffffffffffffff8111156135bb576135bb6141f1565b6040519080825280601f01601f1916602001820160405280156135e5576020820181803683370190505b5090505b8415611f32576135fa60018361489e565b9150613607600a866148b5565b613612906030614553565b60f81b81838151811061362757613627614732565b60200101906001600160f81b031916908160001a905350613649600a8661488a565b94506135e9565b60006001600160e01b031982166380ac58cd60e01b148061368157506001600160e01b03198216635b5e139f60e01b145b80610ba257506301ffc9a760e01b6001600160e01b0319831614610ba2565b610de5838383613b4c565b6136b4836113a6565b6001600160a01b0316826001600160a01b03161461371f5760405162461bcd60e51b815260206004820152602260248201527f596f7520617265206e6f7420746865206f776e6572206f662074686973206567604482015261339760f11b6064820152608401610caf565b600083815260116020526040812080546137c4919061373d9061447c565b80601f01602080910402602001604051908101604052809291908181526020018280546137699061447c565b80156137b65780601f1061378b576101008083540402835291602001916137b6565b820191906000526020600020905b81548152906001019060200180831161379957829003601f168201915b505050505060006004613c04565b6040516370686f6560e01b6020820152909150602401604051602081830303815290604052805190602001208160405160200161380191906148c9565b604051602081830303815290604052805190602001201415613876576001600160a01b0383166000908152600d602052604081208054909190613843906147e4565b909155506001600160a01b0382166000908152600d60205260408120805490919061386d90614767565b9091555061108b565b604051636472616760e01b602082015260240160405160208183030381529060405280519060200120816040516020016138b091906148c9565b60405160208183030381529060405280519060200120141561391c576001600160a01b0383166000908152600e6020526040812080549091906138f2906147e4565b909155506001600160a01b0382166000908152600e60205260408120805490919061386d90614767565b604051636368696360e01b6020820152602401604051602081830303815290604052805190602001208160405160200161395691906148c9565b60405160208183030381529060405280519060200120141561108b576001600160a01b0383166000908152600f602052604081208054909190613998906147e4565b909155506001600160a01b0382166000908152600f6020526040812080549091906139c290614767565b9091555050505050565b6139d68383613cdb565b6139e36000848484613a4e565b610de55760405162461bcd60e51b8152600401610caf90614822565b600080613a0b84613552565b3342604051602001613a1f939291906148e5565b60408051601f19818403018152919052805160209091012090506000613a4584836148b5565b95945050505050565b60006001600160a01b0384163b15613b4157604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613a92903390899088908890600401614924565b6020604051808303816000875af1925050508015613acd575060408051601f3d908101601f19168201909252613aca91810190614961565b60015b613b27573d808015613afb576040519150601f19603f3d011682016040523d82523d6000602084013e613b00565b606091505b508051613b1f5760405162461bcd60e51b8152600401610caf90614822565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611f32565b506001949350505050565b6001600160a01b038316613ba757613ba281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613bca565b816001600160a01b0316836001600160a01b031614613bca57613bca8382613e29565b6001600160a01b038216613be157610de581613ec6565b826001600160a01b0316826001600160a01b031614610de557610de58282613f75565b6060836000613c1385856147c1565b60ff1667ffffffffffffffff811115613c2e57613c2e6141f1565b6040519080825280601f01601f191660200182016040528015613c58576020820181803683370190505b50905060ff85165b8460ff16811015613cd157828181518110613c7d57613c7d614732565b01602001516001600160f81b03191682613c9a60ff89168461489e565b81518110613caa57613caa614732565b60200101906001600160f81b031916908160001a905350613cca81614767565b9050613c60565b5095945050505050565b6001600160a01b038216613d315760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610caf565b6000818152600260205260409020546001600160a01b031615613d965760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610caf565b613da2600083836136a0565b6001600160a01b0382166000908152600360205260408120805460019290613dcb908490614553565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001613e3684611740565b613e40919061489e565b600083815260076020526040902054909150808214613e93576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090613ed89060019061489e565b60008381526009602052604081205460088054939450909284908110613f0057613f00614732565b906000526020600020015490508060088381548110613f2157613f21614732565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613f5957613f5961497e565b6001900381819060005260206000200160009055905550505050565b6000613f8083611740565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054613fc59061447c565b90600052602060002090601f016020900481019282613fe7576000855561402d565b82601f1061400057805160ff191683800117855561402d565b8280016001018555821561402d579182015b8281111561402d578251825591602001919060010190614012565b5061403992915061403d565b5090565b5b80821115614039576000815560010161403e565b6001600160e01b03198116811461290157600080fd5b60006020828403121561407a57600080fd5b813561408581614052565b9392505050565b80356001600160a01b03811681146140a357600080fd5b919050565b6000602082840312156140ba57600080fd5b6140858261408c565b60005b838110156140de5781810151838201526020016140c6565b8381111561108b5750506000910152565b600081518084526141078160208601602086016140c3565b601f01601f19169290920160200192915050565b60208152600061408560208301846140ef565b60006020828403121561414057600080fd5b5035919050565b6000806040838503121561415a57600080fd5b6141638361408c565b946020939093013593505050565b60008060006060848603121561418657600080fd5b61418f8461408c565b925061419d6020850161408c565b9150604084013590509250925092565b803560ff811681146140a357600080fd5b600080604083850312156141d157600080fd5b6141da8361408c565b91506141e8602084016141ad565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115614222576142226141f1565b604051601f8501601f19908116603f0116810190828211818310171561424a5761424a6141f1565b8160405280935085815286868601111561426357600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561428f57600080fd5b813567ffffffffffffffff8111156142a657600080fd5b8201601f810184136142b757600080fd5b611f3284823560208401614207565b6000602082840312156142d857600080fd5b614085826141ad565b803580151581146140a357600080fd5b60006020828403121561430357600080fd5b614085826142e1565b60008060006040848603121561432157600080fd5b833567ffffffffffffffff8082111561433957600080fd5b818601915086601f83011261434d57600080fd5b81358181111561435c57600080fd5b8760208260051b850101111561437157600080fd5b60209283019550935061438791860190506141ad565b90509250925092565b600080604083850312156143a357600080fd5b6143ac8361408c565b91506141e8602084016142e1565b600080600080608085870312156143d057600080fd5b6143d98561408c565b93506143e76020860161408c565b925060408501359150606085013567ffffffffffffffff81111561440a57600080fd5b8501601f8101871361441b57600080fd5b61442a87823560208401614207565b91505092959194509250565b6000806040838503121561444957600080fd5b6144528361408c565b91506141e86020840161408c565b6000806040838503121561447357600080fd5b6141da836141ad565b600181811c9082168061449057607f821691505b602082108114156144b157634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156145665761456661453d565b500190565b6000835161457d8184602088016140c3565b8351908301906145918183602088016140c3565b01949350505050565b600060ff821660ff8114156145b1576145b161453d565b60010192915050565b60208082526030908201527f43616e6e6f7420696e746572616374207769746820612048617463686c696e6760408201526f3d103cb7ba903237903737ba1037bbb760811b606082015260800190565b600080835481600182811c91508083168061462657607f831692505b602080841082141561464657634e487b7160e01b86526022600452602486fd5b81801561465a576001811461466b57614698565b60ff19861689528489019650614698565b60008a81526020902060005b868110156146905781548b820152908501908301614677565b505084890196505b509498975050505050505050565b60208082526035908201527f596f757220656767206f722048617463686c696e677a206973206e6f7420656c604082015274696769626c6520746f20626520686174636865642160581b606082015260800190565b6020808252601d908201527f796f757220746f6b656e20697320616c72656164792068617463686564000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b60008160001904831182151516156147625761476261453d565b500290565b600060001982141561477b5761477b61453d565b5060010190565b600083516147948184602088016140c3565b8351908301906147a88183602088016140c3565b64173539b7b760d91b9101908152600501949350505050565b600060ff821660ff8416808210156147db576147db61453d565b90039392505050565b6000816147f3576147f361453d565b506000190190565b6000825161480d8184602087016140c3565b6265676760e81b920191825250600301919050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261489957614899614874565b500490565b6000828210156148b0576148b061453d565b500390565b6000826148c4576148c4614874565b500690565b600082516148db8184602087016140c3565b9190910192915050565b600084516148f78184602089016140c3565b60609490941b6bffffffffffffffffffffffff191691909301908152601481019190915260340192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614957908301846140ef565b9695505050505050565b60006020828403121561497357600080fd5b815161408581614052565b634e487b7160e01b600052603160045260246000fdfe596f757220656767206469646e277420686174636820746869732074696d652c20676f6f64206c75636b206e6578742074696d6521a264697066735822122089a61c144345083266671e06438f37c42b6c0befe5f191ff698f151cc1b1826064736f6c634300080c0033

Deployed Bytecode Sourcemap

322:16414:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3037:179;;;;;;;;;;-1:-1:-1;3037:179:5;;;;;:::i;:::-;;:::i;:::-;;;565:14:13;;558:22;540:41;;528:2;513:18;3037:179:5;;;;;;;;1631:55;;;;;;;;;;-1:-1:-1;1631:55:5;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1107:25:13;;;1095:2;1080:18;1631:55:5;961:177:13;2463:100:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4030:221::-;;;;;;;;;;-1:-1:-1;4030:221:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2243:32:13;;;2225:51;;2213:2;2198:18;4030:221:3;2079:203:13;3553:411:3;;;;;;;;;;-1:-1:-1;3553:411:3;;;;;:::i;:::-;;:::i;:::-;;884:42:5;;;;;;;;;;;;925:1;884:42;;;;;2718:4:13;2706:17;;;2688:36;;2676:2;2661:18;884:42:5;2546:184:13;1330:42:5;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1330:42:5;;;;;1581:113:4;;;;;;;;;;-1:-1:-1;1669:10:4;:17;1581:113;;4920:339:3;;;;;;;;;;-1:-1:-1;4920:339:3;;;;;:::i;:::-;;:::i;519:37:5:-;;;;;;;;;;-1:-1:-1;519:37:5;;;;-1:-1:-1;;;519:37:5;;;;;;1249:256:4;;;;;;;;;;-1:-1:-1;1249:256:4;;;;;:::i;:::-;;:::i;683:41:5:-;;;;;;;;;;;;719:5;683:41;;;;;3242:6:13;3230:19;;;3212:38;;3200:2;3185:18;683:41:5;3068:188:13;563:37:5;;;;;;;;;;-1:-1:-1;563:37:5;;;;-1:-1:-1;;;563:37:5;;;;;;4010:498;;;;;;;;;;-1:-1:-1;4010:498:5;;;;;:::i;:::-;;:::i;841:36::-;;;;;;;;;;;;876:1;841:36;;935:52;;;;;;;;;;;;979:8;935:52;;9867:140;;;;;;;;;;;;;:::i;5330:185:3:-;;;;;;;;;;-1:-1:-1;5330:185:3;;;;;:::i;:::-;;:::i;10534:480:5:-;;;;;;;;;;-1:-1:-1;10534:480:5;;;;;:::i;:::-;;:::i;1771:233:4:-;;;;;;;;;;-1:-1:-1;1771:233:4;;;;;:::i;:::-;;:::i;3899:101:5:-;;;;;;;;;;-1:-1:-1;3899:101:5;;;;;:::i;:::-;;:::i;3224:117::-;;;;;;;;;;-1:-1:-1;3224:117:5;;;;;:::i;:::-;;:::i;480:32::-;;;;;;;;;;-1:-1:-1;480:32:5;;;;-1:-1:-1;;;480:32:5;;;;;;2157:239:3;;;;;;;;;;-1:-1:-1;2157:239:3;;;;;:::i;:::-;;:::i;1505:55:5:-;;;;;;;;;;-1:-1:-1;1505:55:5;;;;;:::i;:::-;;;;;;;;;;;;;;731:41;;;;;;;;;;;;771:1;731:41;;5571:945;;;;;;:::i;:::-;;:::i;1887:208:3:-;;;;;;;;;;-1:-1:-1;1887:208:3;;;;;:::i;:::-;;:::i;1650:94:11:-;;;;;;;;;;;;;:::i;2232:131:5:-;;;;;;;;;;-1:-1:-1;2232:131:5;;;;;:::i;:::-;;:::i;1052:54::-;;;;;;;;;;;;1097:9;1052:54;;11026:462;;;;;;;;;;-1:-1:-1;11026:462:5;;;;;:::i;:::-;;:::i;2371:230::-;;;;;;;;;;-1:-1:-1;2371:230:5;;;;;:::i;:::-;;:::i;779:53::-;;;;;;;;;;;;821:11;779:53;;1808:38;;;;;;;;;;;;;;;;1438:60;;;;;;;;;;-1:-1:-1;1438:60:5;;;;;:::i;:::-;;;;;;;;;;;;;;999:87:11;;;;;;;;;;-1:-1:-1;1072:6:11;;-1:-1:-1;;;;;1072:6:11;999:87;;1853:39:5;;;;;;;;;;;;;;;;10057:469;;;;;;;;;;-1:-1:-1;10057:469:5;;;;;:::i;:::-;;:::i;2632:104:3:-;;;;;;;;;;;;;:::i;1240:42:5:-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1240:42:5;;;;;4323:295:3;;;;;;;;;;-1:-1:-1;4323:295:3;;;;;:::i;:::-;;:::i;1567:57:5:-;;;;;;;;;;-1:-1:-1;1567:57:5;;;;;:::i;:::-;;;;;;;;;;;;;;1748:47;;;;;;;;;;-1:-1:-1;1748:47:5;;;;;:::i;:::-;;;;;;;;;;;;;;;;994:51;;;;;;;;;;;;1037:8;994:51;;1693:48;;;;;;;;;;-1:-1:-1;1693:48:5;;;;;:::i;:::-;;:::i;1144:42::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1144:42:5;;;;;5586:328:3;;;;;;;;;;-1:-1:-1;5586:328:3;;;;;:::i;:::-;;:::i;2723:114:5:-;;;;;;;;;;-1:-1:-1;2723:114:5;;;;;:::i;:::-;-1:-1:-1;;;;;2813:16:5;2788:5;2813:16;;;:10;:16;;;;;;;;;2723:114;1289:34;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1289:34:5;;;;;390:17;;;;;;;;;;-1:-1:-1;390:17:5;;;;-1:-1:-1;;;;;390:17:5;;;2615:96;;;;;;;;;;-1:-1:-1;2615:96:5;;;;;:::i;:::-;;:::i;3352:409::-;;;;;;;;;;-1:-1:-1;3352:409:5;;;;;:::i;:::-;;:::i;1193:40::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1193:40:5;;;;;4550:1013;;;;;;:::i;:::-;;:::i;4689:164:3:-;;;;;;;;;;-1:-1:-1;4689:164:3;;;;;:::i;:::-;-1:-1:-1;;;;;4810:25:3;;;4786:4;4810:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4689:164;6571:2179:5;;;;;;;;;;-1:-1:-1;6571:2179:5;;;;;:::i;:::-;;:::i;1899:192:11:-;;;;;;;;;;-1:-1:-1;1899:192:11;;;;;:::i;:::-;;:::i;:44:5:-;;;;;;;;;;;;;;;;3037:179;3148:4;3172:36;3196:11;3172:23;:36::i;:::-;3165:43;3037:179;-1:-1:-1;;3037:179:5:o;2463:100:3:-;2517:13;2550:5;2543:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2463:100;:::o;4030:221::-;4106:7;7513:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7513:16:3;4126:73;;;;-1:-1:-1;;;4126:73:3;;8403:2:13;4126:73:3;;;8385:21:13;8442:2;8422:18;;;8415:30;8481:34;8461:18;;;8454:62;-1:-1:-1;;;8532:18:13;;;8525:42;8584:19;;4126:73:3;;;;;;;;;-1:-1:-1;4219:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4219:24:3;;4030:221::o;3553:411::-;3634:13;3650:23;3665:7;3650:14;:23::i;:::-;3634:39;;3698:5;-1:-1:-1;;;;;3692:11:3;:2;-1:-1:-1;;;;;3692:11:3;;;3684:57;;;;-1:-1:-1;;;3684:57:3;;8816:2:13;3684:57:3;;;8798:21:13;8855:2;8835:18;;;8828:30;8894:34;8874:18;;;8867:62;-1:-1:-1;;;8945:18:13;;;8938:31;8986:19;;3684:57:3;8614:397:13;3684:57:3;681:10:1;-1:-1:-1;;;;;3776:21:3;;;;:62;;-1:-1:-1;3801:37:3;3818:5;681:10:1;4689:164:3;:::i;3801:37::-;3754:168;;;;-1:-1:-1;;;3754:168:3;;9218:2:13;3754:168:3;;;9200:21:13;9257:2;9237:18;;;9230:30;9296:34;9276:18;;;9269:62;9367:26;9347:18;;;9340:54;9411:19;;3754:168:3;9016:420:13;3754:168:3;3935:21;3944:2;3948:7;3935:8;:21::i;:::-;3623:341;3553:411;;:::o;4920:339::-;5115:41;681:10:1;5148:7:3;5115:18;:41::i;:::-;5107:103;;;;-1:-1:-1;;;5107:103:3;;;;;;;:::i;:::-;5223:28;5233:4;5239:2;5243:7;5223:9;:28::i;1249:256:4:-;1346:7;1382:23;1399:5;1382:16;:23::i;:::-;1374:5;:31;1366:87;;;;-1:-1:-1;;;1366:87:4;;10061:2:13;1366:87:4;;;10043:21:13;10100:2;10080:18;;;10073:30;10139:34;10119:18;;;10112:62;-1:-1:-1;;;10190:18:13;;;10183:41;10241:19;;1366:87:4;9859:407:13;1366:87:4;-1:-1:-1;;;;;;1471:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1249:256::o;4010:498:5:-;1072:6:11;;-1:-1:-1;;;;;1072:6:11;681:10:1;1219:23:11;1211:68;;;;-1:-1:-1;;;1211:68:11;;;;;;;:::i;:::-;4080:14:5::1;4097:13;1669:10:4::0;:17;;1581:113;4097:13:5::1;4080:30:::0;-1:-1:-1;719:5:5::1;4130:10;;::::0;::::1;4080:30:::0;4130:10:::1;:::i;:::-;:24;;4121:56;;;::::0;-1:-1:-1;;;4121:56:5;;11099:2:13;4121:56:5::1;::::0;::::1;11081:21:13::0;11138:2;11118:18;;;11111:30;-1:-1:-1;;;11157:18:13;;;11150:48;11215:18;;4121:56:5::1;10897:342:13::0;4121:56:5::1;4198:4;::::0;:33:::1;::::0;-1:-1:-1;;;4198:33:5;;-1:-1:-1;;;;;11474:15:13;;;4198:33:5::1;::::0;::::1;11456:34:13::0;4198:4:5::1;11506:18:13::0;;;11499:43;4198:4:5;;::::1;::::0;:17:::1;::::0;11391:18:13;;4198:33:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;;;;;;;4242:24:5;::::1;;::::0;;;:20:::1;:24;::::0;;;;:29;;::::1;::::0;::::1;::::0;:24;:29:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;4299:1:5::1;::::0;-1:-1:-1;4284:217:5::1;4307:1;4302:6;;:1;:6;;;4284:217;;4330:20;4353:8;;::::0;::::1;:6:::0;:8:::1;:::i;:::-;4330:31;;4431:10;;;;;;;;;;;;;-1:-1:-1::0;;;4431:10:5::1;;::::0;4442:3:::1;;;;;;;;;;;;;-1:-1:-1::0;;;4442:3:5::1;;::::0;4414:32:::1;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;4414:32:5;;::::1;::::0;;;;;;4376:28:::1;::::0;;;:14:::1;4414:32;4376:28:::0;;;;;;:71;;::::1;::::0;:28;;:71;;::::1;::::0;::::1;:::i;:::-;;4462:27;4472:2;4476:12;4462:9;:27::i;:::-;-1:-1:-1::0;4310:3:5;::::1;::::0;::::1;:::i;:::-;;;;4284:217;;;;4069:439;4010:498:::0;;:::o;9867:140::-;1072:6:11;;-1:-1:-1;;;;;1072:6:11;681:10:1;1219:23:11;1211:68;;;;-1:-1:-1;;;1211:68:11;;;;;;;:::i;:::-;9962:37:5::1;::::0;9930:21:::1;::::0;9970:10:::1;::::0;9962:37;::::1;;;::::0;9930:21;;9915:12:::1;9962:37:::0;9915:12;9962:37;9930:21;9970:10;9962:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;9904:103;9867:140::o:0;5330:185:3:-;5468:39;5485:4;5491:2;5495:7;5468:39;;;;;;;;;;;;:16;:39::i;10534:480:5:-;10609:7;2086:10;2066:16;10609:7;2066;:16::i;:::-;-1:-1:-1;;;;;2066:30:5;;2058:91;;;;-1:-1:-1;;;2058:91:5;;;;;;;:::i;:::-;10720:10:::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;10720:10:5::1;::::0;;::::1;::::0;;;;10731:3;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;10731:3:5;;::::1;::::0;10703:32;;::::1;::::0;10731:3;10703:32:::1;;:::i;:::-;;::::0;;-1:-1:-1;;10703:32:5;;::::1;::::0;;;;;;10693:43;;10703:32:::1;10693:43:::0;;::::1;::::0;10664:23:::1;::::0;;;:14:::1;:23:::0;;;;;;10693:43;;10647:41:::1;::::0;10664:23;10647:41:::1;;:::i;:::-;;;;;;;;;;;;;10637:52;;;;;;:99;10629:165;;;;-1:-1:-1::0;;;10629:165:5::1;;;;;;;:::i;:::-;10814:24;::::0;;;:15:::1;:24;::::0;;;;;::::1;;10813:25;10805:67;;;;-1:-1:-1::0;;;10805:67:5::1;;;;;;;:::i;:::-;10895:4;::::0;:39:::1;::::0;-1:-1:-1;;;10895:39:5;;10905:10:::1;10895:39;::::0;::::1;14809:51:13::0;1037:8:5::1;14876:18:13::0;;;14869:34;-1:-1:-1;;;;;10895:4:5;;::::1;::::0;:9:::1;::::0;14782:18:13;;10895:39:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10955:51;10968:7;10977:10;925:1;10955:51;;:12;:51::i;1771:233:4:-:0;1846:7;1882:30;1669:10;:17;;1581:113;1882:30;1874:5;:38;1866:95;;;;-1:-1:-1;;;1866:95:4;;15116:2:13;1866:95:4;;;15098:21:13;15155:2;15135:18;;;15128:30;15194:34;15174:18;;;15167:62;-1:-1:-1;;;15245:18:13;;;15238:42;15297:19;;1866:95:4;14914:408:13;1866:95:4;1979:10;1990:5;1979:17;;;;;;;;:::i;:::-;;;;;;;;;1972:24;;1771:233;;;:::o;3899:101:5:-;1072:6:11;;-1:-1:-1;;;;;1072:6:11;681:10:1;1219:23:11;1211:68;;;;-1:-1:-1;;;1211:68:11;;;;;;;:::i;:::-;3967:4:5::1;:25:::0;;-1:-1:-1;;;;;;3967:25:5::1;-1:-1:-1::0;;;;;3967:25:5;;;::::1;::::0;;;::::1;::::0;;3899:101::o;3224:117::-;1072:6:11;;-1:-1:-1;;;;;1072:6:11;681:10:1;1219:23:11;1211:68;;;;-1:-1:-1;;;1211:68:11;;;;;;;:::i;:::-;3306:27:5;;::::1;::::0;:16:::1;::::0;:27:::1;::::0;::::1;::::0;::::1;:::i;2157:239:3:-:0;2229:7;2265:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2265:16:3;2300:19;2292:73;;;;-1:-1:-1;;;2292:73:3;;15661:2:13;2292:73:3;;;15643:21:13;15700:2;15680:18;;;15673:30;15739:34;15719:18;;;15712:62;-1:-1:-1;;;15790:18:13;;;15783:39;15839:19;;2292:73:3;15459:405:13;5571:945:5;5637:10;5650:13;1669:10:4;:17;;1581:113;5650:13:5;5692:12;;5637:26;;-1:-1:-1;;;;5692:12:5;;;;5684:39;;;;-1:-1:-1;;;5684:39:5;;16071:2:13;5684:39:5;;;16053:21:13;16110:2;16090:18;;;16083:30;-1:-1:-1;;;16129:18:13;;;16122:44;16183:18;;5684:39:5;15869:338:13;5684:39:5;5743:17;;-1:-1:-1;;;5743:17:5;;;;5742:18;5734:58;;;;-1:-1:-1;;;5734:58:5;;16414:2:13;5734:58:5;;;16396:21:13;16453:2;16433:18;;;16426:30;16492:29;16472:18;;;16465:57;16539:18;;5734:58:5;16212:351:13;5734:58:5;5828:1;5811:14;:18;;;:55;;;;-1:-1:-1;771:1:5;5833:33;;;;;5811:55;5803:95;;;;-1:-1:-1;;;5803:95:5;;16770:2:13;5803:95:5;;;16752:21:13;16809:2;16789:18;;;16782:30;16848:29;16828:18;;;16821:57;16895:18;;5803:95:5;16568:351:13;5803:95:5;719:5;5917:19;;;;:2;:19;:::i;:::-;:33;;5909:74;;;;-1:-1:-1;;;5909:74:5;;17126:2:13;5909:74:5;;;17108:21:13;17165:2;17145:18;;;17138:30;17204;17184:18;;;17177:58;17252:18;;5909:74:5;16924:352:13;5909:74:5;6038:9;6002:32;;;;821:11;6002:32;:::i;:::-;:45;;5994:84;;;;-1:-1:-1;;;5994:84:5;;17656:2:13;5994:84:5;;;17638:21:13;17695:2;17675:18;;;17668:30;17734:28;17714:18;;;17707:56;17780:18;;5994:84:5;17454:350:13;5994:84:5;6091:4;;:41;;-1:-1:-1;;;6091:41:5;;6109:10;6091:41;;;11456:34:13;6091:4:5;11506:18:13;;;11499:43;-1:-1:-1;;;;;6091:4:5;;;;:17;;11391:18:13;;6091:41:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6164:10:5;6143:32;;;;:20;:32;;;;;:50;;;;;;-1:-1:-1;6143:32:5;;-1:-1:-1;6143:50:5;;;;;:::i;:::-;;;;-1:-1:-1;6223:1:5;;-1:-1:-1;6206:303:5;6231:14;6226:19;;:1;:19;6206:303;;6267:20;6290:6;6295:1;6290:2;:6;:::i;:::-;6267:29;;6366:10;;;;;;;;;;;;;-1:-1:-1;;;6366:10:5;;;6377:3;;;;;;;;;;;;;-1:-1:-1;;;6377:3:5;;;6349:32;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;6349:32:5;;;;;;;;;6311:28;;;;:14;6349:32;6311:28;;;;;;:71;;;;:28;;:71;;;;;:::i;:::-;;6397:35;6407:10;6419:12;6397:9;:35::i;:::-;6447:50;6460:12;6474:10;876:1;6447:12;:50::i;:::-;;6252:257;6247:3;;;;:::i;:::-;;;6206:303;;1887:208:3;1959:7;-1:-1:-1;;;;;1987:19:3;;1979:74;;;;-1:-1:-1;;;1979:74:3;;18151:2:13;1979:74:3;;;18133:21:13;18190:2;18170:18;;;18163:30;18229:34;18209:18;;;18202:62;-1:-1:-1;;;18280:18:13;;;18273:40;18330:19;;1979:74:3;17949:406:13;1979:74:3;-1:-1:-1;;;;;;2071:16:3;;;;;:9;:16;;;;;;;1887:208::o;1650:94:11:-;1072:6;;-1:-1:-1;;;;;1072:6:11;681:10:1;1219:23:11;1211:68;;;;-1:-1:-1;;;1211:68:11;;;;;;;:::i;:::-;1715:21:::1;1733:1;1715:9;:21::i;:::-;1650:94::o:0;2232:131:5:-;1072:6:11;;-1:-1:-1;;;;;1072:6:11;681:10:1;1219:23:11;1211:68;;;;-1:-1:-1;;;1211:68:11;;;;;;;:::i;:::-;2317:17:5::1;:38:::0;;;::::1;;-1:-1:-1::0;;;2317:38:5::1;-1:-1:-1::0;;;;2317:38:5;;::::1;::::0;;;::::1;::::0;;2232:131::o;11026:462::-;11099:7;2086:10;2066:16;11099:7;2066;:16::i;:::-;-1:-1:-1;;;;;2066:30:5;;2058:91;;;;-1:-1:-1;;;2058:91:5;;;;;;;:::i;:::-;11210:10:::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;11210:10:5::1;::::0;;::::1;::::0;;;;11221:3;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;11221:3:5;;::::1;::::0;11193:32;;::::1;::::0;11221:3;11193:32:::1;;:::i;:::-;;::::0;;-1:-1:-1;;11193:32:5;;::::1;::::0;;;;;;11183:43;;11193:32:::1;11183:43:::0;;::::1;::::0;11154:23:::1;::::0;;;:14:::1;:23:::0;;;;;;11183:43;;11137:41:::1;::::0;11154:23;11137:41:::1;;:::i;:::-;;;;;;;;;;;;;11127:52;;;;;;:99;11119:165;;;;-1:-1:-1::0;;;11119:165:5::1;;;;;;;:::i;:::-;11304:24;::::0;;;:15:::1;:24;::::0;;;;;::::1;;11303:25;11295:67;;;;-1:-1:-1::0;;;11295:67:5::1;;;;;;;:::i;:::-;11382:4;::::0;:41:::1;::::0;-1:-1:-1;;;11382:41:5;;11392:10:::1;11382:41;::::0;::::1;14809:51:13::0;1097:9:5::1;14876:18:13::0;;;14869:34;-1:-1:-1;;;;;11382:4:5;;::::1;::::0;:9:::1;::::0;14782:18:13;;11382:41:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;11444:36;11457:7;11466:10;11478:1;11444:12;:36::i;2371:230::-:0;1072:6:11;;-1:-1:-1;;;;;1072:6:11;681:10:1;1219:23:11;1211:68;;;;-1:-1:-1;;;1211:68:11;;;;;;;:::i;:::-;2482:9:5::1;2477:117;2497:20:::0;;::::1;2477:117;;;2566:16;2539:10;:24;2550:9;;2560:1;2550:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;2539:24:5::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;2539:24:5;:43;;-1:-1:-1;;2539:43:5::1;;::::0;;;::::1;::::0;;;::::1;::::0;;2519:3;::::1;::::0;::::1;:::i;:::-;;;;2477:117;;10057:469:::0;10127:7;2086:10;2066:16;10127:7;2066;:16::i;:::-;-1:-1:-1;;;;;2066:30:5;;2058:91;;;;-1:-1:-1;;;2058:91:5;;;;;;;:::i;:::-;10238:10:::1;::::0;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;10238:10:5::1;::::0;;::::1;::::0;;;;10249:3;;;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;10249:3:5;;::::1;::::0;10221:32;;::::1;::::0;10249:3;10221:32:::1;;:::i;:::-;;::::0;;-1:-1:-1;;10221:32:5;;::::1;::::0;;;;;;10211:43;;10221:32:::1;10211:43:::0;;::::1;::::0;10182:23:::1;::::0;;;:14:::1;:23:::0;;;;;;10211:43;;10165:41:::1;::::0;10182:23;10165:41:::1;;:::i;:::-;;;;;;;;;;;;;10155:52;;;;;;:99;10147:165;;;;-1:-1:-1::0;;;10147:165:5::1;;;;;;;:::i;:::-;10332:24;::::0;;;:15:::1;:24;::::0;;;;;::::1;;10331:25;10323:67;;;;-1:-1:-1::0;;;10323:67:5::1;;;;;;;:::i;:::-;10412:4;::::0;:40:::1;::::0;-1:-1:-1;;;10412:40:5;;10422:10:::1;10412:40;::::0;::::1;14809:51:13::0;979:8:5::1;14876:18:13::0;;;14869:34;-1:-1:-1;;;;;10412:4:5;;::::1;::::0;:9:::1;::::0;14782:18:13;;10412:40:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;10473:45;10486:7;10495:10;876:1;10473:45;;:12;:45::i;2632:104:3:-:0;2688:13;2721:7;2714:14;;;;;:::i;4323:295::-;-1:-1:-1;;;;;4426:24:3;;681:10:1;4426:24:3;;4418:62;;;;-1:-1:-1;;;4418:62:3;;18562:2:13;4418:62:3;;;18544:21:13;18601:2;18581:18;;;18574:30;18640:27;18620:18;;;18613:55;18685:18;;4418:62:3;18360:349:13;4418:62:3;681:10:1;4493:32:3;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;4493:42:3;;;;;;;;;;;;:53;;-1:-1:-1;;4493:53:3;;;;;;;;;;4562:48;;540:41:13;;;4493:42:3;;681:10:1;4562:48:3;;513:18:13;4562:48:3;;;;;;;4323:295;;:::o;1693:48:5:-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5586:328:3:-;5761:41;681:10:1;5794:7:3;5761:18;:41::i;:::-;5753:103;;;;-1:-1:-1;;;5753:103:3;;;;;;;:::i;:::-;5867:39;5881:4;5887:2;5891:7;5900:5;5867:13;:39::i;2615:96:5:-;1072:6:11;;-1:-1:-1;;;;;1072:6:11;681:10:1;1219:23:11;1211:68;;;;-1:-1:-1;;;1211:68:11;;;;;;;:::i;:::-;2680:12:5::1;:23:::0;;;::::1;;-1:-1:-1::0;;;2680:23:5::1;-1:-1:-1::0;;;;2680:23:5;;::::1;::::0;;;::::1;::::0;;2615:96::o;3352:409::-;7489:4:3;7513:16;;;:7;:16;;;;;;3425:13:5;;-1:-1:-1;;;;;7513:16:3;3451:76:5;;;;-1:-1:-1;;;3451:76:5;;18916:2:13;3451:76:5;;;18898:21:13;18955:2;18935:18;;;18928:30;18994:34;18974:18;;;18967:62;-1:-1:-1;;;19045:18:13;;;19038:45;19100:19;;3451:76:5;18714:411:13;3451:76:5;3540:21;3564:10;:8;:10::i;:::-;3593:23;3619;;;:14;:23;;;;;3593:49;;3540:34;;-1:-1:-1;3593:23:5;;:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3692:1;3674:7;3668:21;:25;:85;;;;;;;;;;;;;;;;;3720:7;3729:9;3703:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3668:85;3661:92;3352:409;-1:-1:-1;;;;3352:409:5:o;4550:1013::-;4625:10;4638:13;1669:10:4;:17;;1581:113;4638:13:5;4672:17;;4625:26;;-1:-1:-1;;;;4672:17:5;;;;4664:49;;;;-1:-1:-1;;;4664:49:5;;19974:2:13;4664:49:5;;;19956:21:13;20013:2;19993:18;;;19986:30;-1:-1:-1;;;20032:18:13;;;20025:49;20091:18;;4664:49:5;19772:343:13;4664:49:5;4733:12;;-1:-1:-1;;;4733:12:5;;;;4732:13;4724:48;;;;-1:-1:-1;;;4724:48:5;;20322:2:13;4724:48:5;;;20304:21:13;20361:2;20341:18;;;20334:30;-1:-1:-1;;;20380:18:13;;;20373:52;20442:18;;4724:48:5;20120:346:13;4724:48:5;4820:10;4809:22;;;;:10;:22;;;;;;;;;;4791:40;;;;;;;:62;;;4852:1;4835:14;:18;;;4791:62;4783:110;;;;-1:-1:-1;;;4783:110:5;;20673:2:13;4783:110:5;;;20655:21:13;20712:2;20692:18;;;20685:30;20751:34;20731:18;;;20724:62;-1:-1:-1;;;20802:18:13;;;20795:33;20845:19;;4783:110:5;20471:399:13;4783:110:5;719:5;4912:19;;;;:2;:19;:::i;:::-;:33;;4904:74;;;;-1:-1:-1;;;4904:74:5;;17126:2:13;4904:74:5;;;17108:21:13;17165:2;17145:18;;;17138:30;17204;17184:18;;;17177:58;17252:18;;4904:74:5;16924:352:13;4904:74:5;5033:9;4997:32;;;;821:11;4997:32;:::i;:::-;:45;;4989:85;;;;-1:-1:-1;;;4989:85:5;;21077:2:13;4989:85:5;;;21059:21:13;21116:2;21096:18;;;21089:30;21155:29;21135:18;;;21128:57;21202:18;;4989:85:5;20875:351:13;4989:85:5;5098:10;5087:22;;;;:10;:22;;;;;:40;;5113:14;;5087:22;:40;;5113:14;;5087:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5140:4:5;;:41;;-1:-1:-1;;;5140:41:5;;5158:10;5140:41;;;11456:34:13;-1:-1:-1;11506:18:13;;;11499:43;-1:-1:-1;;;;;5140:4:5;;;;:17;;11391:18:13;;5140:41:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5213:10:5;5192:32;;;;:20;:32;;;;;:50;;;;;;-1:-1:-1;5192:32:5;;-1:-1:-1;5192:50:5;;;;;:::i;:::-;;;;-1:-1:-1;5272:1:5;;-1:-1:-1;5255:301:5;5280:14;5275:19;;:1;:19;5255:301;;5316:20;5339:4;5342:1;5339:2;:4;:::i;:::-;5316:27;;5413:10;;;;;;;;;;;;;-1:-1:-1;;;5413:10:5;;;5424:3;;;;;;;;;;;;;-1:-1:-1;;;5424:3:5;;;5396:32;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;5396:32:5;;;;;;;;;5358:28;;;;:14;5396:32;5358:28;;;;;;:71;;;;:28;;:71;;;;;:::i;:::-;;5444:35;5454:10;5466:12;5444:9;:35::i;:::-;5494:50;5507:12;5521:10;876:1;5494:12;:50::i;:::-;;5301:255;5296:3;;;;:::i;:::-;;;5255:301;;6571:2179;1072:6:11;;-1:-1:-1;;;;;1072:6:11;681:10:1;1219:23:11;1211:68;;;;-1:-1:-1;;;1211:68:11;;;;;;;:::i;:::-;6653:14:5::1;6670:13;1669:10:4::0;:17;;1581:113;6670:13:5::1;6653:30:::0;-1:-1:-1;6706:18:5::1;::::0;::::1;::::0;;:40:::1;;;6728:13;:18;;6745:1;6728:18;6706:40;:62;;;;6750:13;:18;;6767:1;6750:18;6706:62;6697:108;;;::::0;-1:-1:-1;;;6697:108:5;;21633:2:13;6697:108:5::1;::::0;::::1;21615:21:13::0;;;21652:18;;;21645:30;21711:34;21691:18;;;21684:62;21763:18;;6697:108:5::1;21431:356:13::0;6697:108:5::1;719:5;6825:10;;::::0;::::1;:6:::0;:10:::1;:::i;:::-;:24;;6816:56;;;::::0;-1:-1:-1;;;6816:56:5;;11099:2:13;6816:56:5::1;::::0;::::1;11081:21:13::0;11138:2;11118:18;;;11111:30;-1:-1:-1;;;11157:18:13;;;11150:48;11215:18;;6816:56:5::1;10897:342:13::0;6816:56:5::1;6919:4;::::0;:41:::1;::::0;-1:-1:-1;;;6919:41:5;;6937:10:::1;6919:41;::::0;::::1;11456:34:13::0;6901:7:5::1;11506:18:13::0;;;11499:43;;;6901:7:5;-1:-1:-1;;;;;6919:4:5::1;::::0;:17:::1;::::0;11391:18:13;;6919:41:5::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;7058:13;:18;;7075:1;7058:18;7054:1687;;;7130:5;7104:22;;7100:1;:26;;;;;;:::i;:::-;:35;;7092:85;;;::::0;-1:-1:-1;;;7092:85:5;;21994:2:13;7092:85:5::1;::::0;::::1;21976:21:13::0;22033:2;22013:18;;;22006:30;22072:34;22052:18;;;22045:62;-1:-1:-1;;;22123:18:13;;;22116:35;22168:19;;7092:85:5::1;21792:401:13::0;7092:85:5::1;-1:-1:-1::0;7201:1:5::1;7192:421;7209:1;7204:6;;:1;:6;;;7192:421;;7236:20;7259:8;;::::0;::::1;:6:::0;:8:::1;:::i;:::-;7236:31;;7342:7;;;;;;;;;;;;;-1:-1:-1::0;;;7342:7:5::1;;::::0;7350:33:::1;:22;;:31;:33::i;:::-;7325:59;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;7325:59:5;;::::1;::::0;;;;;;7287:28:::1;::::0;;;:14:::1;7325:59;7287:28:::0;;;;;;:98;;::::1;::::0;:28;;:98;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;7432:10:5::1;7406:37;::::0;;;:25:::1;:37;::::0;;;;7404:39;;7406:37;;;7404:39:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;7464:22:5::1;7462:24:::0;;7464:22:::1;::::0;7462:24:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;7507:35:5::1;7517:10;7529:12:::0;7507:9:::1;:35::i;:::-;7561:29;::::0;;;:15:::1;:29;::::0;;;;:36;;-1:-1:-1;;7561:36:5::1;7593:4;7561:36;::::0;;7212:3:::1;::::0;::::1;:::i;:::-;;;7192:421;;;7054:1687;;;7634:13;:18;;7651:1;7634:18;7630:1111;;;7701:4;7680:17;;7676:1;:21;;;;;;:::i;:::-;:29;;7668:77;;;::::0;-1:-1:-1;;;7668:77:5;;22400:2:13;7668:77:5::1;::::0;::::1;22382:21:13::0;22439:2;22419:18;;;22412:30;22478:34;22458:18;;;22451:62;-1:-1:-1;;;22529:18:13;;;22522:33;22572:19;;7668:77:5::1;22198:399:13::0;7668:77:5::1;-1:-1:-1::0;7769:1:5::1;7760:405;7777:1;7772:6;;:1;:6;;;7760:405;;7804:20;7827:8;;::::0;::::1;:6:::0;:8:::1;:::i;:::-;7804:31;;7910:6;;;;;;;;;;;;;-1:-1:-1::0;;;7910:6:5::1;;::::0;7917:28:::1;:17;;:26;:28::i;:::-;7893:53;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;7893:53:5;;::::1;::::0;;;;;;7855:28:::1;::::0;;;:14:::1;7893:53;7855:28:::0;;;;;;:92;;::::1;::::0;:28;;:92;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;7989:10:5::1;7968:32;::::0;;;:20:::1;:32;::::0;;;;7966:34;;7968:32;;;7966:34:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;8021:17:5::1;8019:19:::0;;8021:17:::1;::::0;8019:19:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;8059:35:5::1;8069:10;8081:12:::0;8059:9:::1;:35::i;:::-;8113:29;::::0;;;:15:::1;:29;::::0;;;;:36;;-1:-1:-1;;8113:36:5::1;8145:4;8113:36;::::0;;7780:3:::1;::::0;::::1;:::i;:::-;;;7760:405;;7630:1111;8187:18;::::0;::::1;8183:558;;8256:4;8233:19;;8229:1;:23;;;;;;:::i;:::-;:31;;8221:80;;;::::0;-1:-1:-1;;;8221:80:5;;22804:2:13;8221:80:5::1;::::0;::::1;22786:21:13::0;22843:2;22823:18;;;22816:30;22882:34;22862:18;;;22855:62;-1:-1:-1;;;22933:18:13;;;22926:34;22977:19;;8221:80:5::1;22602:400:13::0;8221:80:5::1;-1:-1:-1::0;8325:1:5::1;8316:414;8333:1;8328:6;;:1;:6;;;8316:414;;8360:20;8383:10;;::::0;::::1;:6:::0;:10:::1;:::i;:::-;8360:33;;8468:7;;;;;;;;;;;;;-1:-1:-1::0;;;8468:7:5::1;;::::0;8476:30:::1;:19;;:28;:30::i;:::-;8451:56;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;8451:56:5;;::::1;::::0;;;;;;8413:28:::1;::::0;;;:14:::1;8451:56;8413:28:::0;;;;;;:95;;::::1;::::0;:28;;:95;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;8552:10:5::1;8529:34;::::0;;;:22:::1;:34;::::0;;;;8527:36;;8529:34;;;8527:36:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;8584:19:5::1;8582:21:::0;;8584:19:::1;::::0;8582:21:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;8624:35:5::1;8634:10;8646:12:::0;8624:9:::1;:35::i;:::-;8678:29;::::0;;;:15:::1;:29;::::0;;;;:36;;-1:-1:-1;;8678:36:5::1;8710:4;8678:36;::::0;;8336:3:::1;::::0;::::1;:::i;:::-;;;8316:414;;1899:192:11::0;1072:6;;-1:-1:-1;;;;;1072:6:11;681:10:1;1219:23:11;1211:68;;;;-1:-1:-1;;;1211:68:11;;;;;;;:::i;:::-;-1:-1:-1;;;;;1988:22:11;::::1;1980:73;;;::::0;-1:-1:-1;;;1980:73:11;;23209:2:13;1980:73:11::1;::::0;::::1;23191:21:13::0;23248:2;23228:18;;;23221:30;23287:34;23267:18;;;23260:62;-1:-1:-1;;;23338:18:13;;;23331:36;23384:19;;1980:73:11::1;23007:402:13::0;1980:73:11::1;2064:19;2074:8;2064:9;:19::i;:::-;1899:192:::0;:::o;941:224:4:-;1043:4;-1:-1:-1;;;;;;1067:50:4;;-1:-1:-1;;;1067:50:4;;:90;;;1121:36;1145:11;1121:23;:36::i;11406:174:3:-;11481:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11481:29:3;-1:-1:-1;;;;;11481:29:3;;;;;;;;:24;;11535:23;11481:24;11535:14;:23::i;:::-;-1:-1:-1;;;;;11526:46:3;;;;;;;;;;;11406:174;;:::o;7718:348::-;7811:4;7513:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7513:16:3;7828:73;;;;-1:-1:-1;;;7828:73:3;;23616:2:13;7828:73:3;;;23598:21:13;23655:2;23635:18;;;23628:30;23694:34;23674:18;;;23667:62;-1:-1:-1;;;23745:18:13;;;23738:42;23797:19;;7828:73:3;23414:408:13;7828:73:3;7912:13;7928:23;7943:7;7928:14;:23::i;:::-;7912:39;;7981:5;-1:-1:-1;;;;;7970:16:3;:7;-1:-1:-1;;;;;7970:16:3;;:51;;;;8014:7;-1:-1:-1;;;;;7990:31:3;:20;8002:7;7990:11;:20::i;:::-;-1:-1:-1;;;;;7990:31:3;;7970:51;:87;;;-1:-1:-1;;;;;;4810:25:3;;;4786:4;4810:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;8025:32;4689:164;8772:1084:5;8925:4;-1:-1:-1;;;;;8898:31:5;:23;8913:7;8898:14;:23::i;:::-;-1:-1:-1;;;;;8898:31:5;;8890:87;;;;-1:-1:-1;;;8890:87:5;;24029:2:13;8890:87:5;;;24011:21:13;24068:2;24048:18;;;24041:30;24107:34;24087:18;;;24080:62;-1:-1:-1;;;24158:18:13;;;24151:41;24209:19;;8890:87:5;23827:407:13;8890:87:5;-1:-1:-1;;;;;8996:16:5;;8988:65;;;;-1:-1:-1;;;8988:65:5;;24441:2:13;8988:65:5;;;24423:21:13;24480:2;24460:18;;;24453:30;24519:34;24499:18;;;24492:62;-1:-1:-1;;;24570:18:13;;;24563:34;24614:19;;8988:65:5;24239:400:13;8988:65:5;9066:39;9087:4;9093:2;9097:7;9066:20;:39::i;:::-;9170:29;9187:1;9191:7;9170:8;:29::i;:::-;9216:4;;:27;;-1:-1:-1;;;9216:27:5;;-1:-1:-1;;;;;11474:15:13;;;9216:27:5;;;11456:34:13;11526:15;;;11506:18;;;11499:43;9216:4:5;;;;:17;;11391:18:13;;9216:27:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9350:10;;;;;;;;;;;;;-1:-1:-1;;;9350:10:5;;;9361:3;;;;;;;;;;;;;-1:-1:-1;;;9361:3:5;;;9333:32;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;9333:32:5;;;;;;;;;9323:43;;9333:32;9323:43;;;;9294:23;;;;:14;:23;;;;;;9323:43;;9277:41;;9294:23;9277:41;;:::i;:::-;;;;;;;;;;;;;9267:52;;;;;;:99;9261:167;;9383:33;9398:7;9407:4;9413:2;9383:14;:33::i;:::-;9535:10;;;;;;;;;;;-1:-1:-1;;;9535:10:5;;;;;;;;9546:3;;;;;;;;;;-1:-1:-1;;;9546:3:5;;;;9518:32;;;;9546:3;9518:32;;:::i;:::-;;;;-1:-1:-1;;9518:32:5;;;;;;;;;9508:43;;9518:32;9508:43;;;;9479:23;;;;:14;:23;;;;;;9508:43;;9462:41;;9479:23;9462:41;;:::i;:::-;;;;;;;;;;;;;9452:52;;;;;;:99;9448:252;;;-1:-1:-1;;;;;9569:26:5;;;;;;:20;:26;;;;;9567:28;;9569:26;;;9567:28;;;:::i;:::-;;;;-1:-1:-1;;;;;;9612:24:5;;;;;;:20;:24;;;;;9610:26;;9612:24;;;9610:26;;;:::i;:::-;;;;-1:-1:-1;9651:37:5;9664:7;9673:2;876:1;9651:12;:37::i;:::-;;9448:252;-1:-1:-1;;;;;9722:15:5;;;;;;:9;:15;;;;;9720:17;;9722:15;;;9720:17;;;:::i;:::-;;;;-1:-1:-1;;;;;;9750:13:5;;;;;;:9;:13;;;;;9748:15;;9750:13;;;9748:15;;;:::i;:::-;;;;-1:-1:-1;9774:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9774:21:5;-1:-1:-1;;;;;9774:21:5;;;;;;;;;9821:27;;9774:16;;9821:27;;;;;;;8772:1084;;;:::o;8408:110:3:-;8484:26;8494:2;8498:7;8484:26;;;;;;;;;;;;:9;:26::i;11500:3720:5:-;11585:13;11708:10;;;;;;;;;;;;;-1:-1:-1;;;11708:10:5;;;11691:34;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11691:34:5;;;;;;;;;11681:45;;11691:34;11681:45;;;;11652:23;;;;:14;:23;;;;;;11681:45;;11635:41;;11652:23;11635:41;;:::i;:::-;;;;;;;;;;;;;11625:52;;;;;;:101;11617:168;;;;-1:-1:-1;;;11617:168:5;;25433:2:13;11617:168:5;;;25415:21:13;25472:2;25452:18;;;25445:30;25511:34;25491:18;;;25484:62;-1:-1:-1;;;25562:18:13;;;25555:52;25624:19;;11617:168:5;25231:418:13;11617:168:5;11806:16;11837:24;11864:53;11885:25;11896:7;11905:4;11885:10;:25::i;:::-;11875:35;;:7;:35;:::i;:::-;11912:4;11864:10;:53::i;:::-;11837:80;;11928:20;11959:23;12001:25;12012:7;12021:4;12001:10;:25::i;:::-;11985:13;:7;11995:3;11985:13;:::i;:::-;:41;;;;:::i;:::-;11959:67;;12061:16;12049:8;:28;12045:3143;;;12093:28;;;;;;;;;;;;;-1:-1:-1;;;12093:28:5;;;;;12136:25;12164:31;12175:15;12192:2;12164:10;:31::i;:::-;-1:-1:-1;;;;;12212:24:5;;;;;;:20;:24;;;;;12210:26;;12136:59;;-1:-1:-1;12212:24:5;12210:26;;;:::i;:::-;;;;-1:-1:-1;12286:1:5;12265:22;;;:48;;-1:-1:-1;12291:22:5;;12265:48;:74;;;;12317:17;12338:1;12317:22;12265:74;:100;;;;12343:17;12364:1;12343:22;12265:100;:126;;;;12369:17;12390:1;12369:22;12265:126;:152;;;;12395:17;12416:1;12395:22;12265:152;12261:2773;;;12464:4;12441:19;;:27;12437:798;;12542:7;;;;;;;;;;;;;-1:-1:-1;;;12542:7:5;;;12550:30;:19;;:28;:30::i;:::-;12525:56;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12525:56:5;;;;;;;;;12492:23;;;;:14;12525:56;12492:23;;;;;;:90;;;;:23;;:90;;;;;:::i;:::-;-1:-1:-1;;;;;;12607:26:5;;;;;;:22;:26;;;;;12605:28;;12607:26;;;12605:28;;;:::i;:::-;;;;-1:-1:-1;12658:19:5;12656:21;;12658:19;;12656:21;;;:::i;:::-;;;;-1:-1:-1;12261:2773:5;;12437:798;12728:4;12707:17;;:25;12703:532;;12806:6;;;;;;;;;;;;;-1:-1:-1;;;12806:6:5;;;12813:28;:17;;:26;:28::i;:::-;12789:53;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12789:53:5;;;;;;;;;12756:23;;;;:14;12789:53;12756:23;;;;;;:87;;;;:23;;:87;;;;;:::i;:::-;-1:-1:-1;;;;;;12868:24:5;;;;;;:20;:24;;;;;12866:26;;12868:24;;;12866:26;;;:::i;:::-;;;;-1:-1:-1;12917:17:5;12915:19;;12917:17;;12915:19;;;:::i;12703:532::-;12990:5;12964:22;;:31;12960:275;;13071:7;;;;;;;;;;;;;-1:-1:-1;;;13071:7:5;;;13079:33;:22;;:31;:33::i;:::-;13054:59;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;13054:59:5;;;;;;;;;13021:23;;;;:14;13054:59;13021:23;;;;;;:93;;;;:23;;:93;;;;;:::i;:::-;-1:-1:-1;;;;;;13139:29:5;;;;;;:25;:29;;;;;13137:31;;13139:29;;;13137:31;;;:::i;:::-;;;;-1:-1:-1;13193:22:5;13191:24;;13193:22;;13191:24;;;:::i;12960:275::-;12261:2773;;;13260:17;13281:1;13260:22;:48;;;;13286:17;13307:1;13286:22;13260:48;:74;;;;13312:17;13333:1;13312:22;13260:74;13256:1778;;;13379:4;13358:17;;:25;13354:798;;13457:6;;;;;;;;;;;;;-1:-1:-1;;;13457:6:5;;;13464:28;:17;;:26;:28::i;13354:798::-;13638:4;13615:19;;:27;13611:541;;13716:7;;;;;;;;;;;;;-1:-1:-1;;;13716:7:5;;;13724:30;:19;;:28;:30::i;13256:1778::-;14177:17;14198:1;14177:22;14173:861;;;14249:5;14223:22;;:31;14219:800;;14330:7;;;;;;;;;;;;;-1:-1:-1;;;14330:7:5;;;14338:33;:22;;:31;:33::i;:::-;14313:59;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;14313:59:5;;;;;;;;;14280:23;;;;:14;14313:59;14280:23;;;;;;:93;;;;:23;;:93;;;;;:::i;:::-;-1:-1:-1;;;;;;14396:29:5;;;;;;:25;:29;;;;;:32;;;;;;:::i;:::-;;;;-1:-1:-1;;14451:22:5;:25;;;:22;:25;;;:::i;:::-;;;;;;14219:800;;;14527:4;14506:17;;:25;14502:517;;14605:6;;;;;;;;;;;;;-1:-1:-1;;;14605:6:5;;;14612:28;:17;;:26;:28::i;14502:517::-;14786:4;14763:19;;:27;14759:260;;14864:7;;;;;;;;;;;;;-1:-1:-1;;;14864:7:5;;;14872:30;:19;;:28;:30::i;:::-;14847:56;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;14847:56:5;;;;;;;;;14814:23;;;;:14;14847:56;14814:23;;;;;;:90;;;;:23;;:90;;;;;:::i;:::-;-1:-1:-1;;;;;;14929:26:5;;;;;;:22;:26;;;;;14927:28;;14929:26;;;14927:28;;;:::i;:::-;;;;-1:-1:-1;14980:19:5;14978:21;;14980:19;;14978:21;;;:::i;:::-;;;;-1:-1:-1;14759:260:5;-1:-1:-1;15048:24:5;;;;:15;:24;;;;;:31;;-1:-1:-1;;15048:31:5;15075:4;15048:31;;;12045:3143;;;15112:64;;;;;;;;;;;;;;;;;;;12045:3143;-1:-1:-1;15206:6:5;11500:3720;-1:-1:-1;;;;;;11500:3720:5:o;2099:173:11:-;2174:6;;;-1:-1:-1;;;;;2191:17:11;;;-1:-1:-1;;;;;;2191:17:11;;;;;;;2224:40;;2174:6;;;2191:17;2174:6;;2224:40;;2155:16;;2224:40;2144:128;2099:173;:::o;6796:315:3:-;6953:28;6963:4;6969:2;6973:7;6953:9;:28::i;:::-;7000:48;7023:4;7029:2;7033:7;7042:5;7000:22;:48::i;:::-;6992:111;;;;-1:-1:-1;;;6992:111:3;;;;;;;:::i;3770:117:5:-;3830:13;3863:16;3856:23;;;;;:::i;288:723:12:-;344:13;565:10;561:53;;-1:-1:-1;;592:10:12;;;;;;;;;;;;-1:-1:-1;;;592:10:12;;;;;288:723::o;561:53::-;639:5;624:12;680:78;687:9;;680:78;;713:8;;;;:::i;:::-;;-1:-1:-1;736:10:12;;-1:-1:-1;744:2:12;736:10;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;790:17:12;;768:39;;818:154;825:10;;818:154;;852:11;862:1;852:11;;:::i;:::-;;-1:-1:-1;921:10:12;929:2;921:5;:10;:::i;:::-;908:24;;:2;:24;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;878:56:12;;;;;;;;-1:-1:-1;949:11:12;958:2;949:11;;:::i;:::-;;;818:154;;1518:305:3;1620:4;-1:-1:-1;;;;;;1657:40:3;;-1:-1:-1;;;1657:40:3;;:105;;-1:-1:-1;;;;;;;1714:48:3;;-1:-1:-1;;;1714:48:3;1657:105;:158;;;-1:-1:-1;;;;;;;;;;896:40:2;;;1779:36:3;787:157:2;2848:181:5;2976:45;3003:4;3009:2;3013:7;2976:26;:45::i;15534:805::-;15637:16;15645:7;15637;:16::i;:::-;-1:-1:-1;;;;;15629:24:5;:4;-1:-1:-1;;;;;15629:24:5;;15621:71;;;;-1:-1:-1;;;15621:71:5;;26779:2:13;15621:71:5;;;26761:21:13;26818:2;26798:18;;;26791:30;26857:34;26837:18;;;26830:62;-1:-1:-1;;;26908:18:13;;;26901:32;26950:19;;15621:71:5;26577:398:13;15621:71:5;15703:18;15738:23;;;:14;:23;;;;;15724:42;;;;15738:23;15724:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15762:1;15764;15724:13;:42::i;:::-;15838:24;;-1:-1:-1;;;15838:24:5;;;27182:19:13;15703:63:5;;-1:-1:-1;27217:11:13;;15838:24:5;;;;;;;;;;;;15828:35;;;;;;15818:4;15801:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;15791:33;;;;;;:72;15787:545;;;-1:-1:-1;;;;;15881:31:5;;;;;;:25;:31;;;;;15879:33;;15881:31;;;15879:33;;;:::i;:::-;;;;-1:-1:-1;;;;;;15929:29:5;;;;;;:25;:29;;;;;15927:31;;15929:29;;;15927:31;;;:::i;:::-;;;;-1:-1:-1;15787:545:5;;;16027:24;;-1:-1:-1;;;16027:24:5;;;27722:19:13;27757:11;;16027:24:5;;;;;;;;;;;;16017:35;;;;;;16007:4;15990:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;15980:33;;;;;;:72;15976:356;;;-1:-1:-1;;;;;16070:26:5;;;;;;:20;:26;;;;;16068:28;;16070:26;;;16068:28;;;:::i;:::-;;;;-1:-1:-1;;;;;;16113:24:5;;;;;;:20;:24;;;;;16111:26;;16113:24;;;16111:26;;;:::i;15976:356::-;16206:24;;-1:-1:-1;;;16206:24:5;;;27981:19:13;28016:11;;16206:24:5;;;;;;;;;;;;16196:35;;;;;;16186:4;16169:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;16159:33;;;;;;:72;16155:177;;;-1:-1:-1;;;;;16249:28:5;;;;;;:22;:28;;;;;16247:30;;16249:28;;;16247:30;;;:::i;:::-;;;;-1:-1:-1;;;;;;16294:26:5;;;;;;:22;:26;;;;;16292:28;;16294:26;;;16292:28;;;:::i;:::-;;;;-1:-1:-1;15610:729:5;15534:805;;;:::o;8745:321:3:-;8875:18;8881:2;8885:7;8875:5;:18::i;:::-;8926:54;8957:1;8961:2;8965:7;8974:5;8926:22;:54::i;:::-;8904:154;;;;-1:-1:-1;;;8904:154:3;;;;;;;:::i;15228:294:5:-;15302:7;15332:19;15386:18;:7;:16;:18::i;:::-;15405:10;15416:15;15369:63;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;15369:63:5;;;;;;;;;15359:74;;15369:63;15359:74;;;;;-1:-1:-1;15354:80:5;15472:17;15486:3;15359:74;15472:17;:::i;:::-;15454:35;15228:294;-1:-1:-1;;;;;15228:294:5:o;12145:803:3:-;12300:4;-1:-1:-1;;;;;12321:13:3;;302:20:0;350:8;12317:624:3;;12357:72;;-1:-1:-1;;;12357:72:3;;-1:-1:-1;;;;;12357:36:3;;;;;:72;;681:10:1;;12408:4:3;;12414:7;;12423:5;;12357:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12357:72:3;;;;;;;;-1:-1:-1;;12357:72:3;;;;;;;;;;;;:::i;:::-;;;12353:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12603:13:3;;12599:272;;12646:60;;-1:-1:-1;;;12646:60:3;;;;;;;:::i;12599:272::-;12821:6;12815:13;12806:6;12802:2;12798:15;12791:38;12353:533;-1:-1:-1;;;;;;12480:55:3;-1:-1:-1;;;12480:55:3;;-1:-1:-1;12473:62:3;;12317:624;-1:-1:-1;12925:4:3;12145:803;;;;;;:::o;2617:589:4:-;-1:-1:-1;;;;;2823:18:4;;2819:187;;2858:40;2890:7;4033:10;:17;;4006:24;;;;:15;:24;;;;;:44;;;4061:24;;;;;;;;;;;;3929:164;2858:40;2819:187;;;2928:2;-1:-1:-1;;;;;2920:10:4;:4;-1:-1:-1;;;;;2920:10:4;;2916:90;;2947:47;2980:4;2986:7;2947:32;:47::i;:::-;-1:-1:-1;;;;;3020:16:4;;3016:183;;3053:45;3090:7;3053:36;:45::i;3016:183::-;3126:4;-1:-1:-1;;;;;3120:10:4;:2;-1:-1:-1;;;;;3120:10:4;;3116:83;;3147:40;3175:2;3179:7;3147:27;:40::i;16354:379:5:-;16455:13;16511:3;16481:21;16558:19;16567:10;16558:8;:19;:::i;:::-;16548:30;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16548:30:5;-1:-1:-1;16526:52:5;-1:-1:-1;16593:19:5;;;16589:105;16618:8;16614:12;;:1;:12;16589:105;;;16671:8;16680:1;16671:11;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;16671:11:5;16648:6;16655:12;;;;:1;:12;:::i;:::-;16648:20;;;;;;;;:::i;:::-;;;;:34;-1:-1:-1;;;;;16648:34:5;;;;;;;;-1:-1:-1;16628:3:5;;;:::i;:::-;;;16589:105;;;-1:-1:-1;16718:6:5;16354:379;-1:-1:-1;;;;;16354:379:5:o;9402:382:3:-;-1:-1:-1;;;;;9482:16:3;;9474:61;;;;-1:-1:-1;;;9474:61:3;;29477:2:13;9474:61:3;;;29459:21:13;;;29496:18;;;29489:30;29555:34;29535:18;;;29528:62;29607:18;;9474:61:3;29275:356:13;9474:61:3;7489:4;7513:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7513:16:3;:30;9546:58;;;;-1:-1:-1;;;9546:58:3;;29838:2:13;9546:58:3;;;29820:21:13;29877:2;29857:18;;;29850:30;29916;29896:18;;;29889:58;29964:18;;9546:58:3;29636:352:13;9546:58:3;9617:45;9646:1;9650:2;9654:7;9617:20;:45::i;:::-;-1:-1:-1;;;;;9675:13:3;;;;;;:9;:13;;;;;:18;;9692:1;;9675:13;:18;;9692:1;;9675:18;:::i;:::-;;;;-1:-1:-1;;9704:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9704:21:3;-1:-1:-1;;;;;9704:21:3;;;;;;;;9743:33;;9704:16;;;9743:33;;9704:16;;9743:33;9402:382;;:::o;4720:988:4:-;4986:22;5036:1;5011:22;5028:4;5011:16;:22::i;:::-;:26;;;;:::i;:::-;5048:18;5069:26;;;:17;:26;;;;;;4986:51;;-1:-1:-1;5202:28:4;;;5198:328;;-1:-1:-1;;;;;5269:18:4;;5247:19;5269:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5320:30;;;;;;:44;;;5437:30;;:17;:30;;;;;:43;;;5198:328;-1:-1:-1;5622:26:4;;;;:17;:26;;;;;;;;5615:33;;;-1:-1:-1;;;;;5666:18:4;;;;;:12;:18;;;;;:34;;;;;;;5659:41;4720:988::o;6003:1079::-;6281:10;:17;6256:22;;6281:21;;6301:1;;6281:21;:::i;:::-;6313:18;6334:24;;;:15;:24;;;;;;6707:10;:26;;6256:46;;-1:-1:-1;6334:24:4;;6256:46;;6707:26;;;;;;:::i;:::-;;;;;;;;;6685:48;;6771:11;6746:10;6757;6746:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6851:28;;;:15;:28;;;;;;;:41;;;7023:24;;;;;7016:31;7058:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6074:1008;;;6003:1079;:::o;3507:221::-;3592:14;3609:20;3626:2;3609:16;:20::i;:::-;-1:-1:-1;;;;;3640:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3685:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3507:221:4:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:13;-1:-1:-1;;;;;;88:32:13;;78:43;;68:71;;135:1;132;125:12;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;:::-;384:5;150:245;-1:-1:-1;;;150:245:13:o;592:173::-;660:20;;-1:-1:-1;;;;;709:31:13;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:186::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;921:29;940:9;921:29;:::i;1143:258::-;1215:1;1225:113;1239:6;1236:1;1233:13;1225:113;;;1315:11;;;1309:18;1296:11;;;1289:39;1261:2;1254:10;1225:113;;;1356:6;1353:1;1350:13;1347:48;;;-1:-1:-1;;1391:1:13;1373:16;;1366:27;1143:258::o;1406:::-;1448:3;1486:5;1480:12;1513:6;1508:3;1501:19;1529:63;1585:6;1578:4;1573:3;1569:14;1562:4;1555:5;1551:16;1529:63;:::i;:::-;1646:2;1625:15;-1:-1:-1;;1621:29:13;1612:39;;;;1653:4;1608:50;;1406:258;-1:-1:-1;;1406:258:13:o;1669:220::-;1818:2;1807:9;1800:21;1781:4;1838:45;1879:2;1868:9;1864:18;1856:6;1838:45;:::i;1894:180::-;1953:6;2006:2;1994:9;1985:7;1981:23;1977:32;1974:52;;;2022:1;2019;2012:12;1974:52;-1:-1:-1;2045:23:13;;1894:180;-1:-1:-1;1894:180:13:o;2287:254::-;2355:6;2363;2416:2;2404:9;2395:7;2391:23;2387:32;2384:52;;;2432:1;2429;2422:12;2384:52;2455:29;2474:9;2455:29;:::i;:::-;2445:39;2531:2;2516:18;;;;2503:32;;-1:-1:-1;;;2287:254:13:o;2735:328::-;2812:6;2820;2828;2881:2;2869:9;2860:7;2856:23;2852:32;2849:52;;;2897:1;2894;2887:12;2849:52;2920:29;2939:9;2920:29;:::i;:::-;2910:39;;2968:38;3002:2;2991:9;2987:18;2968:38;:::i;:::-;2958:48;;3053:2;3042:9;3038:18;3025:32;3015:42;;2735:328;;;;;:::o;3261:156::-;3327:20;;3387:4;3376:16;;3366:27;;3356:55;;3407:1;3404;3397:12;3422:256;3488:6;3496;3549:2;3537:9;3528:7;3524:23;3520:32;3517:52;;;3565:1;3562;3555:12;3517:52;3588:29;3607:9;3588:29;:::i;:::-;3578:39;;3636:36;3668:2;3657:9;3653:18;3636:36;:::i;:::-;3626:46;;3422:256;;;;;:::o;3683:127::-;3744:10;3739:3;3735:20;3732:1;3725:31;3775:4;3772:1;3765:15;3799:4;3796:1;3789:15;3815:632;3880:5;3910:18;3951:2;3943:6;3940:14;3937:40;;;3957:18;;:::i;:::-;4032:2;4026:9;4000:2;4086:15;;-1:-1:-1;;4082:24:13;;;4108:2;4078:33;4074:42;4062:55;;;4132:18;;;4152:22;;;4129:46;4126:72;;;4178:18;;:::i;:::-;4218:10;4214:2;4207:22;4247:6;4238:15;;4277:6;4269;4262:22;4317:3;4308:6;4303:3;4299:16;4296:25;4293:45;;;4334:1;4331;4324:12;4293:45;4384:6;4379:3;4372:4;4364:6;4360:17;4347:44;4439:1;4432:4;4423:6;4415;4411:19;4407:30;4400:41;;;;3815:632;;;;;:::o;4452:451::-;4521:6;4574:2;4562:9;4553:7;4549:23;4545:32;4542:52;;;4590:1;4587;4580:12;4542:52;4630:9;4617:23;4663:18;4655:6;4652:30;4649:50;;;4695:1;4692;4685:12;4649:50;4718:22;;4771:4;4763:13;;4759:27;-1:-1:-1;4749:55:13;;4800:1;4797;4790:12;4749:55;4823:74;4889:7;4884:2;4871:16;4866:2;4862;4858:11;4823:74;:::i;4908:182::-;4965:6;5018:2;5006:9;4997:7;4993:23;4989:32;4986:52;;;5034:1;5031;5024:12;4986:52;5057:27;5074:9;5057:27;:::i;5095:160::-;5160:20;;5216:13;;5209:21;5199:32;;5189:60;;5245:1;5242;5235:12;5260:180;5316:6;5369:2;5357:9;5348:7;5344:23;5340:32;5337:52;;;5385:1;5382;5375:12;5337:52;5408:26;5424:9;5408:26;:::i;5445:691::-;5538:6;5546;5554;5607:2;5595:9;5586:7;5582:23;5578:32;5575:52;;;5623:1;5620;5613:12;5575:52;5663:9;5650:23;5692:18;5733:2;5725:6;5722:14;5719:34;;;5749:1;5746;5739:12;5719:34;5787:6;5776:9;5772:22;5762:32;;5832:7;5825:4;5821:2;5817:13;5813:27;5803:55;;5854:1;5851;5844:12;5803:55;5894:2;5881:16;5920:2;5912:6;5909:14;5906:34;;;5936:1;5933;5926:12;5906:34;5991:7;5984:4;5974:6;5971:1;5967:14;5963:2;5959:23;5955:34;5952:47;5949:67;;;6012:1;6009;6002:12;5949:67;6043:4;6035:13;;;;-1:-1:-1;6067:6:13;-1:-1:-1;6092:38:13;;6109:20;;;-1:-1:-1;6092:38:13;:::i;:::-;6082:48;;5445:691;;;;;:::o;6141:254::-;6206:6;6214;6267:2;6255:9;6246:7;6242:23;6238:32;6235:52;;;6283:1;6280;6273:12;6235:52;6306:29;6325:9;6306:29;:::i;:::-;6296:39;;6354:35;6385:2;6374:9;6370:18;6354:35;:::i;6400:667::-;6495:6;6503;6511;6519;6572:3;6560:9;6551:7;6547:23;6543:33;6540:53;;;6589:1;6586;6579:12;6540:53;6612:29;6631:9;6612:29;:::i;:::-;6602:39;;6660:38;6694:2;6683:9;6679:18;6660:38;:::i;:::-;6650:48;;6745:2;6734:9;6730:18;6717:32;6707:42;;6800:2;6789:9;6785:18;6772:32;6827:18;6819:6;6816:30;6813:50;;;6859:1;6856;6849:12;6813:50;6882:22;;6935:4;6927:13;;6923:27;-1:-1:-1;6913:55:13;;6964:1;6961;6954:12;6913:55;6987:74;7053:7;7048:2;7035:16;7030:2;7026;7022:11;6987:74;:::i;:::-;6977:84;;;6400:667;;;;;;;:::o;7294:260::-;7362:6;7370;7423:2;7411:9;7402:7;7398:23;7394:32;7391:52;;;7439:1;7436;7429:12;7391:52;7462:29;7481:9;7462:29;:::i;:::-;7452:39;;7510:38;7544:2;7533:9;7529:18;7510:38;:::i;7559:252::-;7623:6;7631;7684:2;7672:9;7663:7;7659:23;7655:32;7652:52;;;7700:1;7697;7690:12;7652:52;7723:27;7740:9;7723:27;:::i;7816:380::-;7895:1;7891:12;;;;7938;;;7959:61;;8013:4;8005:6;8001:17;7991:27;;7959:61;8066:2;8058:6;8055:14;8035:18;8032:38;8029:161;;;8112:10;8107:3;8103:20;8100:1;8093:31;8147:4;8144:1;8137:15;8175:4;8172:1;8165:15;8029:161;;7816:380;;;:::o;9441:413::-;9643:2;9625:21;;;9682:2;9662:18;;;9655:30;9721:34;9716:2;9701:18;;9694:62;-1:-1:-1;;;9787:2:13;9772:18;;9765:47;9844:3;9829:19;;9441:413::o;10271:356::-;10473:2;10455:21;;;10492:18;;;10485:30;10551:34;10546:2;10531:18;;10524:62;10618:2;10603:18;;10271:356::o;10632:127::-;10693:10;10688:3;10684:20;10681:1;10674:31;10724:4;10721:1;10714:15;10748:4;10745:1;10738:15;10764:128;10804:3;10835:1;10831:6;10828:1;10825:13;10822:39;;;10841:18;;:::i;:::-;-1:-1:-1;10877:9:13;;10764:128::o;11553:470::-;11732:3;11770:6;11764:13;11786:53;11832:6;11827:3;11820:4;11812:6;11808:17;11786:53;:::i;:::-;11902:13;;11861:16;;;;11924:57;11902:13;11861:16;11958:4;11946:17;;11924:57;:::i;:::-;11997:20;;11553:470;-1:-1:-1;;;;11553:470:13:o;12028:175::-;12065:3;12109:4;12102:5;12098:16;12138:4;12129:7;12126:17;12123:43;;;12146:18;;:::i;:::-;12195:1;12182:15;;12028:175;-1:-1:-1;;12028:175:13:o;12208:412::-;12410:2;12392:21;;;12449:2;12429:18;;;12422:30;12488:34;12483:2;12468:18;;12461:62;-1:-1:-1;;;12554:2:13;12539:18;;12532:46;12610:3;12595:19;;12208:412::o;12751:1099::-;12879:3;12908:1;12941:6;12935:13;12971:3;12993:1;13021:9;13017:2;13013:18;13003:28;;13081:2;13070:9;13066:18;13103;13093:61;;13147:4;13139:6;13135:17;13125:27;;13093:61;13173:2;13221;13213:6;13210:14;13190:18;13187:38;13184:165;;;-1:-1:-1;;;13248:33:13;;13304:4;13301:1;13294:15;13334:4;13255:3;13322:17;13184:165;13365:18;13392:104;;;;13510:1;13505:320;;;;13358:467;;13392:104;-1:-1:-1;;13425:24:13;;13413:37;;13470:16;;;;-1:-1:-1;13392:104:13;;13505:320;12698:1;12691:14;;;12735:4;12722:18;;13600:1;13614:165;13628:6;13625:1;13622:13;13614:165;;;13706:14;;13693:11;;;13686:35;13749:16;;;;13643:10;;13614:165;;;13618:3;;13808:6;13803:3;13799:16;13792:23;;13358:467;-1:-1:-1;13841:3:13;;12751:1099;-1:-1:-1;;;;;;;;12751:1099:13:o;13855:417::-;14057:2;14039:21;;;14096:2;14076:18;;;14069:30;14135:34;14130:2;14115:18;;14108:62;-1:-1:-1;;;14201:2:13;14186:18;;14179:51;14262:3;14247:19;;13855:417::o;14277:353::-;14479:2;14461:21;;;14518:2;14498:18;;;14491:30;14557:31;14552:2;14537:18;;14530:59;14621:2;14606:18;;14277:353::o;15327:127::-;15388:10;15383:3;15379:20;15376:1;15369:31;15419:4;15416:1;15409:15;15443:4;15440:1;15433:15;17281:168;17321:7;17387:1;17383;17379:6;17375:14;17372:1;17369:21;17364:1;17357:9;17350:17;17346:45;17343:71;;;17394:18;;:::i;:::-;-1:-1:-1;17434:9:13;;17281:168::o;17809:135::-;17848:3;-1:-1:-1;;17869:17:13;;17866:43;;;17889:18;;:::i;:::-;-1:-1:-1;17936:1:13;17925:13;;17809:135::o;19130:637::-;19410:3;19448:6;19442:13;19464:53;19510:6;19505:3;19498:4;19490:6;19486:17;19464:53;:::i;:::-;19580:13;;19539:16;;;;19602:57;19580:13;19539:16;19636:4;19624:17;;19602:57;:::i;:::-;-1:-1:-1;;;19681:20:13;;19710:22;;;19759:1;19748:13;;19130:637;-1:-1:-1;;;;19130:637:13:o;21231:195::-;21269:4;21306;21303:1;21299:12;21338:4;21335:1;21331:12;21363:3;21358;21355:12;21352:38;;;21370:18;;:::i;:::-;21407:13;;;21231:195;-1:-1:-1;;;21231:195:13:o;24644:136::-;24683:3;24711:5;24701:39;;24720:18;;:::i;:::-;-1:-1:-1;;;24756:18:13;;24644:136::o;24785:441::-;25017:3;25055:6;25049:13;25071:53;25117:6;25112:3;25105:4;25097:6;25093:17;25071:53;:::i;:::-;-1:-1:-1;;;25146:16:13;;25171:20;;;-1:-1:-1;25218:1:13;25207:13;;24785:441;-1:-1:-1;24785:441:13:o;25654:414::-;25856:2;25838:21;;;25895:2;25875:18;;;25868:30;25934:34;25929:2;25914:18;;25907:62;-1:-1:-1;;;26000:2:13;25985:18;;25978:48;26058:3;26043:19;;25654:414::o;26073:127::-;26134:10;26129:3;26125:20;26122:1;26115:31;26165:4;26162:1;26155:15;26189:4;26186:1;26179:15;26205:120;26245:1;26271;26261:35;;26276:18;;:::i;:::-;-1:-1:-1;26310:9:13;;26205:120::o;26330:125::-;26370:4;26398:1;26395;26392:8;26389:34;;;26403:18;;:::i;:::-;-1:-1:-1;26440:9:13;;26330:125::o;26460:112::-;26492:1;26518;26508:35;;26523:18;;:::i;:::-;-1:-1:-1;26557:9:13;;26460:112::o;27239:276::-;27370:3;27408:6;27402:13;27424:53;27470:6;27465:3;27458:4;27450:6;27446:17;27424:53;:::i;:::-;27493:16;;;;;27239:276;-1:-1:-1;;27239:276:13:o;28038:484::-;28225:3;28263:6;28257:13;28279:53;28325:6;28320:3;28313:4;28305:6;28301:17;28279:53;:::i;:::-;28401:2;28397:15;;;;-1:-1:-1;;28393:53:13;28354:16;;;;28379:68;;;28474:2;28463:14;;28456:30;;;;28513:2;28502:14;;28038:484;-1:-1:-1;;28038:484:13:o;28527:489::-;-1:-1:-1;;;;;28796:15:13;;;28778:34;;28848:15;;28843:2;28828:18;;28821:43;28895:2;28880:18;;28873:34;;;28943:3;28938:2;28923:18;;28916:31;;;28721:4;;28964:46;;28990:19;;28982:6;28964:46;:::i;:::-;28956:54;28527:489;-1:-1:-1;;;;;;28527:489:13:o;29021:249::-;29090:6;29143:2;29131:9;29122:7;29118:23;29114:32;29111:52;;;29159:1;29156;29149:12;29111:52;29191:9;29185:16;29210:30;29234:5;29210:30;:::i;29993:127::-;30054:10;30049:3;30045:20;30042:1;30035:31;30085:4;30082:1;30075:15;30109:4;30106:1;30099:15

Swarm Source

ipfs://89a61c144345083266671e06438f37c42b6c0befe5f191ff698f151cc1b18260
Loading...
Loading
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.