ETH Price: $2,496.17 (-1.53%)

CyberTurtles (CYBERT)
 

Overview

TokenID

3999

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
CyberTurtles

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-30
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/* ERC721IM - ERC721IM (ERC721 0xInuarashi Edition), Modifiable - Gas Optimized
    Open Source: with the efforts of the [0x Collective] <3 */

contract ERC721IM {

    string public name; string public symbol;
    string internal baseTokenURI; string internal baseTokenURI_EXT;
    constructor(string memory name_, string memory symbol_) { name = name_; symbol = symbol_; }

    uint256 public totalSupply; 

    struct ownerAndStake {
        address owner; // 20 | 12
        uint40 timestamp; // 5 | 7
    }

    mapping(uint256 => ownerAndStake) public _ownerOf;

    mapping(address => uint256) public balanceOf; 

    mapping(uint256 => address) public getApproved; 
    mapping(address => mapping(address => bool)) public isApprovedForAll; 

    // Events
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function ownerOf(uint256 tokenId_) public virtual view returns (address) {
        return _ownerOf[tokenId_].owner;
    }

    function isStaked(uint256 tokenId_) public view returns (bool) {
        return _ownerOf[tokenId_].timestamp > 0;
    }

    function getTimestampOfToken(uint256 tokenId_) public view returns (uint40) {
        return _ownerOf[tokenId_].timestamp;
    }

    function _stake(uint256 tokenId_) internal virtual {
        require(ownerOf(tokenId_) != address(0),
            "_stake(): Token doesn't exist!");
        require(!isStaked(tokenId_),
            "_stake(): Token is already staked!");

        _ownerOf[tokenId_].timestamp = uint40(block.timestamp);
    }

    function _update(uint256 tokenId_) internal virtual {
        require(ownerOf(tokenId_) != address(0),
            "_update(): Token doesn't exist!");
        require(isStaked(tokenId_),
            "_update(): Token is not staked!");

        _ownerOf[tokenId_].timestamp = uint40(block.timestamp);
    }
    
    function _unstake(uint256 tokenId_) internal virtual {
        require(ownerOf(tokenId_) != address(0),
            "_unstake(): Token doesn't exist!");
        require(isStaked(tokenId_),
            "_unstake(): Token is not staked!");
        
        _ownerOf[tokenId_].timestamp = 0;
    }

    // // internal write functions
    // mint
    function _mint(address to_, uint256 tokenId_) internal virtual {
        require(to_ != address(0x0), "ERC721I: _mint() Mint to Zero Address");
        require(ownerOf(tokenId_) == address(0x0), "ERC721I: _mint() Token to Mint Already Exists!");

        balanceOf[to_]++;
        _ownerOf[tokenId_].owner = to_;

        emit Transfer(address(0x0), to_, tokenId_);
    }

    // transfer
    function _transfer(address from_, address to_, uint256 tokenId_) internal virtual {
        require(from_ == ownerOf(tokenId_), "ERC721I: _transfer() Transfer Not Owner of Token!");
        require(to_ != address(0x0), "ERC721I: _transfer() Transfer to Zero Address!");

        if (getApproved[tokenId_] != address(0x0)) { 
            _approve(address(0x0), tokenId_); 
        } 

        _ownerOf[tokenId_].owner = to_; 
        balanceOf[from_]--;
        balanceOf[to_]++;

        emit Transfer(from_, to_, tokenId_);
    }

    // approve
    function _approve(address to_, uint256 tokenId_) internal virtual {
        if (getApproved[tokenId_] != to_) {
            getApproved[tokenId_] = to_;
            emit Approval(ownerOf(tokenId_), to_, tokenId_);
        }
    }
    function _setApprovalForAll(address owner_, address operator_, bool approved_) internal virtual {
        require(owner_ != operator_, "ERC721I: _setApprovalForAll() Owner must not be the Operator!");
        isApprovedForAll[owner_][operator_] = approved_;
        emit ApprovalForAll(owner_, operator_, approved_);
    }

    // token uri
    function _setBaseTokenURI(string memory uri_) internal virtual {
        baseTokenURI = uri_;
    }
    function _setBaseTokenURI_EXT(string memory ext_) internal virtual {
        baseTokenURI_EXT = ext_;
    }

    // // Internal View Functions
    // Embedded Libraries
    function _toString(uint256 value_) internal pure returns (string memory) {
        if (value_ == 0) { return "0"; }
        uint256 _iterate = value_; uint256 _digits;
        while (_iterate != 0) { _digits++; _iterate /= 10; } // get digits in value_
        bytes memory _buffer = new bytes(_digits);
        while (value_ != 0) { _digits--; _buffer[_digits] = bytes1(uint8(48 + uint256(value_ % 10 ))); value_ /= 10; } // create bytes of value_
        return string(_buffer); // return string converted bytes of value_
    }

    // Functional Views
    function _isApprovedOrOwner(address spender_, uint256 tokenId_) internal view virtual returns (bool) {
        require(ownerOf(tokenId_) != address(0x0), "ERC721I: _isApprovedOrOwner() Owner is Zero Address!");
        address _owner = ownerOf(tokenId_);
        return (spender_ == _owner || spender_ == getApproved[tokenId_] || isApprovedForAll[_owner][spender_]);
    }
    function _exists(uint256 tokenId_) internal view virtual returns (bool) {
        return ownerOf(tokenId_) != address(0x0);
    }

    // // public write functions
    function approve(address to_, uint256 tokenId_) public virtual {
        address _owner = ownerOf(tokenId_);
        require(to_ != _owner, "ERC721I: approve() Cannot approve yourself!");
        require(msg.sender == _owner || isApprovedForAll[_owner][msg.sender], "ERC721I: Caller not owner or Approved!");
        _approve(to_, tokenId_);
    }
    function setApprovalForAll(address operator_, bool approved_) public virtual {
        _setApprovalForAll(msg.sender, operator_, approved_);
    }
    function transferFrom(address from_, address to_, uint256 tokenId_) public virtual {
        require(_isApprovedOrOwner(msg.sender, tokenId_), "ERC721I: transferFrom() _isApprovedOrOwner = false!");
        require(!isStaked(tokenId_), "ERC721I: transferFrom() Token is staked!");
        _transfer(from_, to_, tokenId_);
    }
    function safeTransferFrom(address from_, address to_, uint256 tokenId_, bytes memory data_) public virtual {
        transferFrom(from_, to_, tokenId_);
        if (to_.code.length != 0) {
            (, bytes memory _returned) = to_.staticcall(abi.encodeWithSelector(0x150b7a02, msg.sender, from_, tokenId_, data_));
            bytes4 _selector = abi.decode(_returned, (bytes4));
            require(_selector == 0x150b7a02, "ERC721I: safeTransferFrom() to_ not ERC721Receivable!");
        }
    }
    function safeTransferFrom(address from_, address to_, uint256 tokenId_) public virtual {
        safeTransferFrom(from_, to_, tokenId_, "");
    }

    // 0xInuarashi Custom Functions
    function multiTransferFrom(address from_, address to_, uint256[] memory tokenIds_) public virtual {
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            transferFrom(from_, to_, tokenIds_[i]);
        }
    }
    function multiSafeTransferFrom(address from_, address to_, uint256[] memory tokenIds_, bytes memory data_) public virtual {
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            safeTransferFrom(from_, to_, tokenIds_[i], data_);
        }
    }

    // OZ Standard Stuff
    function supportsInterface(bytes4 interfaceId_) public pure returns (bool) {
        return (interfaceId_ == 0x80ac58cd || interfaceId_ == 0x5b5e139f);
    }

    function tokenURI(uint256 tokenId_) public view virtual returns (string memory) {
        require(ownerOf(tokenId_) != address(0x0), "ERC721I: tokenURI() Token does not exist!");
        return string(abi.encodePacked(baseTokenURI, _toString(tokenId_), baseTokenURI_EXT));
    }

    function tokenIdStartsAt() public virtual view returns (uint256) {
        uint256 _loopThrough = totalSupply;
        uint256 _tokenIdStartAt;

        for (uint256 i = 0; i < _loopThrough; i++) {
            if (ownerOf(i) != address(0x0)) { _tokenIdStartAt = i; break; }
        }

        return _tokenIdStartAt;        
    }

    function balanceOfStaked(address address_) public virtual view returns (uint256) {
        uint256 _balance;
        uint256 _loopThrough = totalSupply;
        uint256 _tokenIdStartAt = tokenIdStartsAt();

        for (uint256 i = _tokenIdStartAt; i <= _loopThrough + _tokenIdStartAt; i++) {
            if (_ownerOf[i].owner == address_ && isStaked(i)) {
                _balance++;
            }
        }

        return _balance;
    }
    function balanceOfUnstaked(address address_) public virtual view 
    returns (uint256) {
        uint256 _balance;
        uint256 _loopThrough = totalSupply;
        uint256 _tokenIdStartAt = tokenIdStartsAt();

        for (uint256 i = _tokenIdStartAt; i <= _loopThrough + _tokenIdStartAt; i++) {
            if (_ownerOf[i].owner == address_ && !isStaked(i)) {
                _balance++;
            }
        }

        return _balance;
    }

    // // public view functions
    // never use these for functions ever, they are expensive af and for view only (this will be an issue in the future for interfaces)
    function walletOfOwner(address address_) public virtual view 
    returns (uint256[] memory) {
        uint256 _balance = balanceOf[address_];
        if (_balance == 0) return new uint256[](0);

        uint256[] memory _tokens = new uint256[] (_balance);
        uint256 _index;
        uint256 _loopThrough = totalSupply;
        for (uint256 i = 0; i < _loopThrough; i++) {
            if (ownerOf(i) == address(0x0) && _tokens[_balance - 1] == 0) {
                _loopThrough++; 
            }
            if (_ownerOf[i].owner == address_) { 
                _tokens[_index] = i; _index++; 
            }
        }
        return _tokens;
    }

    function walletOfOwnerUnstaked(address address_) public virtual view 
    returns (uint256[] memory) {
        uint256 _balance = balanceOfUnstaked(address_);
        if (_balance == 0) return new uint256[](0);

        uint256[] memory _tokens = new uint256[] (_balance);
        uint256 _index;
        uint256 _loopThrough = totalSupply;
        for (uint256 i = 0; i < _loopThrough; i++) {
            if (ownerOf(i) == address(0x0) && _tokens[_balance - 1] == 0) {
                _loopThrough++; 
            }
            if (_ownerOf[i].owner == address_ && !isStaked(i)) { 
                _tokens[_index] = i; _index++; 
            }
        }
        return _tokens;
    }

    function walletOfOwnerStaked(address address_) public virtual view 
    returns (uint256[] memory) {
        uint256 _balance = balanceOfStaked(address_);
        if (_balance == 0) return new uint256[](0);

        uint256[] memory _tokens = new uint256[] (_balance);
        uint256 _index;
        uint256 _loopThrough = totalSupply;
        for (uint256 i = 0; i < _loopThrough; i++) {
            if (ownerOf(i) == address(0x0) && _tokens[_balance - 1] == 0) { 
                _loopThrough++; 
            }
            // if (ownerOf(i) == address_) { _tokens[_index] = i; _index++; }
            if (_ownerOf[i].owner == address_ && isStaked(i)) { 
                _tokens[_index] = i; _index++; 
            }
        }
        return _tokens;
    }

    // so not sure when this will ever be really needed but it conforms to erc721 enumerable
    function tokenOfOwnerByIndex(address address_, uint256 index_) public virtual view returns (uint256) {
        uint256[] memory _wallet = walletOfOwner(address_);
        return _wallet[index_];
    }
}

/*
    administrative functions marked as internal because you should have
    owner access in order to use them. so, write them in your contract yourself!
*/

abstract contract MerkleWhitelist {
    bytes32 internal _merkleRoot = 0xa67a6c6810aaf3dec2d76d522ab50128c8a08e7e5574456aa3c4b0c6f3eb9732;
    function _setMerkleRoot(bytes32 merkleRoot_) internal virtual {
        _merkleRoot = merkleRoot_;
    }
    function isWhitelisted(address address_, bytes32[] memory proof_) public view returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(address_));
        for (uint256 i = 0; i < proof_.length; i++) {
            _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) 
                : keccak256(abi.encodePacked(proof_[i], _leaf));
        }
        return _leaf == _merkleRoot;
    }
}

// Open0x Ownable (by 0xInuarashi)
abstract contract Ownable {
    address public owner;
    event OwnershipTransferred(address indexed oldOwner_, address indexed newOwner_);
    constructor() { owner = msg.sender; }
    modifier onlyOwner {
        require(owner == msg.sender, "Ownable: caller is not the owner");
        _;
    }
    function _transferOwnership(address newOwner_) internal virtual {
        address _oldOwner = owner;
        owner = newOwner_;
        emit OwnershipTransferred(_oldOwner, newOwner_);    
    }
    function transferOwnership(address newOwner_) public virtual onlyOwner {
        require(newOwner_ != address(0x0), "Ownable: new owner is the zero address!");
        _transferOwnership(newOwner_);
    }
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0x0));
    }
}


// Open0x Payable Governance Module by 0xInuarashi
// This abstract contract utilizes for loops in order to iterate things in order to be modular
// It is not the most gas-effective implementation. 
// We sacrified gas-effectiveness for Modularity instead.
abstract contract PayableGovernance is Ownable {
    // Special Access
    address _payableGovernanceSetter;
    constructor() payable { _payableGovernanceSetter = msg.sender; }
    modifier onlyPayableGovernanceSetter {
        require(msg.sender == _payableGovernanceSetter, "PayableGovernance: Caller is not Setter!"); _; }
    function reouncePayableGovernancePermissions() public onlyPayableGovernanceSetter {
        _payableGovernanceSetter = address(0x0); }

    // Receivable Fallback
    event Received(address from, uint amount);
    receive() external payable { emit Received(msg.sender, msg.value); }

    // Required Variables
    address payable[] internal _payableGovernanceAddresses;
    uint256[] internal _payableGovernanceShares;    
    mapping(address => bool) public addressToEmergencyUnlocked;

    // Withdraw Functionality
    function _withdraw(address payable address_, uint256 amount_) internal {
        (bool success, ) = payable(address_).call{value: amount_}("");
        require(success, "Transfer failed");
    }

    // Governance Functions
    function setPayableGovernanceShareholders(address payable[] memory addresses_, uint256[] memory shares_) public onlyPayableGovernanceSetter {
        require(_payableGovernanceAddresses.length == 0 && _payableGovernanceShares.length == 0, "Payable Governance already set! To set again, reset first!");
        require(addresses_.length == shares_.length, "Address and Shares length mismatch!");
        uint256 _totalShares;
        for (uint256 i = 0; i < addresses_.length; i++) {
            _totalShares += shares_[i];
            _payableGovernanceAddresses.push(addresses_[i]);
            _payableGovernanceShares.push(shares_[i]);
        }
        require(_totalShares == 1000, "Total Shares is not 1000!");
    }
    function resetPayableGovernanceShareholders() public onlyPayableGovernanceSetter {
        while (_payableGovernanceAddresses.length != 0) {
            _payableGovernanceAddresses.pop(); }
        while (_payableGovernanceShares.length != 0) {
            _payableGovernanceShares.pop(); }
    }

    // Governance View Functions
    function balance() public view returns (uint256) {
        return address(this).balance;
    }
    function payableGovernanceAddresses() public view returns (address payable[] memory) {
        return _payableGovernanceAddresses;
    }
    function payableGovernanceShares() public view returns (uint256[] memory) {
        return _payableGovernanceShares;
    }

    // Withdraw Functions
    function withdrawEther() public onlyOwner {
        // require that there has been payable governance set.
        require(_payableGovernanceAddresses.length > 0 && _payableGovernanceShares.length > 0, "Payable governance not set yet!");
         // this should never happen
        require(_payableGovernanceAddresses.length == _payableGovernanceShares.length, "Payable governance length mismatch!");
        
        // now, we check that the governance shares equal to 1000.
        uint256 _totalPayableShares;
        for (uint256 i = 0; i < _payableGovernanceShares.length; i++) {
            _totalPayableShares += _payableGovernanceShares[i]; }
        require(_totalPayableShares == 1000, "Payable Governance Shares is not 1000!");
        
        // // now, we start the withdrawal process if all conditionals pass
        // store current balance in local memory
        uint256 _totalETH = address(this).balance; 

        // withdraw loop for payable governance
        for (uint256 i = 0; i < _payableGovernanceAddresses.length; i++) {
            uint256 _ethToWithdraw = ((_totalETH * _payableGovernanceShares[i]) / 1000);
            _withdraw(_payableGovernanceAddresses[i], _ethToWithdraw);
        }
    }

    function viewWithdrawAmounts() public view onlyOwner returns (uint256[] memory) {
        // require that there has been payable governance set.
        require(_payableGovernanceAddresses.length > 0 && _payableGovernanceShares.length > 0, "Payable governance not set yet!");
         // this should never happen
        require(_payableGovernanceAddresses.length == _payableGovernanceShares.length, "Payable governance length mismatch!");
        
        // now, we check that the governance shares equal to 1000.
        uint256 _totalPayableShares;
        for (uint256 i = 0; i < _payableGovernanceShares.length; i++) {
            _totalPayableShares += _payableGovernanceShares[i]; }
        require(_totalPayableShares == 1000, "Payable Governance Shares is not 1000!");
        
        // // now, we start the array creation process if all conditionals pass
        // store current balance in local memory and instantiate array for input
        uint256 _totalETH = address(this).balance; 
        uint256[] memory _withdrawals = new uint256[] (_payableGovernanceAddresses.length + 2);

        // array creation loop for payable governance values 
        for (uint256 i = 0; i < _payableGovernanceAddresses.length; i++) {
            _withdrawals[i] = ( (_totalETH * _payableGovernanceShares[i]) / 1000 );
        }
        
        // push two last array spots as total eth and added eths of withdrawals
        _withdrawals[_payableGovernanceAddresses.length] = _totalETH;
        for (uint256 i = 0; i < _payableGovernanceAddresses.length; i++) {
            _withdrawals[_payableGovernanceAddresses.length + 1] += _withdrawals[i]; }

        // return the final array data
        return _withdrawals;
    }

    // Shareholder Governance
    modifier onlyShareholder {
        bool _isShareholder;
        for (uint256 i = 0; i < _payableGovernanceAddresses.length; i++) {
            if (msg.sender == _payableGovernanceAddresses[i]) {
                _isShareholder = true;
            }
        }
        require(_isShareholder, "You are not a shareholder!");
        _;
    }
    function unlockEmergencyFunctionsAsShareholder() public onlyShareholder {
        addressToEmergencyUnlocked[msg.sender] = true;
    }

    // Emergency Functions
    modifier onlyEmergency {
        for (uint256 i = 0; i < _payableGovernanceAddresses.length; i++) {
            require(addressToEmergencyUnlocked[_payableGovernanceAddresses[i]], "Emergency Functions are not unlocked!");
        }
        _;
    }
    function emergencyWithdrawEther() public onlyOwner onlyEmergency {
        _withdraw(payable(msg.sender), address(this).balance);
    }
}

// Open0x Security by 0xInuarashi
abstract contract Security {
    // Prevent Smart Contracts
    modifier onlySender {
        require(msg.sender == tx.origin, "No Smart Contracts!"); _; }
}

abstract contract WhitelistMint {
    // Whitelist Minting
    bool internal _whitelistMintEnabled; uint256 public _whitelistMintTime;
    function _setWhitelistMint(bool bool_, uint256 time_) internal {
        _whitelistMintEnabled = bool_; _whitelistMintTime = time_; }
    modifier whitelistMintEnabled {
        require(_whitelistMintEnabled && _whitelistMintTime <= block.timestamp, 
            "Whitelist Mint is not enabled yet!"); _; } 
    function whitelistMintStatus() external view returns (bool) {
        return _whitelistMintEnabled && _whitelistMintTime <= block.timestamp; }
}

abstract contract PublicMint {
    // Public Minting
    bool public _publicMintEnabled; uint256 public _publicMintTime;
    function _setPublicMint(bool bool_, uint256 time_) internal {
        _publicMintEnabled = bool_; _publicMintTime = time_; }
    modifier publicMintEnabled { 
        require(_publicMintEnabled && _publicMintTime <= block.timestamp, 
            "Public Mint is not enabled yet!"); _; }
    function publicMintStatus() external view returns (bool) {
        return _publicMintEnabled && _publicMintTime <= block.timestamp; }
}

interface isCT {
    function mintStakedTokenAsCyberTurtles(address to_, uint256 tokenId_) external;
}

contract CyberTurtles is ERC721IM, MerkleWhitelist, Ownable, PayableGovernance,
Security, WhitelistMint, PublicMint {
    constructor() payable ERC721IM("CyberTurtles", "CYBERT") {}

    /*
        CyberTurtles 
        Staking with Proof-of-Stake-Token Phantom Minting
        Yield $SHELL
        Whitelist Mint (MerkleWhitelist)
        Public Mint
    */

    ////// Project Contraints //////
    uint256 public maxTokens = 5555; 
    uint256 public mintPrice = 0.07 ether; 
    uint256 public maxMintsPerTx = 10;

    uint256 public maxMintsPerWl = 2;
    mapping(address => uint256) public addressToWlMints;

    ///// Interfaces /////
    isCT public sCT;
    function setsCT(address address_) external onlyOwner {
        sCT = isCT(address_);
    }
    modifier onlyStaker {
        require(msg.sender == address(sCT), "You are not staker!"); _;
    }

    ///// Ownable /////
    // Constraints
    function setMaxTokens(uint256 maxTokens_) external onlyOwner {
        maxTokens = maxTokens_;
    }
    function setMintPrice(uint256 mintPrice_) external onlyOwner {
        mintPrice = mintPrice_;
    }

    function setMaxMintsPerTx(uint256 maxMints_) external onlyOwner {
        maxMintsPerTx = maxMints_;
    }
    function setMaxMintsPerWl(uint256 maxMints_) external onlyOwner {
        maxMintsPerWl = maxMints_;
    }

    // Token URI
    function setBaseTokenURI(string calldata uri_) external onlyOwner { 
        _setBaseTokenURI(uri_);
    }
    function setBaseTokenURI_EXT(string calldata ext_) external onlyOwner {
        _setBaseTokenURI_EXT(ext_);
    }

    // MerkleRoot
    function setMerkleRoot(bytes32 merkleRoot_) external onlyOwner {
        _setMerkleRoot(merkleRoot_);
    }

    // Public Mint
    function setPublicMint(bool bool_, uint256 time_) external onlyOwner {
        _setPublicMint(bool_, time_);
    }
    
    // Whitelist Mint
    function setWhitelistMint(bool bool_, uint256 time_) external onlyOwner {
        _setWhitelistMint(bool_, time_);
    }

    // (Withdrawals Handled by PayableGovernance)

    ///// OwnerOf Override /////
    function ownerOf(uint256 tokenId_) public view override returns (address) {
        if (_ownerOf[tokenId_].timestamp == 0) {
            return _ownerOf[tokenId_].owner;
        } else {
            return address(sCT);
        }
    }

    // OG Functionality
    bytes32 internal _merkleRootOG = 0x29480e5ce297f9137e60d028b74252fa6019a4334d601f58b2bb4d07cc5c2b55;
    function setMerkleRootOG(bytes32 merkleRoot_) external onlyOwner {
        _merkleRootOG = merkleRoot_;
    }
    function isOG(address address_, bytes32[] memory proof_) 
    public view returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(address_));
        for (uint256 i = 0; i < proof_.length; i++) {
            _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) 
                : keccak256(abi.encodePacked(proof_[i], _leaf));
        }
        return _leaf == _merkleRootOG;
    }
    mapping(address => uint256) public addressToOgMinted;

    ///// Internal Mint /////
    function _mintMany(address to_, uint256 amount_) internal {
        require(maxTokens >= totalSupply + amount_,
            "Not enough tokens remaining!");
            
        uint256 _startId = totalSupply + 1; // iterate from 1

        for (uint256 i = 0; i < amount_; i++) {
            _mint(to_, _startId + i);
        }
        totalSupply += amount_;
    }
    function _mintAndStakeMany(address to_, uint256 amount_) internal {
        require(maxTokens >= totalSupply + amount_,
            "Not enough tokens remaining!");
        
        uint256 _startId = totalSupply + 1; // iterate from 1

        for (uint256 i = 0; i < amount_; i++) {
            _mint(to_, _startId + i);
            _stake(_startId + i);
            
            emit Transfer(to_, address(sCT), _startId + i);
            sCT.mintStakedTokenAsCyberTurtles(to_, _startId + i);
        }
        totalSupply += amount_;
    }

    ///// Magic Stake Code /////
    // Turtle Staker / Unstaker -- The validation logic is handled by sCyberTurtles
    function validateOwnershipOfTokens(address owner_, uint256[] calldata tokenIds_)
    external view returns (bool) {
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            if (owner_ != ownerOf(tokenIds_[i])) return false;
        }
        return true;
    }
    function validateOwnershipOfStakedTokens(address owner_,
    uint256[] calldata tokenIds_) external view returns (bool) {
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            ownerAndStake memory _ownerAndStake = _ownerOf[tokenIds_[i]];
            if (owner_ != _ownerAndStake.owner 
                || _ownerAndStake.timestamp == 0) return false;
        }
        return true;
    }
    
    function stakeTurtles(uint256[] calldata tokenIds_) external onlyStaker {
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            _stake(tokenIds_[i]);
            emit Transfer(ownerOf(tokenIds_[i]), address(sCT), tokenIds_[i]);
        }
    }
    function updateTurtles(uint256[] calldata tokenIds_) external onlyStaker {
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            _update(tokenIds_[i]);
        }
    }
    function unstakeTurtles(uint256[] calldata tokenIds_) external onlyStaker {
        for (uint256 i = 0; i < tokenIds_.length; i++) {
            _unstake(tokenIds_[i]);
            emit Transfer(address(sCT), _ownerOf[tokenIds_[i]].owner, tokenIds_[i]);
        }
    }

    ///// Minting Functions /////
    function ownerMint(address[] calldata tos_, uint256[] calldata amounts_,
    bool stakeOnMint_) external onlyOwner {
        require(tos_.length == amounts_.length,
            "Array lengths mismatch!");
            
        if (stakeOnMint_) {
            for (uint256 i = 0; i < tos_.length; i++) {
                _mintAndStakeMany(tos_[i], amounts_[i]);
            }
        } else {
            for (uint256 i = 0; i < tos_.length; i++) {
                _mintMany(tos_[i], amounts_[i]);
            }
        }
    }

    // OG Claim Function (we reused whitelistMint modifier)
    function ogClaim(bytes32[] calldata proof_, bool stakeOnMint_) 
    public onlySender whitelistMintEnabled {
        require(isOG(msg.sender, proof_),
            "You are not OG!");
        require(addressToOgMinted[msg.sender] == 0, 
            "You have already minted!");

        addressToOgMinted[msg.sender]++;

        if (stakeOnMint_) {
            _mintAndStakeMany(msg.sender, 1);
        } else {
            _mintMany(msg.sender, 1);
        }
    }

    // Whitelist Mint Functions
    function whitelistMint(bytes32[] calldata proof_, uint256 amount_,
    bool stakeOnMint_) public payable onlySender whitelistMintEnabled {
        require(isWhitelisted(msg.sender, proof_),
            "You are not whitelisted!");
        require(maxMintsPerWl >= addressToWlMints[msg.sender] + amount_,
            "You dont have enough whitelist mints!");
        require(msg.value == mintPrice * amount_,
            "Invalid value sent!");
        
        // Add address to WL minted
        addressToWlMints[msg.sender] += amount_;

        if (stakeOnMint_) {
            _mintAndStakeMany(msg.sender, amount_);
        } else {
            _mintMany(msg.sender, amount_);
        }
    }

    // Public Mint Functions
    function publicMint(uint256 amount_, bool stakeOnMint_) external payable
    onlySender publicMintEnabled {
        require(maxMintsPerTx >= amount_,
            "Over maximum mints per TX!");
        require(msg.value == mintPrice * amount_,
            "Invalid value sent!");
        
        if (stakeOnMint_) {
            _mintAndStakeMany(msg.sender, amount_);
        } else {
            _mintMany(msg.sender, amount_);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","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":"oldOwner_","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner_","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Received","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint40","name":"timestamp","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicMintTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_whitelistMintTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToEmergencyUnlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToOgMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressToWlMints","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":[],"name":"balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"balanceOfStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"balanceOfUnstaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getTimestampOfToken","outputs":[{"internalType":"uint40","name":"","type":"uint40"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isOG","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"isStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintsPerWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","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":"tokenIds_","type":"uint256[]"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"multiSafeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"multiTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"},{"internalType":"bool","name":"stakeOnMint_","type":"bool"}],"name":"ogClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"},{"internalType":"bool","name":"stakeOnMint_","type":"bool"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payableGovernanceAddresses","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payableGovernanceShares","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"bool","name":"stakeOnMint_","type":"bool"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicMintStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reouncePayableGovernancePermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetPayableGovernanceShareholders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sCT","outputs":[{"internalType":"contract isCT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator_","type":"address"},{"internalType":"bool","name":"approved_","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"ext_","type":"string"}],"name":"setBaseTokenURI_EXT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMints_","type":"uint256"}],"name":"setMaxMintsPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxMints_","type":"uint256"}],"name":"setMaxMintsPerWl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTokens_","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRootOG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPrice_","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"addresses_","type":"address[]"},{"internalType":"uint256[]","name":"shares_","type":"uint256[]"}],"name":"setPayableGovernanceShareholders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"},{"internalType":"uint256","name":"time_","type":"uint256"}],"name":"setPublicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"},{"internalType":"uint256","name":"time_","type":"uint256"}],"name":"setWhitelistMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"setsCT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"stakeTurtles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId_","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIdStartsAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","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":"unlockEmergencyFunctionsAsShareholder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"unstakeTurtles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"updateTurtles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"validateOwnershipOfStakedTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"validateOwnershipOfTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewWithdrawAmounts","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwnerStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwnerUnstaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"bool","name":"stakeOnMint_","type":"bool"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

7fa67a6c6810aaf3dec2d76d522ab50128c8a08e7e5574456aa3c4b0c6f3eb97326009556115b360135566f8b0a10e470000601455600a60155560026016557f29480e5ce297f9137e60d028b74252fa6019a4334d601f58b2bb4d07cc5c2b55601955600c60808181526b4379626572547572746c657360a01b60a0908152610100604052600660c09081526510d65091549560d21b60e0529192620000a891600091620000e9565b508051620000be906001906020840190620000e9565b5050600a8054336001600160a01b03199182168117909255600b8054909116909117905550620001cc565b828054620000f7906200018f565b90600052602060002090601f0160209004810192826200011b576000855562000166565b82601f106200013657805160ff191683800117855562000166565b8280016001018555821562000166579182015b828111156200016657825182559160200191906001019062000149565b506200017492915062000178565b5090565b5b8082111562000174576000815560010162000179565b600181811c90821680620001a457607f821691505b60208210811415620001c657634e487b7160e01b600052602260045260246000fd5b50919050565b614c5e80620001dc6000396000f3fe6080604052600436106104355760003560e01c80637f1444cb11610229578063cb9fe5861161012e578063e4711b8f116100b6578063ee2741461161007a578063ee27414614610d61578063f2fde38b14610d81578063f487c60214610da1578063f4a0a52814610dc1578063f8e6f95e14610de157600080fd5b8063e4711b8f14610cae578063e47fa66e14610cce578063e742ad9c14610cf0578063e831574214610d10578063e985e9c514610d2657600080fd5b8063d6635959116100fd578063d663595914610c38578063d9d2b4cd14610c4e578063dc30158b14610c63578063dc92f8f014610c79578063e0308ce814610c8e57600080fd5b8063cb9fe58614610b9c578063d0265e5014610bb1578063d2efa37414610c02578063d311c80d14610c2257600080fd5b8063a58fdc11116101b1578063baa51f8611610180578063baa51f8614610ae2578063befe045714610b02578063c1f730a414610b2f578063c7b8933614610b4f578063c87b56dd14610b7c57600080fd5b8063a58fdc1114610a7a578063a91f883514610a9a578063b69ef8a814610aaf578063b88d4fde14610ac257600080fd5b80638da5cb5b116101f85780638da5cb5b146109f257806395d89b4114610a125780639970ff1514610a27578063a22cb46514610a47578063a243d3b614610a6757600080fd5b80637f1444cb14610983578063868e5b5e146109a35780638b2998f8146109c35780638bdc048a146109d857600080fd5b806340f480e71161033a5780635b5d958b116102c257806370a082311161028657806370a08231146108ec578063715018a6146109195780637362377b1461092e5780637527201d146109435780637cb647591461096357600080fd5b80635b5d958b146108615780636127b120146108765780636352211e146108965780636817c76c146108b65780636e9d287b146108cc57600080fd5b80634fcd49e8116103095780634fcd49e8146107cc578063524c7ff8146107ec57806358361e31146108015780635a23dd99146108215780635aea7ec11461084157600080fd5b806340f480e71461075457806342842e0e1461076a578063438b63001461078a5780634959f0f5146107b757600080fd5b806319c3fa32116103bd5780632f745c591161038c5780632f745c591461066957806330176e13146106895780633455f41e146106a957806338350541146106c95780633a3473b61461073457600080fd5b806319c3fa32146105e457806323af31261461060457806323b872dd14610634578063262023701461065457600080fd5b8063081812fc11610404578063081812fc14610512578063095ea7b31461056057806311e776fe14610580578063174da4a2146105a057806318160ddd146105c057600080fd5b806301ffc9a71461047957806302ffaed1146104ae57806306fdde03146104d05780630710c27e146104f257600080fd5b3661047457604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561048557600080fd5b506104996104943660046145b3565b610df4565b60405190151581526020015b60405180910390f35b3480156104ba57600080fd5b506104ce6104c93660046145ed565b610e2b565b005b3480156104dc57600080fd5b506104e5610ea1565b6040516104a59190614858565b3480156104fe57600080fd5b506104ce61050d366004614346565b610f2f565b34801561051e57600080fd5b5061054861052d36600461459a565b6007602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016104a5565b34801561056c57600080fd5b506104ce61057b36600461431a565b611087565b34801561058c57600080fd5b506104ce61059b36600461459a565b6111ae565b3480156105ac57600080fd5b506104ce6105bb36600461459a565b6111dd565b3480156105cc57600080fd5b506105d660045481565b6040519081526020016104a5565b3480156105f057600080fd5b506104ce6105ff36600461457e565b61120c565b34801561061057600080fd5b5061049961061f366004614006565b600e6020526000908152604090205460ff1681565b34801561064057600080fd5b506104ce61064f366004614145565b61124d565b34801561066057600080fd5b50610499611331565b34801561067557600080fd5b506105d661068436600461431a565b61134d565b34801561069557600080fd5b506104ce6106a43660046145ed565b61137e565b3480156106b557600080fd5b506105d66106c4366004614006565b6113e7565b3480156106d557600080fd5b5061070f6106e436600461459a565b6005602052600090815260409020546001600160a01b03811690600160a01b900464ffffffffff1682565b604080516001600160a01b03909316835264ffffffffff9091166020830152016104a5565b34801561074057600080fd5b506104ce61074f3660046140bd565b611468565b34801561076057600080fd5b506105d660165481565b34801561077657600080fd5b506104ce610785366004614145565b6114ab565b34801561079657600080fd5b506107aa6107a5366004614006565b6114c6565b6040516104a59190614820565b3480156107c357600080fd5b506104ce611634565b3480156107d857600080fd5b506104ce6107e736600461453d565b6116d4565b3480156107f857600080fd5b506107aa6117af565b34801561080d57600080fd5b506104ce61081c36600461453d565b611a31565b34801561082d57600080fd5b5061049961083c3660046141e5565b611a99565b34801561084d57600080fd5b506107aa61085c366004614006565b611bbd565b34801561086d57600080fd5b506105d6611cf6565b34801561088257600080fd5b506107aa610891366004614006565b611d41565b3480156108a257600080fd5b506105486108b136600461459a565b611e7c565b3480156108c257600080fd5b506105d660145481565b3480156108d857600080fd5b506104ce6108e73660046143c6565b611ecf565b3480156108f857600080fd5b506105d6610907366004614006565b60066020526000908152604090205481565b34801561092557600080fd5b506104ce6120f5565b34801561093a57600080fd5b506104ce612129565b34801561094f57600080fd5b506104ce61095e36600461448e565b6122cd565b34801561096f57600080fd5b506104ce61097e36600461459a565b612430565b34801561098f57600080fd5b50601854610548906001600160a01b031681565b3480156109af57600080fd5b506104ce6109be366004614006565b612466565b3480156109cf57600080fd5b506107aa6124b2565b3480156109e457600080fd5b506011546104999060ff1681565b3480156109fe57600080fd5b50600a54610548906001600160a01b031681565b348015610a1e57600080fd5b506104e561250a565b348015610a3357600080fd5b50610499610a423660046141e5565b612517565b348015610a5357600080fd5b506104ce610a623660046142e5565b61263b565b6104ce610a7536600461465e565b612646565b348015610a8657600080fd5b506104ce610a9536600461459a565b612783565b348015610aa657600080fd5b506104ce6127b2565b348015610abb57600080fd5b50476105d6565b348015610ace57600080fd5b506104ce610add366004614186565b6127ee565b348015610aee57600080fd5b50610499610afd36600461459a565b61294a565b348015610b0e57600080fd5b506105d6610b1d366004614006565b601a6020526000908152604090205481565b348015610b3b57600080fd5b506104ce610b4a36600461457e565b61296c565b348015610b5b57600080fd5b506105d6610b6a366004614006565b60176020526000908152604090205481565b348015610b8857600080fd5b506104e5610b9736600461459a565b6129ad565b348015610ba857600080fd5b50610499612a58565b348015610bbd57600080fd5b50610bec610bcc36600461459a565b600090815260056020526040902054600160a01b900464ffffffffff1690565b60405164ffffffffff90911681526020016104a5565b348015610c0e57600080fd5b506104ce610c1d36600461459a565b612a73565b348015610c2e57600080fd5b506105d660105481565b348015610c4457600080fd5b506105d660125481565b348015610c5a57600080fd5b506104ce612aa2565b348015610c6f57600080fd5b506105d660155481565b348015610c8557600080fd5b506104ce612b61565b348015610c9a57600080fd5b506104ce610ca936600461453d565b612c4e565b348015610cba57600080fd5b506105d6610cc9366004614006565b612d25565b348015610cda57600080fd5b50610ce3612d9e565b6040516104a591906147d3565b348015610cfc57600080fd5b50610499610d0b366004614291565b612dff565b348015610d1c57600080fd5b506105d660135481565b348015610d3257600080fd5b50610499610d41366004614023565b600860209081526000928352604080842090915290825290205460ff1681565b348015610d6d57600080fd5b50610499610d7c366004614291565b612eb8565b348015610d8d57600080fd5b506104ce610d9c366004614006565b612f0d565b348015610dad57600080fd5b506104ce610dbc36600461405c565b612fa6565b348015610dcd57600080fd5b506104ce610ddc36600461459a565b612fe8565b6104ce610def3660046144e1565b613017565b60006380ac58cd60e01b6001600160e01b031983161480610e255750635b5e139f60e01b6001600160e01b03198316145b92915050565b600a546001600160a01b03163314610e5e5760405162461bcd60e51b8152600401610e5590614938565b60405180910390fd5b610e9d82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506131fe92505050565b5050565b60008054610eae90614b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610eda90614b05565b8015610f275780601f10610efc57610100808354040283529160200191610f27565b820191906000526020600020905b815481529060010190602001808311610f0a57829003601f168201915b505050505081565b600a546001600160a01b03163314610f595760405162461bcd60e51b8152600401610e5590614938565b838214610fa85760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e67746873206d69736d61746368210000000000000000006044820152606401610e55565b80156110195760005b8481101561101357611001868683818110610fce57610fce614bb1565b9050602002016020810190610fe39190614006565b858584818110610ff557610ff5614bb1565b90506020020135613211565b8061100b81614b40565b915050610fb1565b50611080565b60005b8481101561107e5761106c86868381811061103957611039614bb1565b905060200201602081019061104e9190614006565b85858481811061106057611060614bb1565b90506020020135613390565b8061107681614b40565b91505061101c565b505b5050505050565b600061109282611e7c565b9050806001600160a01b0316836001600160a01b0316141561110a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231493a20617070726f766528292043616e6e6f7420617070726f7660448201526a6520796f757273656c662160a81b6064820152608401610e55565b336001600160a01b038216148061114457506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b61119f5760405162461bcd60e51b815260206004820152602660248201527f455243373231493a2043616c6c6572206e6f74206f776e6572206f7220417070604482015265726f7665642160d01b6064820152608401610e55565b6111a9838361342d565b505050565b600a546001600160a01b031633146111d85760405162461bcd60e51b8152600401610e5590614938565b601355565b600a546001600160a01b031633146112075760405162461bcd60e51b8152600401610e5590614938565b601555565b600a546001600160a01b031633146112365760405162461bcd60e51b8152600401610e5590614938565b600f805460ff191683151517905560108190555050565b61125733826134bc565b6112bf5760405162461bcd60e51b815260206004820152603360248201527f455243373231493a207472616e7366657246726f6d2829205f6973417070726f6044820152727665644f724f776e6572203d2066616c73652160681b6064820152608401610e55565b6112c88161294a565b156113265760405162461bcd60e51b815260206004820152602860248201527f455243373231493a207472616e7366657246726f6d282920546f6b656e206973604482015267207374616b65642160c01b6064820152608401610e55565b6111a98383836135ba565b60115460009060ff16801561134857504260125411155b905090565b600080611359846114c6565b905080838151811061136d5761136d614bb1565b602002602001015191505092915050565b600a546001600160a01b031633146113a85760405162461bcd60e51b8152600401610e5590614938565b610e9d82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061377a92505050565b6004546000908190816113f8611cf6565b9050805b6114068284614a60565b811161145e576000818152600560205260409020546001600160a01b03878116911614801561143957506114398161294a565b1561144c578361144881614b40565b9450505b8061145681614b40565b9150506113fc565b5091949350505050565b60005b825181101561108057611499858585848151811061148b5761148b614bb1565b6020026020010151856127ee565b806114a381614b40565b91505061146b565b6111a9838383604051806020016040528060008152506127ee565b6001600160a01b0381166000908152600660205260409020546060908061151b5760005b604051908082528060200260200182016040528015611513578160200160208202803683370190505b509392505050565b6000816001600160401b0381111561153557611535614bc7565b60405190808252806020026020018201604052801561155e578160200160208202803683370190505b50600454909150600090815b8181101561162957600061157d82611e7c565b6001600160a01b03161480156115b657508361159a600187614aab565b815181106115aa576115aa614bb1565b60200260200101516000145b156115c957816115c581614b40565b9250505b6000818152600560205260409020546001600160a01b038881169116141561161757808484815181106115fe576115fe614bb1565b60209081029190910101528261161381614b40565b9350505b8061162181614b40565b91505061156a565b509195945050505050565b600b546001600160a01b0316331461165e5760405162461bcd60e51b8152600401610e559061486b565b600c541561169e57600c80548061167757611677614b9b565b600082815260209020810160001990810180546001600160a01b031916905501905561165e565b600d54156116d257600d8054806116b7576116b7614b9b565b6001900381819060005260206000200160009055905561169e565b565b6018546001600160a01b031633146116fe5760405162461bcd60e51b8152600401610e559061499a565b60005b818110156111a95761172a83838381811061171e5761171e614bb1565b9050602002013561378d565b82828281811061173c5761173c614bb1565b905060200201356005600085858581811061175957611759614bb1565b60209081029290920135835250810191909152604090810160009081205460185492516001600160a01b039182169390911691600080516020614c0983398151915291a4806117a781614b40565b915050611701565b600a546060906001600160a01b031633146117dc5760405162461bcd60e51b8152600401610e5590614938565b600c54158015906117ee5750600d5415155b61183a5760405162461bcd60e51b815260206004820152601f60248201527f50617961626c6520676f7665726e616e6365206e6f74207365742079657421006044820152606401610e55565b600d54600c541461185d5760405162461bcd60e51b8152600401610e55906148b3565b6000805b600d548110156118a857600d818154811061187e5761187e614bb1565b9060005260206000200154826118949190614a60565b9150806118a081614b40565b915050611861565b50806103e8146118ca5760405162461bcd60e51b8152600401610e55906149c7565b600c5447906000906118dd906002614a60565b6001600160401b038111156118f4576118f4614bc7565b60405190808252806020026020018201604052801561191d578160200160208202803683370190505b50905060005b600c54811015611992576103e8600d828154811061194357611943614bb1565b9060005260206000200154846119599190614a8c565b6119639190614a78565b82828151811061197557611975614bb1565b60209081029190910101528061198a81614b40565b915050611923565b50600c5481518391839181106119aa576119aa614bb1565b60200260200101818152505060005b600c54811015611a29578181815181106119d5576119d5614bb1565b602002602001015182600c8054905060016119f09190614a60565b81518110611a0057611a00614bb1565b60200260200101818151611a149190614a60565b90525080611a2181614b40565b9150506119b9565b509250505090565b6018546001600160a01b03163314611a5b5760405162461bcd60e51b8152600401610e559061499a565b60005b818110156111a957611a87838383818110611a7b57611a7b614bb1565b90506020020135613863565b80611a9181614b40565b915050611a5e565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b8351811015611bb157838181518110611af357611af3614bb1565b60200260200101518210611b5157838181518110611b1357611b13614bb1565b602002602001015182604051602001611b36929190918252602082015260400190565b60405160208183030381529060405280519060200120611b9d565b81848281518110611b6457611b64614bb1565b6020026020010151604051602001611b86929190918252602082015260400190565b604051602081830303815290604052805190602001205b915080611ba981614b40565b915050611ad8565b50600954149392505050565b60606000611bca836113e7565b905080611bd85760006114ea565b6000816001600160401b03811115611bf257611bf2614bc7565b604051908082528060200260200182016040528015611c1b578160200160208202803683370190505b50600454909150600090815b81811015611629576000611c3a82611e7c565b6001600160a01b0316148015611c73575083611c57600187614aab565b81518110611c6757611c67614bb1565b60200260200101516000145b15611c865781611c8281614b40565b9250505b6000818152600560205260409020546001600160a01b038881169116148015611cb35750611cb38161294a565b15611ce45780848481518110611ccb57611ccb614bb1565b602090810291909101015282611ce081614b40565b9350505b80611cee81614b40565b915050611c27565b60045460009081805b82811015611d3a576000611d1282611e7c565b6001600160a01b031614611d2857809150611d3a565b80611d3281614b40565b915050611cff565b5092915050565b60606000611d4e83612d25565b905080611d5c5760006114ea565b6000816001600160401b03811115611d7657611d76614bc7565b604051908082528060200260200182016040528015611d9f578160200160208202803683370190505b50600454909150600090815b81811015611629576000611dbe82611e7c565b6001600160a01b0316148015611df7575083611ddb600187614aab565b81518110611deb57611deb614bb1565b60200260200101516000145b15611e0a5781611e0681614b40565b9250505b6000818152600560205260409020546001600160a01b038881169116148015611e395750611e378161294a565b155b15611e6a5780848481518110611e5157611e51614bb1565b602090810291909101015282611e6681614b40565b9350505b80611e7481614b40565b915050611dab565b600081815260056020526040812054600160a01b900464ffffffffff16611eb957506000908152600560205260409020546001600160a01b031690565b50506018546001600160a01b031690565b919050565b600b546001600160a01b03163314611ef95760405162461bcd60e51b8152600401610e559061486b565b600c54158015611f095750600d54155b611f7b5760405162461bcd60e51b815260206004820152603a60248201527f50617961626c6520476f7665726e616e636520616c726561647920736574212060448201527f546f2073657420616761696e2c207265736574206669727374210000000000006064820152608401610e55565b8051825114611fd85760405162461bcd60e51b815260206004820152602360248201527f4164647265737320616e6420536861726573206c656e677468206d69736d617460448201526263682160e81b6064820152608401610e55565b6000805b83518110156120a357828181518110611ff757611ff7614bb1565b60200260200101518261200a9190614a60565b9150600c84828151811061202057612020614bb1565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558251600d9084908390811061207257612072614bb1565b602090810291909101810151825460018101845560009384529190922001558061209b81614b40565b915050611fdc565b50806103e8146111a95760405162461bcd60e51b815260206004820152601960248201527f546f74616c20536861726573206973206e6f74203130303021000000000000006044820152606401610e55565b600a546001600160a01b0316331461211f5760405162461bcd60e51b8152600401610e5590614938565b6116d26000613948565b600a546001600160a01b031633146121535760405162461bcd60e51b8152600401610e5590614938565b600c54158015906121655750600d5415155b6121b15760405162461bcd60e51b815260206004820152601f60248201527f50617961626c6520676f7665726e616e6365206e6f74207365742079657421006044820152606401610e55565b600d54600c54146121d45760405162461bcd60e51b8152600401610e55906148b3565b6000805b600d5481101561221f57600d81815481106121f5576121f5614bb1565b90600052602060002001548261220b9190614a60565b91508061221781614b40565b9150506121d8565b50806103e8146122415760405162461bcd60e51b8152600401610e55906149c7565b4760005b600c548110156111a95760006103e8600d838154811061226757612267614bb1565b90600052602060002001548461227d9190614a8c565b6122879190614a78565b90506122ba600c838154811061229f5761229f614bb1565b6000918252602090912001546001600160a01b03168261399a565b50806122c581614b40565b915050612245565b3332146122ec5760405162461bcd60e51b8152600401610e559061496d565b600f5460ff16801561230057504260105411155b61231c5760405162461bcd60e51b8152600401610e55906148f6565b6123593384848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061251792505050565b6123975760405162461bcd60e51b815260206004820152600f60248201526e596f7520617265206e6f74204f472160881b6044820152606401610e55565b336000908152601a6020526040902054156123f45760405162461bcd60e51b815260206004820152601860248201527f596f75206861766520616c7265616479206d696e7465642100000000000000006044820152606401610e55565b336000908152601a6020526040812080549161240f83614b40565b91905055508015612425576111a9336001613211565b6111a9336001613390565b600a546001600160a01b0316331461245a5760405162461bcd60e51b8152600401610e5590614938565b61246381600955565b50565b600a546001600160a01b031633146124905760405162461bcd60e51b8152600401610e5590614938565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6060600d80548060200260200160405190810160405280929190818152602001828054801561250057602002820191906000526020600020905b8154815260200190600101908083116124ec575b5050505050905090565b60018054610eae90614b05565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b835181101561262f5783818151811061257157612571614bb1565b602002602001015182106125cf5783818151811061259157612591614bb1565b6020026020010151826040516020016125b4929190918252602082015260400190565b6040516020818303038152906040528051906020012061261b565b818482815181106125e2576125e2614bb1565b6020026020010151604051602001612604929190918252602082015260400190565b604051602081830303815290604052805190602001205b91508061262781614b40565b915050612556565b50601954149392505050565b610e9d338383613a2f565b3332146126655760405162461bcd60e51b8152600401610e559061496d565b60115460ff16801561267957504260125411155b6126c55760405162461bcd60e51b815260206004820152601f60248201527f5075626c6963204d696e74206973206e6f7420656e61626c65642079657421006044820152606401610e55565b8160155410156127175760405162461bcd60e51b815260206004820152601a60248201527f4f766572206d6178696d756d206d696e747320706572205458210000000000006044820152606401610e55565b816014546127259190614a8c565b34146127695760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642076616c75652073656e742160681b6044820152606401610e55565b801561277957610e9d3383613211565b610e9d3383613390565b600a546001600160a01b031633146127ad5760405162461bcd60e51b8152600401610e5590614938565b601955565b600b546001600160a01b031633146127dc5760405162461bcd60e51b8152600401610e559061486b565b600b80546001600160a01b0319169055565b6127f984848461124d565b6001600160a01b0383163b15612944576000836001600160a01b031663150b7a02338786866040516024016128319493929190614796565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161286a9190614747565b600060405180830381855afa9150503d80600081146128a5576040519150601f19603f3d011682016040523d82523d6000602084013e6128aa565b606091505b509150506000818060200190518101906128c491906145d0565b9050630a85bd0160e11b6001600160e01b031982161461107e5760405162461bcd60e51b815260206004820152603560248201527f455243373231493a20736166655472616e7366657246726f6d282920746f5f206044820152746e6f742045524337323152656365697661626c652160581b6064820152608401610e55565b50505050565b600090815260056020526040902054600160a01b900464ffffffffff16151590565b600a546001600160a01b031633146129965760405162461bcd60e51b8152600401610e5590614938565b6011805460ff191683151517905560128190555050565b606060006129ba83611e7c565b6001600160a01b03161415612a235760405162461bcd60e51b815260206004820152602960248201527f455243373231493a20746f6b656e555249282920546f6b656e20646f6573206e6044820152686f742065786973742160b81b6064820152608401610e55565b6002612a2e83613b24565b6003604051602001612a4293929190614763565b6040516020818303038152906040529050919050565b600f5460009060ff1680156113485750426010541115905090565b600a546001600160a01b03163314612a9d5760405162461bcd60e51b8152600401610e5590614938565b601655565b6000805b600c54811015612af657600c8181548110612ac357612ac3614bb1565b6000918252602090912001546001600160a01b0316331415612ae457600191505b80612aee81614b40565b915050612aa6565b5080612b445760405162461bcd60e51b815260206004820152601a60248201527f596f7520617265206e6f742061207368617265686f6c646572210000000000006044820152606401610e55565b50336000908152600e60205260409020805460ff19166001179055565b600a546001600160a01b03163314612b8b5760405162461bcd60e51b8152600401610e5590614938565b60005b600c54811015612c4357600e6000600c8381548110612baf57612baf614bb1565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16612c315760405162461bcd60e51b815260206004820152602560248201527f456d657267656e63792046756e6374696f6e7320617265206e6f7420756e6c6f604482015264636b65642160d81b6064820152608401610e55565b80612c3b81614b40565b915050612b8e565b506116d2334761399a565b6018546001600160a01b03163314612c785760405162461bcd60e51b8152600401610e559061499a565b60005b818110156111a957612ca4838383818110612c9857612c98614bb1565b90506020020135613c22565b828282818110612cb657612cb6614bb1565b60185460209091029290920135916001600160a01b03169050612cf0858585818110612ce457612ce4614bb1565b90506020020135611e7c565b6001600160a01b0316600080516020614c0983398151915260405160405180910390a480612d1d81614b40565b915050612c7b565b600454600090819081612d36611cf6565b9050805b612d448284614a60565b811161145e576000818152600560205260409020546001600160a01b038781169116148015612d795750612d778161294a565b155b15612d8c5783612d8881614b40565b9450505b80612d9681614b40565b915050612d3a565b6060600c80548060200260200160405190810160405280929190818152602001828054801561250057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612dd8575050505050905090565b6000805b82811015612eab57600060056000868685818110612e2357612e23614bb1565b602090810292909201358352508181019290925260409081016000208151808301909252546001600160a01b03808216808452600160a01b90920464ffffffffff1693830193909352909250908716141580612e885750602081015164ffffffffff16155b15612e9857600092505050612eb1565b5080612ea381614b40565b915050612e03565b50600190505b9392505050565b6000805b82811015612eab57612ed9848483818110612ce457612ce4614bb1565b6001600160a01b0316856001600160a01b031614612efb576000915050612eb1565b80612f0581614b40565b915050612ebc565b600a546001600160a01b03163314612f375760405162461bcd60e51b8152600401610e5590614938565b6001600160a01b038116612f9d5760405162461bcd60e51b815260206004820152602760248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616044820152666464726573732160c81b6064820152608401610e55565b61246381613948565b60005b815181101561294457612fd68484848481518110612fc957612fc9614bb1565b602002602001015161124d565b80612fe081614b40565b915050612fa9565b600a546001600160a01b031633146130125760405162461bcd60e51b8152600401610e5590614938565b601455565b3332146130365760405162461bcd60e51b8152600401610e559061496d565b600f5460ff16801561304a57504260105411155b6130665760405162461bcd60e51b8152600401610e55906148f6565b6130a333858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611a9992505050565b6130ef5760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c69737465642100000000000000006044820152606401610e55565b3360009081526017602052604090205461310a908390614a60565b60165410156131695760405162461bcd60e51b815260206004820152602560248201527f596f7520646f6e74206861766520656e6f7567682077686974656c697374206d604482015264696e74732160d81b6064820152608401610e55565b816014546131779190614a8c565b34146131bb5760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642076616c75652073656e742160681b6044820152606401610e55565b33600090815260176020526040812080548492906131da908490614a60565b909155505080156131f4576131ef3383613211565b612944565b6129443383613390565b8051610e9d906003906020840190613e31565b8060045461321f9190614a60565b60135410156132705760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820746f6b656e732072656d61696e696e6721000000006044820152606401610e55565b600060045460016132819190614a60565b905060005b82811015613373576132a18461329c8385614a60565b613ce5565b6132b36132ae8284614a60565b613c22565b6132bd8183614a60565b6018546040516001600160a01b0391821691871690600080516020614c0983398151915290600090a46018546001600160a01b031663d9c020bf856133028486614a60565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561334857600080fd5b505af115801561335c573d6000803e3d6000fd5b50505050808061336b90614b40565b915050613286565b5081600460008282546133869190614a60565b9091555050505050565b8060045461339e9190614a60565b60135410156133ef5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820746f6b656e732072656d61696e696e6721000000006044820152606401610e55565b600060045460016134009190614a60565b905060005b828110156133735761341b8461329c8385614a60565b8061342581614b40565b915050613405565b6000818152600760205260409020546001600160a01b03838116911614610e9d57600081815260076020526040902080546001600160a01b0319166001600160a01b038416908117909155819061348382611e7c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806134c883611e7c565b6001600160a01b0316141561353c5760405162461bcd60e51b815260206004820152603460248201527f455243373231493a205f6973417070726f7665644f724f776e65722829204f776044820152736e6572206973205a65726f20416464726573732160601b6064820152608401610e55565b600061354783611e7c565b9050806001600160a01b0316846001600160a01b0316148061358257506000838152600760205260409020546001600160a01b038581169116145b806135b257506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b949350505050565b6135c381611e7c565b6001600160a01b0316836001600160a01b03161461363d5760405162461bcd60e51b815260206004820152603160248201527f455243373231493a205f7472616e736665722829205472616e73666572204e6f60448201527074204f776e6572206f6620546f6b656e2160781b6064820152608401610e55565b6001600160a01b0382166136aa5760405162461bcd60e51b815260206004820152602e60248201527f455243373231493a205f7472616e736665722829205472616e7366657220746f60448201526d205a65726f20416464726573732160901b6064820152608401610e55565b6000818152600760205260409020546001600160a01b0316156136d2576136d260008261342d565b600081815260056020908152604080832080546001600160a01b0319166001600160a01b0387811691909117909155861683526006909152812080549161371883614aee565b90915550506001600160a01b038216600090815260066020526040812080549161374183614b40565b919050555080826001600160a01b0316846001600160a01b0316600080516020614c0983398151915260405160405180910390a4505050565b8051610e9d906002906020840190613e31565b600061379882611e7c565b6001600160a01b031614156137ef5760405162461bcd60e51b815260206004820181905260248201527f5f756e7374616b6528293a20546f6b656e20646f65736e2774206578697374216044820152606401610e55565b6137f88161294a565b6138445760405162461bcd60e51b815260206004820181905260248201527f5f756e7374616b6528293a20546f6b656e206973206e6f74207374616b6564216044820152606401610e55565b6000908152600560205260409020805464ffffffffff60a01b19169055565b600061386e82611e7c565b6001600160a01b031614156138c55760405162461bcd60e51b815260206004820152601f60248201527f5f75706461746528293a20546f6b656e20646f65736e277420657869737421006044820152606401610e55565b6138ce8161294a565b61391a5760405162461bcd60e51b815260206004820152601f60248201527f5f75706461746528293a20546f6b656e206973206e6f74207374616b656421006044820152606401610e55565b6000908152600560205260409020805464ffffffffff60a01b1916600160a01b4264ffffffffff1602179055565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146139e7576040519150601f19603f3d011682016040523d82523d6000602084013e6139ec565b606091505b50509050806111a95760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610e55565b816001600160a01b0316836001600160a01b03161415613ab75760405162461bcd60e51b815260206004820152603d60248201527f455243373231493a205f736574417070726f76616c466f72416c6c2829204f7760448201527f6e6572206d757374206e6f7420626520746865204f70657261746f72210000006064820152608401610e55565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606081613b485750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613b725780613b5c81614b40565b9150613b6b9050600a83614a78565b9150613b4c565b6000816001600160401b03811115613b8c57613b8c614bc7565b6040519080825280601f01601f191660200182016040528015613bb6576020820181803683370190505b5090505b84156135b25781613bca81614aee565b9250613bd99050600a86614b5b565b613be4906030614a60565b60f81b818381518110613bf957613bf9614bb1565b60200101906001600160f81b031916908160001a905350613c1b600a86614a78565b9450613bba565b6000613c2d82611e7c565b6001600160a01b03161415613c845760405162461bcd60e51b815260206004820152601e60248201527f5f7374616b6528293a20546f6b656e20646f65736e27742065786973742100006044820152606401610e55565b613c8d8161294a565b1561391a5760405162461bcd60e51b815260206004820152602260248201527f5f7374616b6528293a20546f6b656e20697320616c7265616479207374616b65604482015261642160f01b6064820152608401610e55565b6001600160a01b038216613d495760405162461bcd60e51b815260206004820152602560248201527f455243373231493a205f6d696e742829204d696e7420746f205a65726f204164604482015264647265737360d81b6064820152608401610e55565b6000613d5482611e7c565b6001600160a01b031614613dc15760405162461bcd60e51b815260206004820152602e60248201527f455243373231493a205f6d696e74282920546f6b656e20746f204d696e74204160448201526d6c7265616479204578697374732160901b6064820152608401610e55565b6001600160a01b0382166000908152600660205260408120805491613de583614b40565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020614c09833981519152908290a45050565b828054613e3d90614b05565b90600052602060002090601f016020900481019282613e5f5760008555613ea5565b82601f10613e7857805160ff1916838001178555613ea5565b82800160010185558215613ea5579182015b82811115613ea5578251825591602001919060010190613e8a565b50613eb1929150613eb5565b5090565b5b80821115613eb15760008155600101613eb6565b60008083601f840112613edc57600080fd5b5081356001600160401b03811115613ef357600080fd5b6020830191508360208260051b8501011115613f0e57600080fd5b9250929050565b600082601f830112613f2657600080fd5b81356020613f3b613f3683614a3d565b614a0d565b80838252828201915082860187848660051b8901011115613f5b57600080fd5b60005b85811015613f7a57813584529284019290840190600101613f5e565b5090979650505050505050565b80358015158114611eca57600080fd5b600082601f830112613fa857600080fd5b81356001600160401b03811115613fc157613fc1614bc7565b613fd4601f8201601f1916602001614a0d565b818152846020838601011115613fe957600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561401857600080fd5b8135612eb181614bdd565b6000806040838503121561403657600080fd5b823561404181614bdd565b9150602083013561405181614bdd565b809150509250929050565b60008060006060848603121561407157600080fd5b833561407c81614bdd565b9250602084013561408c81614bdd565b915060408401356001600160401b038111156140a757600080fd5b6140b386828701613f15565b9150509250925092565b600080600080608085870312156140d357600080fd5b84356140de81614bdd565b935060208501356140ee81614bdd565b925060408501356001600160401b038082111561410a57600080fd5b61411688838901613f15565b9350606087013591508082111561412c57600080fd5b5061413987828801613f97565b91505092959194509250565b60008060006060848603121561415a57600080fd5b833561416581614bdd565b9250602084013561417581614bdd565b929592945050506040919091013590565b6000806000806080858703121561419c57600080fd5b84356141a781614bdd565b935060208501356141b781614bdd565b92506040850135915060608501356001600160401b038111156141d957600080fd5b61413987828801613f97565b600080604083850312156141f857600080fd5b823561420381614bdd565b91506020838101356001600160401b0381111561421f57600080fd5b8401601f8101861361423057600080fd5b803561423e613f3682614a3d565b80828252848201915084840189868560051b870101111561425e57600080fd5b600094505b83851015614281578035835260019490940193918501918501614263565b5080955050505050509250929050565b6000806000604084860312156142a657600080fd5b83356142b181614bdd565b925060208401356001600160401b038111156142cc57600080fd5b6142d886828701613eca565b9497909650939450505050565b600080604083850312156142f857600080fd5b823561430381614bdd565b915061431160208401613f87565b90509250929050565b6000806040838503121561432d57600080fd5b823561433881614bdd565b946020939093013593505050565b60008060008060006060868803121561435e57600080fd5b85356001600160401b038082111561437557600080fd5b61438189838a01613eca565b9097509550602088013591508082111561439a57600080fd5b506143a788828901613eca565b90945092506143ba905060408701613f87565b90509295509295909350565b600080604083850312156143d957600080fd5b82356001600160401b03808211156143f057600080fd5b818501915085601f83011261440457600080fd5b81356020614414613f3683614a3d565b8083825282820191508286018a848660051b890101111561443457600080fd5b600096505b8487101561446057803561444c81614bdd565b835260019690960195918301918301614439565b509650508601359250508082111561447757600080fd5b5061448485828601613f15565b9150509250929050565b6000806000604084860312156144a357600080fd5b83356001600160401b038111156144b957600080fd5b6144c586828701613eca565b90945092506144d8905060208501613f87565b90509250925092565b600080600080606085870312156144f757600080fd5b84356001600160401b0381111561450d57600080fd5b61451987828801613eca565b9095509350506020850135915061453260408601613f87565b905092959194509250565b6000806020838503121561455057600080fd5b82356001600160401b0381111561456657600080fd5b61457285828601613eca565b90969095509350505050565b6000806040838503121561459157600080fd5b61433883613f87565b6000602082840312156145ac57600080fd5b5035919050565b6000602082840312156145c557600080fd5b8135612eb181614bf2565b6000602082840312156145e257600080fd5b8151612eb181614bf2565b6000806020838503121561460057600080fd5b82356001600160401b038082111561461757600080fd5b818501915085601f83011261462b57600080fd5b81358181111561463a57600080fd5b86602082850101111561464c57600080fd5b60209290920196919550909350505050565b6000806040838503121561467157600080fd5b8235915061431160208401613f87565b60008151808452614699816020860160208601614ac2565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806146c757607f831692505b60208084108214156146e957634e487b7160e01b600052602260045260246000fd5b8180156146fd576001811461470e5761473b565b60ff1986168952848901965061473b565b60008881526020902060005b868110156147335781548b82015290850190830161471a565b505084890196505b50505050505092915050565b60008251614759818460208701614ac2565b9190910192915050565b600061476f82866146ad565b845161477f818360208901614ac2565b61478b818301866146ad565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906147c990830184614681565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156148145783516001600160a01b0316835292840192918401916001016147ef565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156148145783518352928401929184019160010161483c565b602081526000612eb16020830184614681565b60208082526028908201527f50617961626c65476f7665726e616e63653a2043616c6c6572206973206e6f74604082015267205365747465722160c01b606082015260800190565b60208082526023908201527f50617961626c6520676f7665726e616e6365206c656e677468206d69736d617460408201526263682160e81b606082015260800190565b60208082526022908201527f57686974656c697374204d696e74206973206e6f7420656e61626c6564207965604082015261742160f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601390820152724e6f20536d61727420436f6e7472616374732160681b604082015260600190565b602080825260139082015272596f7520617265206e6f74207374616b65722160681b604082015260600190565b60208082526026908201527f50617961626c6520476f7665726e616e636520536861726573206973206e6f7460408201526520313030302160d01b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715614a3557614a35614bc7565b604052919050565b60006001600160401b03821115614a5657614a56614bc7565b5060051b60200190565b60008219821115614a7357614a73614b6f565b500190565b600082614a8757614a87614b85565b500490565b6000816000190483118215151615614aa657614aa6614b6f565b500290565b600082821015614abd57614abd614b6f565b500390565b60005b83811015614add578181015183820152602001614ac5565b838111156129445750506000910152565b600081614afd57614afd614b6f565b506000190190565b600181811c90821680614b1957607f821691505b60208210811415614b3a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614b5457614b54614b6f565b5060010190565b600082614b6a57614b6a614b85565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461246357600080fd5b6001600160e01b03198116811461246357600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122042d5d33fc25d612eb479449862fe8dc0b09ae4463950a623053c297948b09a4d64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106104355760003560e01c80637f1444cb11610229578063cb9fe5861161012e578063e4711b8f116100b6578063ee2741461161007a578063ee27414614610d61578063f2fde38b14610d81578063f487c60214610da1578063f4a0a52814610dc1578063f8e6f95e14610de157600080fd5b8063e4711b8f14610cae578063e47fa66e14610cce578063e742ad9c14610cf0578063e831574214610d10578063e985e9c514610d2657600080fd5b8063d6635959116100fd578063d663595914610c38578063d9d2b4cd14610c4e578063dc30158b14610c63578063dc92f8f014610c79578063e0308ce814610c8e57600080fd5b8063cb9fe58614610b9c578063d0265e5014610bb1578063d2efa37414610c02578063d311c80d14610c2257600080fd5b8063a58fdc11116101b1578063baa51f8611610180578063baa51f8614610ae2578063befe045714610b02578063c1f730a414610b2f578063c7b8933614610b4f578063c87b56dd14610b7c57600080fd5b8063a58fdc1114610a7a578063a91f883514610a9a578063b69ef8a814610aaf578063b88d4fde14610ac257600080fd5b80638da5cb5b116101f85780638da5cb5b146109f257806395d89b4114610a125780639970ff1514610a27578063a22cb46514610a47578063a243d3b614610a6757600080fd5b80637f1444cb14610983578063868e5b5e146109a35780638b2998f8146109c35780638bdc048a146109d857600080fd5b806340f480e71161033a5780635b5d958b116102c257806370a082311161028657806370a08231146108ec578063715018a6146109195780637362377b1461092e5780637527201d146109435780637cb647591461096357600080fd5b80635b5d958b146108615780636127b120146108765780636352211e146108965780636817c76c146108b65780636e9d287b146108cc57600080fd5b80634fcd49e8116103095780634fcd49e8146107cc578063524c7ff8146107ec57806358361e31146108015780635a23dd99146108215780635aea7ec11461084157600080fd5b806340f480e71461075457806342842e0e1461076a578063438b63001461078a5780634959f0f5146107b757600080fd5b806319c3fa32116103bd5780632f745c591161038c5780632f745c591461066957806330176e13146106895780633455f41e146106a957806338350541146106c95780633a3473b61461073457600080fd5b806319c3fa32146105e457806323af31261461060457806323b872dd14610634578063262023701461065457600080fd5b8063081812fc11610404578063081812fc14610512578063095ea7b31461056057806311e776fe14610580578063174da4a2146105a057806318160ddd146105c057600080fd5b806301ffc9a71461047957806302ffaed1146104ae57806306fdde03146104d05780630710c27e146104f257600080fd5b3661047457604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561048557600080fd5b506104996104943660046145b3565b610df4565b60405190151581526020015b60405180910390f35b3480156104ba57600080fd5b506104ce6104c93660046145ed565b610e2b565b005b3480156104dc57600080fd5b506104e5610ea1565b6040516104a59190614858565b3480156104fe57600080fd5b506104ce61050d366004614346565b610f2f565b34801561051e57600080fd5b5061054861052d36600461459a565b6007602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016104a5565b34801561056c57600080fd5b506104ce61057b36600461431a565b611087565b34801561058c57600080fd5b506104ce61059b36600461459a565b6111ae565b3480156105ac57600080fd5b506104ce6105bb36600461459a565b6111dd565b3480156105cc57600080fd5b506105d660045481565b6040519081526020016104a5565b3480156105f057600080fd5b506104ce6105ff36600461457e565b61120c565b34801561061057600080fd5b5061049961061f366004614006565b600e6020526000908152604090205460ff1681565b34801561064057600080fd5b506104ce61064f366004614145565b61124d565b34801561066057600080fd5b50610499611331565b34801561067557600080fd5b506105d661068436600461431a565b61134d565b34801561069557600080fd5b506104ce6106a43660046145ed565b61137e565b3480156106b557600080fd5b506105d66106c4366004614006565b6113e7565b3480156106d557600080fd5b5061070f6106e436600461459a565b6005602052600090815260409020546001600160a01b03811690600160a01b900464ffffffffff1682565b604080516001600160a01b03909316835264ffffffffff9091166020830152016104a5565b34801561074057600080fd5b506104ce61074f3660046140bd565b611468565b34801561076057600080fd5b506105d660165481565b34801561077657600080fd5b506104ce610785366004614145565b6114ab565b34801561079657600080fd5b506107aa6107a5366004614006565b6114c6565b6040516104a59190614820565b3480156107c357600080fd5b506104ce611634565b3480156107d857600080fd5b506104ce6107e736600461453d565b6116d4565b3480156107f857600080fd5b506107aa6117af565b34801561080d57600080fd5b506104ce61081c36600461453d565b611a31565b34801561082d57600080fd5b5061049961083c3660046141e5565b611a99565b34801561084d57600080fd5b506107aa61085c366004614006565b611bbd565b34801561086d57600080fd5b506105d6611cf6565b34801561088257600080fd5b506107aa610891366004614006565b611d41565b3480156108a257600080fd5b506105486108b136600461459a565b611e7c565b3480156108c257600080fd5b506105d660145481565b3480156108d857600080fd5b506104ce6108e73660046143c6565b611ecf565b3480156108f857600080fd5b506105d6610907366004614006565b60066020526000908152604090205481565b34801561092557600080fd5b506104ce6120f5565b34801561093a57600080fd5b506104ce612129565b34801561094f57600080fd5b506104ce61095e36600461448e565b6122cd565b34801561096f57600080fd5b506104ce61097e36600461459a565b612430565b34801561098f57600080fd5b50601854610548906001600160a01b031681565b3480156109af57600080fd5b506104ce6109be366004614006565b612466565b3480156109cf57600080fd5b506107aa6124b2565b3480156109e457600080fd5b506011546104999060ff1681565b3480156109fe57600080fd5b50600a54610548906001600160a01b031681565b348015610a1e57600080fd5b506104e561250a565b348015610a3357600080fd5b50610499610a423660046141e5565b612517565b348015610a5357600080fd5b506104ce610a623660046142e5565b61263b565b6104ce610a7536600461465e565b612646565b348015610a8657600080fd5b506104ce610a9536600461459a565b612783565b348015610aa657600080fd5b506104ce6127b2565b348015610abb57600080fd5b50476105d6565b348015610ace57600080fd5b506104ce610add366004614186565b6127ee565b348015610aee57600080fd5b50610499610afd36600461459a565b61294a565b348015610b0e57600080fd5b506105d6610b1d366004614006565b601a6020526000908152604090205481565b348015610b3b57600080fd5b506104ce610b4a36600461457e565b61296c565b348015610b5b57600080fd5b506105d6610b6a366004614006565b60176020526000908152604090205481565b348015610b8857600080fd5b506104e5610b9736600461459a565b6129ad565b348015610ba857600080fd5b50610499612a58565b348015610bbd57600080fd5b50610bec610bcc36600461459a565b600090815260056020526040902054600160a01b900464ffffffffff1690565b60405164ffffffffff90911681526020016104a5565b348015610c0e57600080fd5b506104ce610c1d36600461459a565b612a73565b348015610c2e57600080fd5b506105d660105481565b348015610c4457600080fd5b506105d660125481565b348015610c5a57600080fd5b506104ce612aa2565b348015610c6f57600080fd5b506105d660155481565b348015610c8557600080fd5b506104ce612b61565b348015610c9a57600080fd5b506104ce610ca936600461453d565b612c4e565b348015610cba57600080fd5b506105d6610cc9366004614006565b612d25565b348015610cda57600080fd5b50610ce3612d9e565b6040516104a591906147d3565b348015610cfc57600080fd5b50610499610d0b366004614291565b612dff565b348015610d1c57600080fd5b506105d660135481565b348015610d3257600080fd5b50610499610d41366004614023565b600860209081526000928352604080842090915290825290205460ff1681565b348015610d6d57600080fd5b50610499610d7c366004614291565b612eb8565b348015610d8d57600080fd5b506104ce610d9c366004614006565b612f0d565b348015610dad57600080fd5b506104ce610dbc36600461405c565b612fa6565b348015610dcd57600080fd5b506104ce610ddc36600461459a565b612fe8565b6104ce610def3660046144e1565b613017565b60006380ac58cd60e01b6001600160e01b031983161480610e255750635b5e139f60e01b6001600160e01b03198316145b92915050565b600a546001600160a01b03163314610e5e5760405162461bcd60e51b8152600401610e5590614938565b60405180910390fd5b610e9d82828080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506131fe92505050565b5050565b60008054610eae90614b05565b80601f0160208091040260200160405190810160405280929190818152602001828054610eda90614b05565b8015610f275780601f10610efc57610100808354040283529160200191610f27565b820191906000526020600020905b815481529060010190602001808311610f0a57829003601f168201915b505050505081565b600a546001600160a01b03163314610f595760405162461bcd60e51b8152600401610e5590614938565b838214610fa85760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e67746873206d69736d61746368210000000000000000006044820152606401610e55565b80156110195760005b8481101561101357611001868683818110610fce57610fce614bb1565b9050602002016020810190610fe39190614006565b858584818110610ff557610ff5614bb1565b90506020020135613211565b8061100b81614b40565b915050610fb1565b50611080565b60005b8481101561107e5761106c86868381811061103957611039614bb1565b905060200201602081019061104e9190614006565b85858481811061106057611060614bb1565b90506020020135613390565b8061107681614b40565b91505061101c565b505b5050505050565b600061109282611e7c565b9050806001600160a01b0316836001600160a01b0316141561110a5760405162461bcd60e51b815260206004820152602b60248201527f455243373231493a20617070726f766528292043616e6e6f7420617070726f7660448201526a6520796f757273656c662160a81b6064820152608401610e55565b336001600160a01b038216148061114457506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b61119f5760405162461bcd60e51b815260206004820152602660248201527f455243373231493a2043616c6c6572206e6f74206f776e6572206f7220417070604482015265726f7665642160d01b6064820152608401610e55565b6111a9838361342d565b505050565b600a546001600160a01b031633146111d85760405162461bcd60e51b8152600401610e5590614938565b601355565b600a546001600160a01b031633146112075760405162461bcd60e51b8152600401610e5590614938565b601555565b600a546001600160a01b031633146112365760405162461bcd60e51b8152600401610e5590614938565b600f805460ff191683151517905560108190555050565b61125733826134bc565b6112bf5760405162461bcd60e51b815260206004820152603360248201527f455243373231493a207472616e7366657246726f6d2829205f6973417070726f6044820152727665644f724f776e6572203d2066616c73652160681b6064820152608401610e55565b6112c88161294a565b156113265760405162461bcd60e51b815260206004820152602860248201527f455243373231493a207472616e7366657246726f6d282920546f6b656e206973604482015267207374616b65642160c01b6064820152608401610e55565b6111a98383836135ba565b60115460009060ff16801561134857504260125411155b905090565b600080611359846114c6565b905080838151811061136d5761136d614bb1565b602002602001015191505092915050565b600a546001600160a01b031633146113a85760405162461bcd60e51b8152600401610e5590614938565b610e9d82828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061377a92505050565b6004546000908190816113f8611cf6565b9050805b6114068284614a60565b811161145e576000818152600560205260409020546001600160a01b03878116911614801561143957506114398161294a565b1561144c578361144881614b40565b9450505b8061145681614b40565b9150506113fc565b5091949350505050565b60005b825181101561108057611499858585848151811061148b5761148b614bb1565b6020026020010151856127ee565b806114a381614b40565b91505061146b565b6111a9838383604051806020016040528060008152506127ee565b6001600160a01b0381166000908152600660205260409020546060908061151b5760005b604051908082528060200260200182016040528015611513578160200160208202803683370190505b509392505050565b6000816001600160401b0381111561153557611535614bc7565b60405190808252806020026020018201604052801561155e578160200160208202803683370190505b50600454909150600090815b8181101561162957600061157d82611e7c565b6001600160a01b03161480156115b657508361159a600187614aab565b815181106115aa576115aa614bb1565b60200260200101516000145b156115c957816115c581614b40565b9250505b6000818152600560205260409020546001600160a01b038881169116141561161757808484815181106115fe576115fe614bb1565b60209081029190910101528261161381614b40565b9350505b8061162181614b40565b91505061156a565b509195945050505050565b600b546001600160a01b0316331461165e5760405162461bcd60e51b8152600401610e559061486b565b600c541561169e57600c80548061167757611677614b9b565b600082815260209020810160001990810180546001600160a01b031916905501905561165e565b600d54156116d257600d8054806116b7576116b7614b9b565b6001900381819060005260206000200160009055905561169e565b565b6018546001600160a01b031633146116fe5760405162461bcd60e51b8152600401610e559061499a565b60005b818110156111a95761172a83838381811061171e5761171e614bb1565b9050602002013561378d565b82828281811061173c5761173c614bb1565b905060200201356005600085858581811061175957611759614bb1565b60209081029290920135835250810191909152604090810160009081205460185492516001600160a01b039182169390911691600080516020614c0983398151915291a4806117a781614b40565b915050611701565b600a546060906001600160a01b031633146117dc5760405162461bcd60e51b8152600401610e5590614938565b600c54158015906117ee5750600d5415155b61183a5760405162461bcd60e51b815260206004820152601f60248201527f50617961626c6520676f7665726e616e6365206e6f74207365742079657421006044820152606401610e55565b600d54600c541461185d5760405162461bcd60e51b8152600401610e55906148b3565b6000805b600d548110156118a857600d818154811061187e5761187e614bb1565b9060005260206000200154826118949190614a60565b9150806118a081614b40565b915050611861565b50806103e8146118ca5760405162461bcd60e51b8152600401610e55906149c7565b600c5447906000906118dd906002614a60565b6001600160401b038111156118f4576118f4614bc7565b60405190808252806020026020018201604052801561191d578160200160208202803683370190505b50905060005b600c54811015611992576103e8600d828154811061194357611943614bb1565b9060005260206000200154846119599190614a8c565b6119639190614a78565b82828151811061197557611975614bb1565b60209081029190910101528061198a81614b40565b915050611923565b50600c5481518391839181106119aa576119aa614bb1565b60200260200101818152505060005b600c54811015611a29578181815181106119d5576119d5614bb1565b602002602001015182600c8054905060016119f09190614a60565b81518110611a0057611a00614bb1565b60200260200101818151611a149190614a60565b90525080611a2181614b40565b9150506119b9565b509250505090565b6018546001600160a01b03163314611a5b5760405162461bcd60e51b8152600401610e559061499a565b60005b818110156111a957611a87838383818110611a7b57611a7b614bb1565b90506020020135613863565b80611a9181614b40565b915050611a5e565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b8351811015611bb157838181518110611af357611af3614bb1565b60200260200101518210611b5157838181518110611b1357611b13614bb1565b602002602001015182604051602001611b36929190918252602082015260400190565b60405160208183030381529060405280519060200120611b9d565b81848281518110611b6457611b64614bb1565b6020026020010151604051602001611b86929190918252602082015260400190565b604051602081830303815290604052805190602001205b915080611ba981614b40565b915050611ad8565b50600954149392505050565b60606000611bca836113e7565b905080611bd85760006114ea565b6000816001600160401b03811115611bf257611bf2614bc7565b604051908082528060200260200182016040528015611c1b578160200160208202803683370190505b50600454909150600090815b81811015611629576000611c3a82611e7c565b6001600160a01b0316148015611c73575083611c57600187614aab565b81518110611c6757611c67614bb1565b60200260200101516000145b15611c865781611c8281614b40565b9250505b6000818152600560205260409020546001600160a01b038881169116148015611cb35750611cb38161294a565b15611ce45780848481518110611ccb57611ccb614bb1565b602090810291909101015282611ce081614b40565b9350505b80611cee81614b40565b915050611c27565b60045460009081805b82811015611d3a576000611d1282611e7c565b6001600160a01b031614611d2857809150611d3a565b80611d3281614b40565b915050611cff565b5092915050565b60606000611d4e83612d25565b905080611d5c5760006114ea565b6000816001600160401b03811115611d7657611d76614bc7565b604051908082528060200260200182016040528015611d9f578160200160208202803683370190505b50600454909150600090815b81811015611629576000611dbe82611e7c565b6001600160a01b0316148015611df7575083611ddb600187614aab565b81518110611deb57611deb614bb1565b60200260200101516000145b15611e0a5781611e0681614b40565b9250505b6000818152600560205260409020546001600160a01b038881169116148015611e395750611e378161294a565b155b15611e6a5780848481518110611e5157611e51614bb1565b602090810291909101015282611e6681614b40565b9350505b80611e7481614b40565b915050611dab565b600081815260056020526040812054600160a01b900464ffffffffff16611eb957506000908152600560205260409020546001600160a01b031690565b50506018546001600160a01b031690565b919050565b600b546001600160a01b03163314611ef95760405162461bcd60e51b8152600401610e559061486b565b600c54158015611f095750600d54155b611f7b5760405162461bcd60e51b815260206004820152603a60248201527f50617961626c6520476f7665726e616e636520616c726561647920736574212060448201527f546f2073657420616761696e2c207265736574206669727374210000000000006064820152608401610e55565b8051825114611fd85760405162461bcd60e51b815260206004820152602360248201527f4164647265737320616e6420536861726573206c656e677468206d69736d617460448201526263682160e81b6064820152608401610e55565b6000805b83518110156120a357828181518110611ff757611ff7614bb1565b60200260200101518261200a9190614a60565b9150600c84828151811061202057612020614bb1565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558251600d9084908390811061207257612072614bb1565b602090810291909101810151825460018101845560009384529190922001558061209b81614b40565b915050611fdc565b50806103e8146111a95760405162461bcd60e51b815260206004820152601960248201527f546f74616c20536861726573206973206e6f74203130303021000000000000006044820152606401610e55565b600a546001600160a01b0316331461211f5760405162461bcd60e51b8152600401610e5590614938565b6116d26000613948565b600a546001600160a01b031633146121535760405162461bcd60e51b8152600401610e5590614938565b600c54158015906121655750600d5415155b6121b15760405162461bcd60e51b815260206004820152601f60248201527f50617961626c6520676f7665726e616e6365206e6f74207365742079657421006044820152606401610e55565b600d54600c54146121d45760405162461bcd60e51b8152600401610e55906148b3565b6000805b600d5481101561221f57600d81815481106121f5576121f5614bb1565b90600052602060002001548261220b9190614a60565b91508061221781614b40565b9150506121d8565b50806103e8146122415760405162461bcd60e51b8152600401610e55906149c7565b4760005b600c548110156111a95760006103e8600d838154811061226757612267614bb1565b90600052602060002001548461227d9190614a8c565b6122879190614a78565b90506122ba600c838154811061229f5761229f614bb1565b6000918252602090912001546001600160a01b03168261399a565b50806122c581614b40565b915050612245565b3332146122ec5760405162461bcd60e51b8152600401610e559061496d565b600f5460ff16801561230057504260105411155b61231c5760405162461bcd60e51b8152600401610e55906148f6565b6123593384848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061251792505050565b6123975760405162461bcd60e51b815260206004820152600f60248201526e596f7520617265206e6f74204f472160881b6044820152606401610e55565b336000908152601a6020526040902054156123f45760405162461bcd60e51b815260206004820152601860248201527f596f75206861766520616c7265616479206d696e7465642100000000000000006044820152606401610e55565b336000908152601a6020526040812080549161240f83614b40565b91905055508015612425576111a9336001613211565b6111a9336001613390565b600a546001600160a01b0316331461245a5760405162461bcd60e51b8152600401610e5590614938565b61246381600955565b50565b600a546001600160a01b031633146124905760405162461bcd60e51b8152600401610e5590614938565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6060600d80548060200260200160405190810160405280929190818152602001828054801561250057602002820191906000526020600020905b8154815260200190600101908083116124ec575b5050505050905090565b60018054610eae90614b05565b6040516bffffffffffffffffffffffff19606084901b166020820152600090819060340160405160208183030381529060405280519060200120905060005b835181101561262f5783818151811061257157612571614bb1565b602002602001015182106125cf5783818151811061259157612591614bb1565b6020026020010151826040516020016125b4929190918252602082015260400190565b6040516020818303038152906040528051906020012061261b565b818482815181106125e2576125e2614bb1565b6020026020010151604051602001612604929190918252602082015260400190565b604051602081830303815290604052805190602001205b91508061262781614b40565b915050612556565b50601954149392505050565b610e9d338383613a2f565b3332146126655760405162461bcd60e51b8152600401610e559061496d565b60115460ff16801561267957504260125411155b6126c55760405162461bcd60e51b815260206004820152601f60248201527f5075626c6963204d696e74206973206e6f7420656e61626c65642079657421006044820152606401610e55565b8160155410156127175760405162461bcd60e51b815260206004820152601a60248201527f4f766572206d6178696d756d206d696e747320706572205458210000000000006044820152606401610e55565b816014546127259190614a8c565b34146127695760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642076616c75652073656e742160681b6044820152606401610e55565b801561277957610e9d3383613211565b610e9d3383613390565b600a546001600160a01b031633146127ad5760405162461bcd60e51b8152600401610e5590614938565b601955565b600b546001600160a01b031633146127dc5760405162461bcd60e51b8152600401610e559061486b565b600b80546001600160a01b0319169055565b6127f984848461124d565b6001600160a01b0383163b15612944576000836001600160a01b031663150b7a02338786866040516024016128319493929190614796565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161286a9190614747565b600060405180830381855afa9150503d80600081146128a5576040519150601f19603f3d011682016040523d82523d6000602084013e6128aa565b606091505b509150506000818060200190518101906128c491906145d0565b9050630a85bd0160e11b6001600160e01b031982161461107e5760405162461bcd60e51b815260206004820152603560248201527f455243373231493a20736166655472616e7366657246726f6d282920746f5f206044820152746e6f742045524337323152656365697661626c652160581b6064820152608401610e55565b50505050565b600090815260056020526040902054600160a01b900464ffffffffff16151590565b600a546001600160a01b031633146129965760405162461bcd60e51b8152600401610e5590614938565b6011805460ff191683151517905560128190555050565b606060006129ba83611e7c565b6001600160a01b03161415612a235760405162461bcd60e51b815260206004820152602960248201527f455243373231493a20746f6b656e555249282920546f6b656e20646f6573206e6044820152686f742065786973742160b81b6064820152608401610e55565b6002612a2e83613b24565b6003604051602001612a4293929190614763565b6040516020818303038152906040529050919050565b600f5460009060ff1680156113485750426010541115905090565b600a546001600160a01b03163314612a9d5760405162461bcd60e51b8152600401610e5590614938565b601655565b6000805b600c54811015612af657600c8181548110612ac357612ac3614bb1565b6000918252602090912001546001600160a01b0316331415612ae457600191505b80612aee81614b40565b915050612aa6565b5080612b445760405162461bcd60e51b815260206004820152601a60248201527f596f7520617265206e6f742061207368617265686f6c646572210000000000006044820152606401610e55565b50336000908152600e60205260409020805460ff19166001179055565b600a546001600160a01b03163314612b8b5760405162461bcd60e51b8152600401610e5590614938565b60005b600c54811015612c4357600e6000600c8381548110612baf57612baf614bb1565b60009182526020808320909101546001600160a01b0316835282019290925260400190205460ff16612c315760405162461bcd60e51b815260206004820152602560248201527f456d657267656e63792046756e6374696f6e7320617265206e6f7420756e6c6f604482015264636b65642160d81b6064820152608401610e55565b80612c3b81614b40565b915050612b8e565b506116d2334761399a565b6018546001600160a01b03163314612c785760405162461bcd60e51b8152600401610e559061499a565b60005b818110156111a957612ca4838383818110612c9857612c98614bb1565b90506020020135613c22565b828282818110612cb657612cb6614bb1565b60185460209091029290920135916001600160a01b03169050612cf0858585818110612ce457612ce4614bb1565b90506020020135611e7c565b6001600160a01b0316600080516020614c0983398151915260405160405180910390a480612d1d81614b40565b915050612c7b565b600454600090819081612d36611cf6565b9050805b612d448284614a60565b811161145e576000818152600560205260409020546001600160a01b038781169116148015612d795750612d778161294a565b155b15612d8c5783612d8881614b40565b9450505b80612d9681614b40565b915050612d3a565b6060600c80548060200260200160405190810160405280929190818152602001828054801561250057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612dd8575050505050905090565b6000805b82811015612eab57600060056000868685818110612e2357612e23614bb1565b602090810292909201358352508181019290925260409081016000208151808301909252546001600160a01b03808216808452600160a01b90920464ffffffffff1693830193909352909250908716141580612e885750602081015164ffffffffff16155b15612e9857600092505050612eb1565b5080612ea381614b40565b915050612e03565b50600190505b9392505050565b6000805b82811015612eab57612ed9848483818110612ce457612ce4614bb1565b6001600160a01b0316856001600160a01b031614612efb576000915050612eb1565b80612f0581614b40565b915050612ebc565b600a546001600160a01b03163314612f375760405162461bcd60e51b8152600401610e5590614938565b6001600160a01b038116612f9d5760405162461bcd60e51b815260206004820152602760248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616044820152666464726573732160c81b6064820152608401610e55565b61246381613948565b60005b815181101561294457612fd68484848481518110612fc957612fc9614bb1565b602002602001015161124d565b80612fe081614b40565b915050612fa9565b600a546001600160a01b031633146130125760405162461bcd60e51b8152600401610e5590614938565b601455565b3332146130365760405162461bcd60e51b8152600401610e559061496d565b600f5460ff16801561304a57504260105411155b6130665760405162461bcd60e51b8152600401610e55906148f6565b6130a333858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250611a9992505050565b6130ef5760405162461bcd60e51b815260206004820152601860248201527f596f7520617265206e6f742077686974656c69737465642100000000000000006044820152606401610e55565b3360009081526017602052604090205461310a908390614a60565b60165410156131695760405162461bcd60e51b815260206004820152602560248201527f596f7520646f6e74206861766520656e6f7567682077686974656c697374206d604482015264696e74732160d81b6064820152608401610e55565b816014546131779190614a8c565b34146131bb5760405162461bcd60e51b8152602060048201526013602482015272496e76616c69642076616c75652073656e742160681b6044820152606401610e55565b33600090815260176020526040812080548492906131da908490614a60565b909155505080156131f4576131ef3383613211565b612944565b6129443383613390565b8051610e9d906003906020840190613e31565b8060045461321f9190614a60565b60135410156132705760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820746f6b656e732072656d61696e696e6721000000006044820152606401610e55565b600060045460016132819190614a60565b905060005b82811015613373576132a18461329c8385614a60565b613ce5565b6132b36132ae8284614a60565b613c22565b6132bd8183614a60565b6018546040516001600160a01b0391821691871690600080516020614c0983398151915290600090a46018546001600160a01b031663d9c020bf856133028486614a60565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561334857600080fd5b505af115801561335c573d6000803e3d6000fd5b50505050808061336b90614b40565b915050613286565b5081600460008282546133869190614a60565b9091555050505050565b8060045461339e9190614a60565b60135410156133ef5760405162461bcd60e51b815260206004820152601c60248201527f4e6f7420656e6f75676820746f6b656e732072656d61696e696e6721000000006044820152606401610e55565b600060045460016134009190614a60565b905060005b828110156133735761341b8461329c8385614a60565b8061342581614b40565b915050613405565b6000818152600760205260409020546001600160a01b03838116911614610e9d57600081815260076020526040902080546001600160a01b0319166001600160a01b038416908117909155819061348382611e7c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806134c883611e7c565b6001600160a01b0316141561353c5760405162461bcd60e51b815260206004820152603460248201527f455243373231493a205f6973417070726f7665644f724f776e65722829204f776044820152736e6572206973205a65726f20416464726573732160601b6064820152608401610e55565b600061354783611e7c565b9050806001600160a01b0316846001600160a01b0316148061358257506000838152600760205260409020546001600160a01b038581169116145b806135b257506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b949350505050565b6135c381611e7c565b6001600160a01b0316836001600160a01b03161461363d5760405162461bcd60e51b815260206004820152603160248201527f455243373231493a205f7472616e736665722829205472616e73666572204e6f60448201527074204f776e6572206f6620546f6b656e2160781b6064820152608401610e55565b6001600160a01b0382166136aa5760405162461bcd60e51b815260206004820152602e60248201527f455243373231493a205f7472616e736665722829205472616e7366657220746f60448201526d205a65726f20416464726573732160901b6064820152608401610e55565b6000818152600760205260409020546001600160a01b0316156136d2576136d260008261342d565b600081815260056020908152604080832080546001600160a01b0319166001600160a01b0387811691909117909155861683526006909152812080549161371883614aee565b90915550506001600160a01b038216600090815260066020526040812080549161374183614b40565b919050555080826001600160a01b0316846001600160a01b0316600080516020614c0983398151915260405160405180910390a4505050565b8051610e9d906002906020840190613e31565b600061379882611e7c565b6001600160a01b031614156137ef5760405162461bcd60e51b815260206004820181905260248201527f5f756e7374616b6528293a20546f6b656e20646f65736e2774206578697374216044820152606401610e55565b6137f88161294a565b6138445760405162461bcd60e51b815260206004820181905260248201527f5f756e7374616b6528293a20546f6b656e206973206e6f74207374616b6564216044820152606401610e55565b6000908152600560205260409020805464ffffffffff60a01b19169055565b600061386e82611e7c565b6001600160a01b031614156138c55760405162461bcd60e51b815260206004820152601f60248201527f5f75706461746528293a20546f6b656e20646f65736e277420657869737421006044820152606401610e55565b6138ce8161294a565b61391a5760405162461bcd60e51b815260206004820152601f60248201527f5f75706461746528293a20546f6b656e206973206e6f74207374616b656421006044820152606401610e55565b6000908152600560205260409020805464ffffffffff60a01b1916600160a01b4264ffffffffff1602179055565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146139e7576040519150601f19603f3d011682016040523d82523d6000602084013e6139ec565b606091505b50509050806111a95760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610e55565b816001600160a01b0316836001600160a01b03161415613ab75760405162461bcd60e51b815260206004820152603d60248201527f455243373231493a205f736574417070726f76616c466f72416c6c2829204f7760448201527f6e6572206d757374206e6f7420626520746865204f70657261746f72210000006064820152608401610e55565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606081613b485750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613b725780613b5c81614b40565b9150613b6b9050600a83614a78565b9150613b4c565b6000816001600160401b03811115613b8c57613b8c614bc7565b6040519080825280601f01601f191660200182016040528015613bb6576020820181803683370190505b5090505b84156135b25781613bca81614aee565b9250613bd99050600a86614b5b565b613be4906030614a60565b60f81b818381518110613bf957613bf9614bb1565b60200101906001600160f81b031916908160001a905350613c1b600a86614a78565b9450613bba565b6000613c2d82611e7c565b6001600160a01b03161415613c845760405162461bcd60e51b815260206004820152601e60248201527f5f7374616b6528293a20546f6b656e20646f65736e27742065786973742100006044820152606401610e55565b613c8d8161294a565b1561391a5760405162461bcd60e51b815260206004820152602260248201527f5f7374616b6528293a20546f6b656e20697320616c7265616479207374616b65604482015261642160f01b6064820152608401610e55565b6001600160a01b038216613d495760405162461bcd60e51b815260206004820152602560248201527f455243373231493a205f6d696e742829204d696e7420746f205a65726f204164604482015264647265737360d81b6064820152608401610e55565b6000613d5482611e7c565b6001600160a01b031614613dc15760405162461bcd60e51b815260206004820152602e60248201527f455243373231493a205f6d696e74282920546f6b656e20746f204d696e74204160448201526d6c7265616479204578697374732160901b6064820152608401610e55565b6001600160a01b0382166000908152600660205260408120805491613de583614b40565b909155505060008181526005602052604080822080546001600160a01b0319166001600160a01b0386169081179091559051839290600080516020614c09833981519152908290a45050565b828054613e3d90614b05565b90600052602060002090601f016020900481019282613e5f5760008555613ea5565b82601f10613e7857805160ff1916838001178555613ea5565b82800160010185558215613ea5579182015b82811115613ea5578251825591602001919060010190613e8a565b50613eb1929150613eb5565b5090565b5b80821115613eb15760008155600101613eb6565b60008083601f840112613edc57600080fd5b5081356001600160401b03811115613ef357600080fd5b6020830191508360208260051b8501011115613f0e57600080fd5b9250929050565b600082601f830112613f2657600080fd5b81356020613f3b613f3683614a3d565b614a0d565b80838252828201915082860187848660051b8901011115613f5b57600080fd5b60005b85811015613f7a57813584529284019290840190600101613f5e565b5090979650505050505050565b80358015158114611eca57600080fd5b600082601f830112613fa857600080fd5b81356001600160401b03811115613fc157613fc1614bc7565b613fd4601f8201601f1916602001614a0d565b818152846020838601011115613fe957600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561401857600080fd5b8135612eb181614bdd565b6000806040838503121561403657600080fd5b823561404181614bdd565b9150602083013561405181614bdd565b809150509250929050565b60008060006060848603121561407157600080fd5b833561407c81614bdd565b9250602084013561408c81614bdd565b915060408401356001600160401b038111156140a757600080fd5b6140b386828701613f15565b9150509250925092565b600080600080608085870312156140d357600080fd5b84356140de81614bdd565b935060208501356140ee81614bdd565b925060408501356001600160401b038082111561410a57600080fd5b61411688838901613f15565b9350606087013591508082111561412c57600080fd5b5061413987828801613f97565b91505092959194509250565b60008060006060848603121561415a57600080fd5b833561416581614bdd565b9250602084013561417581614bdd565b929592945050506040919091013590565b6000806000806080858703121561419c57600080fd5b84356141a781614bdd565b935060208501356141b781614bdd565b92506040850135915060608501356001600160401b038111156141d957600080fd5b61413987828801613f97565b600080604083850312156141f857600080fd5b823561420381614bdd565b91506020838101356001600160401b0381111561421f57600080fd5b8401601f8101861361423057600080fd5b803561423e613f3682614a3d565b80828252848201915084840189868560051b870101111561425e57600080fd5b600094505b83851015614281578035835260019490940193918501918501614263565b5080955050505050509250929050565b6000806000604084860312156142a657600080fd5b83356142b181614bdd565b925060208401356001600160401b038111156142cc57600080fd5b6142d886828701613eca565b9497909650939450505050565b600080604083850312156142f857600080fd5b823561430381614bdd565b915061431160208401613f87565b90509250929050565b6000806040838503121561432d57600080fd5b823561433881614bdd565b946020939093013593505050565b60008060008060006060868803121561435e57600080fd5b85356001600160401b038082111561437557600080fd5b61438189838a01613eca565b9097509550602088013591508082111561439a57600080fd5b506143a788828901613eca565b90945092506143ba905060408701613f87565b90509295509295909350565b600080604083850312156143d957600080fd5b82356001600160401b03808211156143f057600080fd5b818501915085601f83011261440457600080fd5b81356020614414613f3683614a3d565b8083825282820191508286018a848660051b890101111561443457600080fd5b600096505b8487101561446057803561444c81614bdd565b835260019690960195918301918301614439565b509650508601359250508082111561447757600080fd5b5061448485828601613f15565b9150509250929050565b6000806000604084860312156144a357600080fd5b83356001600160401b038111156144b957600080fd5b6144c586828701613eca565b90945092506144d8905060208501613f87565b90509250925092565b600080600080606085870312156144f757600080fd5b84356001600160401b0381111561450d57600080fd5b61451987828801613eca565b9095509350506020850135915061453260408601613f87565b905092959194509250565b6000806020838503121561455057600080fd5b82356001600160401b0381111561456657600080fd5b61457285828601613eca565b90969095509350505050565b6000806040838503121561459157600080fd5b61433883613f87565b6000602082840312156145ac57600080fd5b5035919050565b6000602082840312156145c557600080fd5b8135612eb181614bf2565b6000602082840312156145e257600080fd5b8151612eb181614bf2565b6000806020838503121561460057600080fd5b82356001600160401b038082111561461757600080fd5b818501915085601f83011261462b57600080fd5b81358181111561463a57600080fd5b86602082850101111561464c57600080fd5b60209290920196919550909350505050565b6000806040838503121561467157600080fd5b8235915061431160208401613f87565b60008151808452614699816020860160208601614ac2565b601f01601f19169290920160200192915050565b8054600090600181811c90808316806146c757607f831692505b60208084108214156146e957634e487b7160e01b600052602260045260246000fd5b8180156146fd576001811461470e5761473b565b60ff1986168952848901965061473b565b60008881526020902060005b868110156147335781548b82015290850190830161471a565b505084890196505b50505050505092915050565b60008251614759818460208701614ac2565b9190910192915050565b600061476f82866146ad565b845161477f818360208901614ac2565b61478b818301866146ad565b979650505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906147c990830184614681565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156148145783516001600160a01b0316835292840192918401916001016147ef565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156148145783518352928401929184019160010161483c565b602081526000612eb16020830184614681565b60208082526028908201527f50617961626c65476f7665726e616e63653a2043616c6c6572206973206e6f74604082015267205365747465722160c01b606082015260800190565b60208082526023908201527f50617961626c6520676f7665726e616e6365206c656e677468206d69736d617460408201526263682160e81b606082015260800190565b60208082526022908201527f57686974656c697374204d696e74206973206e6f7420656e61626c6564207965604082015261742160f01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601390820152724e6f20536d61727420436f6e7472616374732160681b604082015260600190565b602080825260139082015272596f7520617265206e6f74207374616b65722160681b604082015260600190565b60208082526026908201527f50617961626c6520476f7665726e616e636520536861726573206973206e6f7460408201526520313030302160d01b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715614a3557614a35614bc7565b604052919050565b60006001600160401b03821115614a5657614a56614bc7565b5060051b60200190565b60008219821115614a7357614a73614b6f565b500190565b600082614a8757614a87614b85565b500490565b6000816000190483118215151615614aa657614aa6614b6f565b500290565b600082821015614abd57614abd614b6f565b500390565b60005b83811015614add578181015183820152602001614ac5565b838111156129445750506000910152565b600081614afd57614afd614b6f565b506000190190565b600181811c90821680614b1957607f821691505b60208210811415614b3a57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614b5457614b54614b6f565b5060010190565b600082614b6a57614b6a614b85565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461246357600080fd5b6001600160e01b03198116811461246357600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa264697066735822122042d5d33fc25d612eb479449862fe8dc0b09ae4463950a623053c297948b09a4d64736f6c63430008070033

Deployed Bytecode Sourcemap

22001:8068:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14543:31;;;14552:10;16444:51:1;;14564:9:0;16526:2:1;16511:18;;16504:34;14543:31:0;;16417:18:1;14543:31:0;;;;;;;22001:8068;;;;;7589:159;;;;;;;;;;-1:-1:-1;7589:159:0;;;;;:::i;:::-;;:::i;:::-;;;18326:14:1;;18319:22;18301:41;;18289:2;18274:18;7589:159:0;;;;;;;;23521:115;;;;;;;;;;-1:-1:-1;23521:115:0;;;;;:::i;:::-;;:::i;:::-;;234:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27734:538::-;;;;;;;;;;-1:-1:-1;27734:538:0;;;;;:::i;:::-;;:::i;705:46::-;;;;;;;;;;-1:-1:-1;705:46:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;705:46:0;;;;;;-1:-1:-1;;;;;15733:32:1;;;15715:51;;15703:2;15688:18;705:46:0;15569:203:1;5503:352:0;;;;;;;;;;-1:-1:-1;5503:352:0;;;;;:::i;:::-;;:::i;22941:102::-;;;;;;;;;;-1:-1:-1;22941:102:0;;;;;:::i;:::-;;:::i;23159:108::-;;;;;;;;;;-1:-1:-1;23159:108:0;;;;;:::i;:::-;;:::i;449:26::-;;;;;;;;;;;;;;;;;;;35099:25:1;;;35087:2;35072:18;449:26:0;34953:177:1;23951:122:0;;;;;;;;;;-1:-1:-1;23951:122:0;;;;;:::i;:::-;;:::i;14727:58::-;;;;;;;;;;-1:-1:-1;14727:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;6015:331;;;;;;;;;;-1:-1:-1;6015:331:0;;;;;:::i;:::-;;:::i;21752:134::-;;;;;;;;;;;;;:::i;11753:203::-;;;;;;;;;;-1:-1:-1;11753:203:0;;;;;:::i;:::-;;:::i;23407:108::-;;;;;;;;;;-1:-1:-1;23407:108:0;;;;;:::i;:::-;;:::i;8392:452::-;;;;;;;;;;-1:-1:-1;8392:452:0;;;;;:::i;:::-;;:::i;593:49::-;;;;;;;;;;-1:-1:-1;593:49:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;593:49:0;;;-1:-1:-1;;;593:49:0;;;;;;;;;;-1:-1:-1;;;;;16739:32:1;;;16721:51;;16820:12;16808:25;;;16803:2;16788:18;;16781:53;16694:18;593:49:0;16549:291:1;7292:263:0;;;;;;;;;;-1:-1:-1;7292:263:0;;;;;:::i;:::-;;:::i;22541:32::-;;;;;;;;;;;;;;;;6865:148;;;;;;;;;;-1:-1:-1;6865:148:0;;;;;:::i;:::-;;:::i;9489:669::-;;;;;;;;;;-1:-1:-1;9489:669:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15797:301::-;;;;;;;;;;;;;:::i;27417:274::-;;;;;;;;;;-1:-1:-1;27417:274:0;;;;;:::i;:::-;;:::i;17800:1753::-;;;;;;;;;;;;;:::i;27225:186::-;;;;;;;;;;-1:-1:-1;27225:186:0;;;;;:::i;:::-;;:::i;12385:423::-;;;;;;;;;;-1:-1:-1;12385:423:0;;;;;:::i;:::-;;:::i;10875:776::-;;;;;;;;;;-1:-1:-1;10875:776:0;;;;;:::i;:::-;;:::i;8045:339::-;;;;;;;;;;;;;:::i;10166:701::-;;;;;;;;;;-1:-1:-1;10166:701:0;;;;;:::i;:::-;;:::i;24168:241::-;;;;;;;;;;-1:-1:-1;24168:241:0;;;;;:::i;:::-;;:::i;22454:37::-;;;;;;;;;;;;;;;;15059:732;;;;;;;;;;-1:-1:-1;15059:732:0;;;;;:::i;:::-;;:::i;651:44::-;;;;;;;;;;-1:-1:-1;651:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;13578:105;;;;;;;;;;;;;:::i;16545:1247::-;;;;;;;;;;;;;:::i;28341:478::-;;;;;;;;;;-1:-1:-1;28341:478:0;;;;;:::i;:::-;;:::i;23663:109::-;;;;;;;;;;-1:-1:-1;23663:109:0;;;;;:::i;:::-;;:::i;22668:15::-;;;;;;;;;;-1:-1:-1;22668:15:0;;;;-1:-1:-1;;;;;22668:15:0;;;22690:92;;;;;;;;;;-1:-1:-1;22690:92:0;;;;;:::i;:::-;;:::i;16386:124::-;;;;;;;;;;;;;:::i;21387:30::-;;;;;;;;;;-1:-1:-1;21387:30:0;;;;;;;;12884:20;;;;;;;;;;-1:-1:-1;12884:20:0;;;;-1:-1:-1;;;;;12884:20:0;;;254;;;;;;;;;;;;;:::i;24665:422::-;;;;;;;;;;-1:-1:-1;24665:422:0;;;;;:::i;:::-;;:::i;5861:148::-;;;;;;;;;;-1:-1:-1;5861:148:0;;;;;:::i;:::-;;:::i;29610:456::-;;;;;;:::i;:::-;;:::i;24548:111::-;;;;;;;;;;-1:-1:-1;24548:111:0;;;;;:::i;:::-;;:::i;14290:135::-;;;;;;;;;;;;;:::i;16140:96::-;;;;;;;;;;-1:-1:-1;16207:21:0;16140:96;;6352:507;;;;;;;;;;-1:-1:-1;6352:507:0;;;;;:::i;:::-;;:::i;1259:121::-;;;;;;;;;;-1:-1:-1;1259:121:0;;;;;:::i;:::-;;:::i;25093:52::-;;;;;;;;;;-1:-1:-1;25093:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;23800:116;;;;;;;;;;-1:-1:-1;23800:116:0;;;;;:::i;:::-;;:::i;22580:51::-;;;;;;;;;;-1:-1:-1;22580:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;7756:281;;;;;;;;;;-1:-1:-1;7756:281:0;;;;;:::i;:::-;;:::i;21178:143::-;;;;;;;;;;;;;:::i;1388:130::-;;;;;;;;;;-1:-1:-1;1388:130:0;;;;;:::i;:::-;1456:6;1482:18;;;:8;:18;;;;;:28;-1:-1:-1;;;1482:28:0;;;;;1388:130;;;;35309:12:1;35297:25;;;35279:44;;35267:2;35252:18;1388:130:0;35135:194:1;23273:108:0;;;;;;;;;;-1:-1:-1;23273:108:0;;;;;:::i;:::-;;:::i;20821:33::-;;;;;;;;;;;;;;;;21419:30;;;;;;;;;;;;;;;;19944:136;;;;;;;;;;;;;:::i;22499:33::-;;;;;;;;;;;;;;;;20375:137;;;;;;;;;;;;;:::i;26956:263::-;;;;;;;;;;-1:-1:-1;26956:263:0;;;;;:::i;:::-;;:::i;8850:461::-;;;;;;;;;;-1:-1:-1;8850:461:0;;;;;:::i;:::-;;:::i;16242:138::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26535:409::-;;;;;;;;;;-1:-1:-1;26535:409:0;;;;;:::i;:::-;;:::i;22415:31::-;;;;;;;;;;;;;;;;759:68;;;;;;;;;;-1:-1:-1;759:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;26251:278;;;;;;;;;;-1:-1:-1;26251:278:0;;;;;:::i;:::-;;:::i;13365:207::-;;;;;;;;;;-1:-1:-1;13365:207:0;;;;;:::i;:::-;;:::i;7058:228::-;;;;;;;;;;-1:-1:-1;7058:228:0;;;;;:::i;:::-;;:::i;23049:102::-;;;;;;;;;;-1:-1:-1;23049:102:0;;;;;:::i;:::-;;:::i;28860:712::-;;;;;;:::i;:::-;;:::i;7589:159::-;7658:4;-1:-1:-1;;;;;;;;;7683:26:0;;;;:56;;-1:-1:-1;;;;;;;;;;7713:26:0;;;7683:56;7675:65;7589:159;-1:-1:-1;;7589:159:0:o;23521:115::-;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;;;;;;;;;23602:26:::1;23623:4;;23602:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23602:20:0::1;::::0;-1:-1:-1;;;23602:26:0:i:1;:::-;23521:115:::0;;:::o;234:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27734:538::-;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;27869:30;;::::1;27861:79;;;::::0;-1:-1:-1;;;27861:79:0;;25161:2:1;27861:79:0::1;::::0;::::1;25143:21:1::0;25200:2;25180:18;;;25173:30;25239:25;25219:18;;;25212:53;25282:18;;27861:79:0::1;24959:347:1::0;27861:79:0::1;27969:12;27965:300;;;28003:9;27998:116;28018:15:::0;;::::1;27998:116;;;28059:39;28077:4;;28082:1;28077:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;28086:8;;28095:1;28086:11;;;;;;;:::i;:::-;;;;;;;28059:17;:39::i;:::-;28035:3:::0;::::1;::::0;::::1;:::i;:::-;;;;27998:116;;;;27965:300;;;28151:9;28146:108;28166:15:::0;;::::1;28146:108;;;28207:31;28217:4;;28222:1;28217:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;28226:8;;28235:1;28226:11;;;;;;;:::i;:::-;;;;;;;28207:9;:31::i;:::-;28183:3:::0;::::1;::::0;::::1;:::i;:::-;;;;28146:108;;;;27965:300;27734:538:::0;;;;;:::o;5503:352::-;5577:14;5594:17;5602:8;5594:7;:17::i;:::-;5577:34;;5637:6;-1:-1:-1;;;;;5630:13:0;:3;-1:-1:-1;;;;;5630:13:0;;;5622:69;;;;-1:-1:-1;;;5622:69:0;;25513:2:1;5622:69:0;;;25495:21:1;25552:2;25532:18;;;25525:30;25591:34;25571:18;;;25564:62;-1:-1:-1;;;25642:18:1;;;25635:41;25693:19;;5622:69:0;25311:407:1;5622:69:0;5710:10;-1:-1:-1;;;;;5710:20:0;;;;:60;;-1:-1:-1;;;;;;5734:24:0;;;;;;:16;:24;;;;;;;;5759:10;5734:36;;;;;;;;;;5710:60;5702:111;;;;-1:-1:-1;;;5702:111:0;;24754:2:1;5702:111:0;;;24736:21:1;24793:2;24773:18;;;24766:30;24832:34;24812:18;;;24805:62;-1:-1:-1;;;24883:18:1;;;24876:36;24929:19;;5702:111:0;24552:402:1;5702:111:0;5824:23;5833:3;5838:8;5824;:23::i;:::-;5566:289;5503:352;;:::o;22941:102::-;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;23013:9:::1;:22:::0;22941:102::o;23159:108::-;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;23234:13:::1;:25:::0;23159:108::o;23951:122::-;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;20935:21;:29;;-1:-1:-1;;20935:29:0;;;;;;;20966:18;:26;;;23521:115;;:::o;6015:331::-;6117:40;6136:10;6148:8;6117:18;:40::i;:::-;6109:104;;;;-1:-1:-1;;;6109:104:0;;27935:2:1;6109:104:0;;;27917:21:1;27974:2;27954:18;;;27947:30;28013:34;27993:18;;;27986:62;-1:-1:-1;;;28064:18:1;;;28057:49;28123:19;;6109:104:0;27733:415:1;6109:104:0;6233:18;6242:8;6233;:18::i;:::-;6232:19;6224:72;;;;-1:-1:-1;;;6224:72:0;;22105:2:1;6224:72:0;;;22087:21:1;22144:2;22124:18;;;22117:30;22183:34;22163:18;;;22156:62;-1:-1:-1;;;22234:18:1;;;22227:38;22282:19;;6224:72:0;21903:404:1;6224:72:0;6307:31;6317:5;6324:3;6329:8;6307:9;:31::i;21752:134::-;21827:18;;21803:4;;21827:18;;:56;;;;;21868:15;21849;;:34;;21827:56;21820:63;;21752:134;:::o;11753:203::-;11845:7;11865:24;11892:23;11906:8;11892:13;:23::i;:::-;11865:50;;11933:7;11941:6;11933:15;;;;;;;;:::i;:::-;;;;;;;11926:22;;;11753:203;;;;:::o;23407:108::-;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;23485:22:::1;23502:4;;23485:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23485:16:0::1;::::0;-1:-1:-1;;;23485:22:0:i:1;8392:452::-:0;8534:11;;8464:7;;;;;8582:17;:15;:17::i;:::-;8556:43;-1:-1:-1;8556:43:0;8612:197;8651:30;8666:15;8651:12;:30;:::i;:::-;8646:1;:35;8612:197;;8707:11;;;;:8;:11;;;;;:17;-1:-1:-1;;;;;8707:29:0;;;:17;;:29;:44;;;;;8740:11;8749:1;8740:8;:11::i;:::-;8703:95;;;8772:10;;;;:::i;:::-;;;;8703:95;8683:3;;;;:::i;:::-;;;;8612:197;;;-1:-1:-1;8828:8:0;;8392:452;-1:-1:-1;;;;8392:452:0:o;7292:263::-;7430:9;7425:123;7449:9;:16;7445:1;:20;7425:123;;;7487:49;7504:5;7511:3;7516:9;7526:1;7516:12;;;;;;;;:::i;:::-;;;;;;;7530:5;7487:16;:49::i;:::-;7467:3;;;;:::i;:::-;;;;7425:123;;6865:148;6963:42;6980:5;6987:3;6992:8;6963:42;;;;;;;;;;;;:16;:42::i;9489:669::-;-1:-1:-1;;;;;9613:19:0;;9594:16;9613:19;;;:9;:19;;;;;;9565:16;;9647:13;9643:42;;9683:1;9669:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9669:16:0;-1:-1:-1;9662:23:0;9489:669;-1:-1:-1;;;9489:669:0:o;9643:42::-;9698:24;9740:8;-1:-1:-1;;;;;9725:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9725:24:0;-1:-1:-1;9808:11:0;;9698:51;;-1:-1:-1;9760:14:0;;;9830:296;9854:12;9850:1;:16;9830:296;;;9914:3;9892:10;9900:1;9892:7;:10::i;:::-;-1:-1:-1;;;;;9892:26:0;;:56;;;;-1:-1:-1;9922:7:0;9930:12;9941:1;9930:8;:12;:::i;:::-;9922:21;;;;;;;;:::i;:::-;;;;;;;9947:1;9922:26;9892:56;9888:112;;;9969:14;;;;:::i;:::-;;;;9888:112;10018:11;;;;:8;:11;;;;;:17;-1:-1:-1;;;;;10018:29:0;;;:17;;:29;10014:101;;;10087:1;10069:7;10077:6;10069:15;;;;;;;;:::i;:::-;;;;;;;;;;:19;10090:8;;;;:::i;:::-;;;;10014:101;9868:3;;;;:::i;:::-;;;;9830:296;;;-1:-1:-1;10143:7:0;;9489:669;-1:-1:-1;;;;;9489:669:0:o;15797:301::-;14209:24;;-1:-1:-1;;;;;14209:24:0;14195:10;:38;14187:91;;;;-1:-1:-1;;;14187:91:0;;;;;;;:::i;:::-;15896:27:::1;:34:::0;:39;15889:99:::1;;15952:27;:33;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;15952:33:0;;;;;-1:-1:-1;;;;;;15952:33:0::1;::::0;;;;;15889:99:::1;;;16005:24;:31:::0;:36;15998:93:::1;;16058:24;:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;15998:93;;;15797:301::o:0;27417:274::-;22849:3;;-1:-1:-1;;;;;22849:3:0;22827:10;:26;22819:58;;;;-1:-1:-1;;;22819:58:0;;;;;;;:::i;:::-;27507:9:::1;27502:182;27522:20:::0;;::::1;27502:182;;;27564:22;27573:9;;27583:1;27573:12;;;;;;;:::i;:::-;;;;;;;27564:8;:22::i;:::-;27659:9;;27669:1;27659:12;;;;;;;:::i;:::-;;;;;;;27629:8;:22;27638:9;;27648:1;27638:12;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;27629:22:::0;;-1:-1:-1;27629:22:0;::::1;::::0;;;;;;;;-1:-1:-1;27629:22:0;;;:28;27623:3:::1;::::0;27606:66;;-1:-1:-1;;;;;27629:28:0;;::::1;::::0;27623:3;;::::1;::::0;-1:-1:-1;;;;;;;;;;;27606:66:0;::::1;27544:3:::0;::::1;::::0;::::1;:::i;:::-;;;;27502:182;;17800:1753:::0;13079:5;;17862:16;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;17963:27:::1;:34:::0;:38;;;;:77:::1;;-1:-1:-1::0;18005:24:0::1;:31:::0;:35;;17963:77:::1;17955:121;;;::::0;-1:-1:-1;;;17955:121:0;;32016:2:1;17955:121:0::1;::::0;::::1;31998:21:1::0;32055:2;32035:18;;;32028:30;32094:33;32074:18;;;32067:61;32145:18;;17955:121:0::1;31814:355:1::0;17955:121:0::1;18171:24;:31:::0;18133:27:::1;:34:::0;:69:::1;18125:117;;;;-1:-1:-1::0;;;18125:117:0::1;;;;;;;:::i;:::-;18331:27;::::0;18369:130:::1;18393:24;:31:::0;18389:35;::::1;18369:130;;;18469:24;18494:1;18469:27;;;;;;;;:::i;:::-;;;;;;;;;18446:50;;;;;:::i;:::-;::::0;-1:-1:-1;18426:3:0;::::1;::::0;::::1;:::i;:::-;;;;18369:130;;;;18517:19;18540:4;18517:27;18509:78;;;;-1:-1:-1::0;;;18509:78:0::1;;;;;;;:::i;:::-;18871:27;:34:::0;18791:21:::1;::::0;18771:17:::1;::::0;18871:38:::1;::::0;18908:1:::1;18871:38;:::i;:::-;-1:-1:-1::0;;;;;18856:54:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;18856:54:0::1;;18824:86;;18991:9;18986:162;19010:27;:34:::0;19006:38;::::1;18986:162;;;19130:4;19099:24;19124:1;19099:27;;;;;;;;:::i;:::-;;;;;;;;;19087:9;:39;;;;:::i;:::-;19086:48;;;;:::i;:::-;19066:12;19079:1;19066:15;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:70;19046:3;::::1;::::0;::::1;:::i;:::-;;;;18986:162;;;-1:-1:-1::0;19262:27:0::1;:34:::0;19249:48;;19300:9;;19249:12;;:48;::::1;;;;;:::i;:::-;;;;;;:60;;;::::0;::::1;19325:9;19320:154;19344:27;:34:::0;19340:38;::::1;19320:154;;;19456:12;19469:1;19456:15;;;;;;;;:::i;:::-;;;;;;;19400:12;19413:27;:34;;;;19450:1;19413:38;;;;:::i;:::-;19400:52;;;;;;;;:::i;:::-;;;;;;:71;;;;;;;:::i;:::-;::::0;;-1:-1:-1;19380:3:0;::::1;::::0;::::1;:::i;:::-;;;;19320:154;;;-1:-1:-1::0;19533:12:0;-1:-1:-1;;;17800:1753:0;:::o;27225:186::-;22849:3;;-1:-1:-1;;;;;22849:3:0;22827:10;:26;22819:58;;;;-1:-1:-1;;;22819:58:0;;;;;;;:::i;:::-;27314:9:::1;27309:95;27329:20:::0;;::::1;27309:95;;;27371:21;27379:9;;27389:1;27379:12;;;;;;;:::i;:::-;;;;;;;27371:7;:21::i;:::-;27351:3:::0;::::1;::::0;::::1;:::i;:::-;;;;27309:95;;12385:423:::0;12515:26;;-1:-1:-1;;14282:2:1;14278:15;;;14274:53;12515:26:0;;;14262:66:1;12472:4:0;;;;14344:12:1;;12515:26:0;;;;;;;;;;;;12505:37;;;;;;12489:53;;12558:9;12553:210;12577:6;:13;12573:1;:17;12553:210;;;12628:6;12635:1;12628:9;;;;;;;;:::i;:::-;;;;;;;12620:5;:17;:131;;12733:6;12740:1;12733:9;;;;;;;;:::i;:::-;;;;;;;12744:5;12716:34;;;;;;;;14524:19:1;;;14568:2;14559:12;;14552:28;14605:2;14596:12;;14367:247;12716:34:0;;;;;;;;;;;;;12706:45;;;;;;12620:131;;;12667:5;12674:6;12681:1;12674:9;;;;;;;;:::i;:::-;;;;;;;12650:34;;;;;;;;14524:19:1;;;14568:2;14559:12;;14552:28;14605:2;14596:12;;14367:247;12650:34:0;;;;;;;;;;;;;12640:45;;;;;;12620:131;12612:139;-1:-1:-1;12592:3:0;;;;:::i;:::-;;;;12553:210;;;-1:-1:-1;12789:11:0;;12780:20;;12385:423;-1:-1:-1;;;12385:423:0:o;10875:776::-;10957:16;10986;11005:25;11021:8;11005:15;:25::i;:::-;10986:44;-1:-1:-1;11045:13:0;11041:42;;11081:1;11067:16;;11041:42;11096:24;11138:8;-1:-1:-1;;;;;11123:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11123:24:0;-1:-1:-1;11206:11:0;;11096:51;;-1:-1:-1;11158:14:0;;;11228:391;11252:12;11248:1;:16;11228:391;;;11312:3;11290:10;11298:1;11290:7;:10::i;:::-;-1:-1:-1;;;;;11290:26:0;;:56;;;;-1:-1:-1;11320:7:0;11328:12;11339:1;11328:8;:12;:::i;:::-;11320:21;;;;;;;;:::i;:::-;;;;;;;11345:1;11320:26;11290:56;11286:113;;;11368:14;;;;:::i;:::-;;;;11286:113;11496:11;;;;:8;:11;;;;;:17;-1:-1:-1;;;;;11496:29:0;;;:17;;:29;:44;;;;;11529:11;11538:1;11529:8;:11::i;:::-;11492:116;;;11580:1;11562:7;11570:6;11562:15;;;;;;;;:::i;:::-;;;;;;;;;;:19;11583:8;;;;:::i;:::-;;;;11492:116;11266:3;;;;:::i;:::-;;;;11228:391;;8045:339;8144:11;;8101:7;;;;8202:132;8226:12;8222:1;:16;8202:132;;;8286:3;8264:10;8272:1;8264:7;:10::i;:::-;-1:-1:-1;;;;;8264:26:0;;8260:63;;8312:1;8294:19;;8315:5;;8260:63;8240:3;;;;:::i;:::-;;;;8202:132;;;-1:-1:-1;8353:15:0;8045:339;-1:-1:-1;;8045:339:0:o;10166:701::-;10250:16;10279;10298:27;10316:8;10298:17;:27::i;:::-;10279:46;-1:-1:-1;10340:13:0;10336:42;;10376:1;10362:16;;10336:42;10391:24;10433:8;-1:-1:-1;;;;;10418:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10418:24:0;-1:-1:-1;10501:11:0;;10391:51;;-1:-1:-1;10453:14:0;;;10523:312;10547:12;10543:1;:16;10523:312;;;10607:3;10585:10;10593:1;10585:7;:10::i;:::-;-1:-1:-1;;;;;10585:26:0;;:56;;;;-1:-1:-1;10615:7:0;10623:12;10634:1;10623:8;:12;:::i;:::-;10615:21;;;;;;;;:::i;:::-;;;;;;;10640:1;10615:26;10585:56;10581:112;;;10662:14;;;;:::i;:::-;;;;10581:112;10711:11;;;;:8;:11;;;;;:17;-1:-1:-1;;;;;10711:29:0;;;:17;;:29;:45;;;;;10745:11;10754:1;10745:8;:11::i;:::-;10744:12;10711:45;10707:117;;;10796:1;10778:7;10786:6;10778:15;;;;;;;;:::i;:::-;;;;;;;;;;:19;10799:8;;;;:::i;:::-;;;;10707:117;10561:3;;;;:::i;:::-;;;;10523:312;;24168:241;24233:7;24257:18;;;:8;:18;;;;;:28;-1:-1:-1;;;24257:28:0;;;;24253:149;;-1:-1:-1;24314:18:0;;;;:8;:18;;;;;:24;-1:-1:-1;;;;;24314:24:0;;24168:241::o;24253:149::-;-1:-1:-1;;24386:3:0;;-1:-1:-1;;;;;24386:3:0;;24168:241::o;24253:149::-;24168:241;;;:::o;15059:732::-;14209:24;;-1:-1:-1;;;;;14209:24:0;14195:10;:38;14187:91;;;;-1:-1:-1;;;14187:91:0;;;;;;;:::i;:::-;15218:27:::1;:34:::0;:39;:79;::::1;;;-1:-1:-1::0;15261:24:0::1;:31:::0;:36;15218:79:::1;15210:150;;;::::0;-1:-1:-1;;;15210:150:0;;23624:2:1;15210:150:0::1;::::0;::::1;23606:21:1::0;23663:2;23643:18;;;23636:30;23702:34;23682:18;;;23675:62;23773:28;23753:18;;;23746:56;23819:19;;15210:150:0::1;23422:422:1::0;15210:150:0::1;15400:7;:14;15379:10;:17;:35;15371:83;;;::::0;-1:-1:-1;;;15371:83:0;;22867:2:1;15371:83:0::1;::::0;::::1;22849:21:1::0;22906:2;22886:18;;;22879:30;22945:34;22925:18;;;22918:62;-1:-1:-1;;;22996:18:1;;;22989:33;23039:19;;15371:83:0::1;22665:399:1::0;15371:83:0::1;15465:20;::::0;15496:219:::1;15520:10;:17;15516:1;:21;15496:219;;;15575:7;15583:1;15575:10;;;;;;;;:::i;:::-;;;;;;;15559:26;;;;;:::i;:::-;;;15600:27;15633:10;15644:1;15633:13;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;15600:47;;::::1;::::0;::::1;::::0;;-1:-1:-1;15600:47:0;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;15600:47:0::1;-1:-1:-1::0;;;;;15600:47:0;;::::1;::::0;;;::::1;::::0;;15692:10;;15662:24:::1;::::0;15692:10;;15700:1;;15692:10;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;15662:41;;::::1;::::0;::::1;::::0;;-1:-1:-1;15662:41:0;;;;;;;::::1;::::0;15539:3;::::1;::::0;::::1;:::i;:::-;;;;15496:219;;;;15733:12;15749:4;15733:20;15725:58;;;::::0;-1:-1:-1;;;15725:58:0;;34391:2:1;15725:58:0::1;::::0;::::1;34373:21:1::0;34430:2;34410:18;;;34403:30;34469:27;34449:18;;;34442:55;34514:18;;15725:58:0::1;34189:349:1::0;13578:105:0;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;13643:32:::1;13670:3;13643:18;:32::i;16545:1247::-:0;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;16670:27:::1;:34:::0;:38;;;;:77:::1;;-1:-1:-1::0;16712:24:0::1;:31:::0;:35;;16670:77:::1;16662:121;;;::::0;-1:-1:-1;;;16662:121:0;;32016:2:1;16662:121:0::1;::::0;::::1;31998:21:1::0;32055:2;32035:18;;;32028:30;32094:33;32074:18;;;32067:61;32145:18;;16662:121:0::1;31814:355:1::0;16662:121:0::1;16878:24;:31:::0;16840:27:::1;:34:::0;:69:::1;16832:117;;;;-1:-1:-1::0;;;16832:117:0::1;;;;;;;:::i;:::-;17038:27;::::0;17076:130:::1;17100:24;:31:::0;17096:35;::::1;17076:130;;;17176:24;17201:1;17176:27;;;;;;;;:::i;:::-;;;;;;;;;17153:50;;;;;:::i;:::-;::::0;-1:-1:-1;17133:3:0;::::1;::::0;::::1;:::i;:::-;;;;17076:130;;;;17224:19;17247:4;17224:27;17216:78;;;;-1:-1:-1::0;;;17216:78:0::1;;;;;;;:::i;:::-;17462:21;17442:17;17546:239;17570:27;:34:::0;17566:38;::::1;17546:239;;;17626:22;17696:4;17665:24;17690:1;17665:27;;;;;;;;:::i;:::-;;;;;;;;;17653:9;:39;;;;:::i;:::-;17652:48;;;;:::i;:::-;17626:75;;17716:57;17726:27;17754:1;17726:30;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;17726:30:0::1;17758:14:::0;17716:9:::1;:57::i;:::-;-1:-1:-1::0;17606:3:0;::::1;::::0;::::1;:::i;:::-;;;;17546:239;;28341:478:::0;20659:10;20673:9;20659:23;20651:55;;;;-1:-1:-1;;;20651:55:0;;;;;;;:::i;:::-;21050:21:::1;::::0;::::1;;:62:::0;::::1;;;;21097:15;21075:18;;:37;;21050:62;21042:123;;;;-1:-1:-1::0;;;21042:123:0::1;;;;;;;:::i;:::-;28468:24:::2;28473:10;28485:6;;28468:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;28468:4:0::2;::::0;-1:-1:-1;;;28468:24:0:i:2;:::-;28460:65;;;::::0;-1:-1:-1;;;28460:65:0;;29076:2:1;28460:65:0::2;::::0;::::2;29058:21:1::0;29115:2;29095:18;;;29088:30;-1:-1:-1;;;29134:18:1;;;29127:45;29189:18;;28460:65:0::2;28874:339:1::0;28460:65:0::2;28562:10;28544:29;::::0;;;:17:::2;:29;::::0;;;;;:34;28536:85:::2;;;::::0;-1:-1:-1;;;28536:85:0;;22514:2:1;28536:85:0::2;::::0;::::2;22496:21:1::0;22553:2;22533:18;;;22526:30;22592:26;22572:18;;;22565:54;22636:18;;28536:85:0::2;22312:348:1::0;28536:85:0::2;28652:10;28634:29;::::0;;;:17:::2;:29;::::0;;;;:31;;;::::2;::::0;::::2;:::i;:::-;;;;;;28682:12;28678:134;;;28711:32;28729:10;28741:1;28711:17;:32::i;28678:134::-;28776:24;28786:10;28798:1;28776:9;:24::i;23663:109::-:0;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;23737:27:::1;23752:11;12346::::0;:25;12273:106;23737:27:::1;23663:109:::0;:::o;22690:92::-;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;22754:3:::1;:20:::0;;-1:-1:-1;;;;;;22754:20:0::1;-1:-1:-1::0;;;;;22754:20:0;;;::::1;::::0;;;::::1;::::0;;22690:92::o;16386:124::-;16442:16;16478:24;16471:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16386:124;:::o;254:20::-;;;;;;;:::i;24665:422::-;24792:26;;-1:-1:-1;;14282:2:1;14278:15;;;14274:53;24792:26:0;;;14262:66:1;24749:4:0;;;;14344:12:1;;24792:26:0;;;;;;;;;;;;24782:37;;;;;;24766:53;;24835:9;24830:210;24854:6;:13;24850:1;:17;24830:210;;;24905:6;24912:1;24905:9;;;;;;;;:::i;:::-;;;;;;;24897:5;:17;:131;;25010:6;25017:1;25010:9;;;;;;;;:::i;:::-;;;;;;;25021:5;24993:34;;;;;;;;14524:19:1;;;14568:2;14559:12;;14552:28;14605:2;14596:12;;14367:247;24993:34:0;;;;;;;;;;;;;24983:45;;;;;;24897:131;;;24944:5;24951:6;24958:1;24951:9;;;;;;;;:::i;:::-;;;;;;;24927:34;;;;;;;;14524:19:1;;;14568:2;14559:12;;14552:28;14605:2;14596:12;;14367:247;24927:34:0;;;;;;;;;;;;;24917:45;;;;;;24897:131;24889:139;-1:-1:-1;24869:3:0;;;;:::i;:::-;;;;24830:210;;;-1:-1:-1;25066:13:0;;25057:22;;24665:422;-1:-1:-1;;;24665:422:0:o;5861:148::-;5949:52;5968:10;5980:9;5991;5949:18;:52::i;29610:456::-;20659:10;20673:9;20659:23;20651:55;;;;-1:-1:-1;;;20651:55:0;;;;;;;:::i;:::-;21634:18:::1;::::0;::::1;;:56:::0;::::1;;;;21675:15;21656;;:34;;21634:56;21626:114;;;::::0;-1:-1:-1;;;21626:114:0;;32376:2:1;21626:114:0::1;::::0;::::1;32358:21:1::0;32415:2;32395:18;;;32388:30;32454:33;32434:18;;;32427:61;32505:18;;21626:114:0::1;32174:355:1::0;21626:114:0::1;29753:7:::2;29736:13;;:24;;29728:76;;;::::0;-1:-1:-1;;;29728:76:0;;29420:2:1;29728:76:0::2;::::0;::::2;29402:21:1::0;29459:2;29439:18;;;29432:30;29498:28;29478:18;;;29471:56;29544:18;;29728:76:0::2;29218:350:1::0;29728:76:0::2;29848:7;29836:9;;:19;;;;:::i;:::-;29823:9;:32;29815:77;;;::::0;-1:-1:-1;;;29815:77:0;;24051:2:1;29815:77:0::2;::::0;::::2;24033:21:1::0;24090:2;24070:18;;;24063:30;-1:-1:-1;;;24109:18:1;;;24102:49;24168:18;;29815:77:0::2;23849:343:1::0;29815:77:0::2;29917:12;29913:146;;;29946:38;29964:10;29976:7;29946:17;:38::i;29913:146::-;30017:30;30027:10;30039:7;30017:9;:30::i;24548:111::-:0;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;24624:13:::1;:27:::0;24548:111::o;14290:135::-;14209:24;;-1:-1:-1;;;;;14209:24:0;14195:10;:38;14187:91;;;;-1:-1:-1;;;14187:91:0;;;;;;;:::i;:::-;14383:24:::1;:39:::0;;-1:-1:-1;;;;;;14383:39:0::1;::::0;;14290:135::o;6352:507::-;6470:34;6483:5;6490:3;6495:8;6470:12;:34::i;:::-;-1:-1:-1;;;;;6519:15:0;;;:20;6515:337;;6559:22;6585:3;-1:-1:-1;;;;;6585:14:0;6623:10;6635;6647:5;6654:8;6664:5;6600:70;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6600:70:0;;;;;;;;;;;6585:86;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6556:115;;;6686:16;6716:9;6705:31;;;;;;;;;;;;:::i;:::-;6686:50;-1:-1:-1;;;;;;;;;;6759:23:0;;;6751:89;;;;-1:-1:-1;;;6751:89:0;;26746:2:1;6751:89:0;;;26728:21:1;26785:2;26765:18;;;26758:30;26824:34;26804:18;;;26797:62;-1:-1:-1;;;26875:18:1;;;26868:51;26936:19;;6751:89:0;26544:417:1;6515:337:0;6352:507;;;;:::o;1259:121::-;1316:4;1340:18;;;:8;:18;;;;;:28;-1:-1:-1;;;1340:28:0;;;;:32;;;1259:121::o;23800:116::-;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;21527:18;:26;;-1:-1:-1;;21527:26:0;;;;;;;21555:15;:23;;;23521:115;;:::o;7756:281::-;7821:13;7884:3;7855:17;7863:8;7855:7;:17::i;:::-;-1:-1:-1;;;;;7855:33:0;;;7847:87;;;;-1:-1:-1;;;7847:87:0;;34745:2:1;7847:87:0;;;34727:21:1;34784:2;34764:18;;;34757:30;34823:34;34803:18;;;34796:62;-1:-1:-1;;;34874:18:1;;;34867:39;34923:19;;7847:87:0;34543:405:1;7847:87:0;7976:12;7990:19;8000:8;7990:9;:19::i;:::-;8011:16;7959:69;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7945:84;;7756:281;;;:::o;21178:143::-;21256:21;;21232:4;;21256:21;;:62;;;;;21303:15;21281:18;;:37;;21249:69;;21178:143;:::o;23273:108::-;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;23348:13:::1;:25:::0;23273:108::o;19944:136::-;19628:19;;19658:197;19682:27;:34;19678:38;;19658:197;;;19756:27;19784:1;19756:30;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;19756:30:0;19742:10;:44;19738:106;;;19824:4;19807:21;;19738:106;19718:3;;;;:::i;:::-;;;;19658:197;;;;19873:14;19865:53;;;;-1:-1:-1;;;19865:53:0;;24399:2:1;19865:53:0;;;24381:21:1;24438:2;24418:18;;;24411:30;24477:28;24457:18;;;24450:56;24523:18;;19865:53:0;24197:350:1;19865:53:0;-1:-1:-1;20054:10:0::1;20027:38;::::0;;;:26:::1;:38;::::0;;;;:45;;-1:-1:-1;;20027:45:0::1;20068:4;20027:45;::::0;;19944:136::o;20375:137::-;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;20155:9:::1;20150:200;20174:27;:34:::0;20170:38;::::1;20150:200;;;20238:26;:58;20265:27;20293:1;20265:30;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;20265:30:0::1;20238:58:::0;;;::::1;::::0;;;;;;;;;::::1;;20230:108;;;::::0;-1:-1:-1;;;20230:108:0;;27168:2:1;20230:108:0::1;::::0;::::1;27150:21:1::0;27207:2;27187:18;;;27180:30;27246:34;27226:18;;;27219:62;-1:-1:-1;;;27297:18:1;;;27290:35;27342:19;;20230:108:0::1;26966:401:1::0;20230:108:0::1;20210:3:::0;::::1;::::0;::::1;:::i;:::-;;;;20150:200;;;;20451:53:::2;20469:10;20482:21;20451:9;:53::i;26956:263::-:0;22849:3;;-1:-1:-1;;;;;22849:3:0;22827:10;:26;22819:58;;;;-1:-1:-1;;;22819:58:0;;;;;;;:::i;:::-;27044:9:::1;27039:173;27059:20:::0;;::::1;27039:173;;;27101:20;27108:9;;27118:1;27108:12;;;;;;;:::i;:::-;;;;;;;27101:6;:20::i;:::-;27187:9;;27197:1;27187:12;;;;;;;:::i;:::-;27181:3;::::0;27187:12:::1;::::0;;::::1;::::0;;;::::1;;::::0;-1:-1:-1;;;;;27181:3:0::1;::::0;-1:-1:-1;27150:21:0::1;27158:9:::0;;27168:1;27158:12;;::::1;;;;;:::i;:::-;;;;;;;27150:7;:21::i;:::-;-1:-1:-1::0;;;;;27141:59:0::1;-1:-1:-1::0;;;;;;;;;;;27141:59:0::1;;;;;;;;;27081:3:::0;::::1;::::0;::::1;:::i;:::-;;;;27039:173;;8850:461:::0;9000:11;;8930:7;;;;;9048:17;:15;:17::i;:::-;9022:43;-1:-1:-1;9022:43:0;9078:198;9117:30;9132:15;9117:12;:30;:::i;:::-;9112:1;:35;9078:198;;9173:11;;;;:8;:11;;;;;:17;-1:-1:-1;;;;;9173:29:0;;;:17;;:29;:45;;;;;9207:11;9216:1;9207:8;:11::i;:::-;9206:12;9173:45;9169:96;;;9239:10;;;;:::i;:::-;;;;9169:96;9149:3;;;;:::i;:::-;;;;9078:198;;16242:138;16301:24;16345:27;16338:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16338:34:0;;;;;;;;;;;;;;;;;;;;;;16242:138;:::o;26535:409::-;26650:4;;26667:248;26687:20;;;26667:248;;;26729:35;26767:8;:22;26776:9;;26786:1;26776:12;;;;;;;:::i;:::-;;;;;;;;;;26767:22;;-1:-1:-1;26767:22:0;;;;;;;;;;;-1:-1:-1;26767:22:0;26729:60;;;;;;;;;-1:-1:-1;;;;;26729:60:0;;;;;;-1:-1:-1;;;26729:60:0;;;;;;;;;;;;;;-1:-1:-1;26808:30:0;;;;;;:81;;-1:-1:-1;26860:24:0;;;;:29;;;26808:81;26804:99;;;26898:5;26891:12;;;;;;26804:99;-1:-1:-1;26709:3:0;;;;:::i;:::-;;;;26667:248;;;;26932:4;26925:11;;26535:409;;;;;;:::o;26251:278::-;26360:4;;26377:123;26397:20;;;26377:123;;;26453:21;26461:9;;26471:1;26461:12;;;;;;;:::i;26453:21::-;-1:-1:-1;;;;;26443:31:0;:6;-1:-1:-1;;;;;26443:31:0;;26439:49;;26483:5;26476:12;;;;;26439:49;26419:3;;;;:::i;:::-;;;;26377:123;;13365:207;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13455:25:0;::::1;13447:77;;;::::0;-1:-1:-1;;;13447:77:0;;20532:2:1;13447:77:0::1;::::0;::::1;20514:21:1::0;20571:2;20551:18;;;20544:30;20610:34;20590:18;;;20583:62;-1:-1:-1;;;20661:18:1;;;20654:37;20708:19;;13447:77:0::1;20330:403:1::0;13447:77:0::1;13535:29;13554:9;13535:18;:29::i;7058:228::-:0;7172:9;7167:112;7191:9;:16;7187:1;:20;7167:112;;;7229:38;7242:5;7249:3;7254:9;7264:1;7254:12;;;;;;;;:::i;:::-;;;;;;;7229;:38::i;:::-;7209:3;;;;:::i;:::-;;;;7167:112;;23049:102;13079:5;;-1:-1:-1;;;;;13079:5:0;13088:10;13079:19;13071:64;;;;-1:-1:-1;;;13071:64:0;;;;;;;:::i;:::-;23121:9:::1;:22:::0;23049:102::o;28860:712::-;20659:10;20673:9;20659:23;20651:55;;;;-1:-1:-1;;;20651:55:0;;;;;;;:::i;:::-;21050:21:::1;::::0;::::1;;:62:::0;::::1;;;;21097:15;21075:18;;:37;;21050:62;21042:123;;;;-1:-1:-1::0;;;21042:123:0::1;;;;;;;:::i;:::-;29017:33:::2;29031:10;29043:6;;29017:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;29017:13:0::2;::::0;-1:-1:-1;;;29017:33:0:i:2;:::-;29009:83;;;::::0;-1:-1:-1;;;29009:83:0;;23271:2:1;29009:83:0::2;::::0;::::2;23253:21:1::0;23310:2;23290:18;;;23283:30;23349:26;23329:18;;;23322:54;23393:18;;29009:83:0::2;23069:348:1::0;29009:83:0::2;29145:10;29128:28;::::0;;;:16:::2;:28;::::0;;;;;:38:::2;::::0;29159:7;;29128:38:::2;:::i;:::-;29111:13;;:55;;29103:118;;;::::0;-1:-1:-1;;;29103:118:0;;21284:2:1;29103:118:0::2;::::0;::::2;21266:21:1::0;21323:2;21303:18;;;21296:30;21362:34;21342:18;;;21335:62;-1:-1:-1;;;21413:18:1;;;21406:35;21458:19;;29103:118:0::2;21082:401:1::0;29103:118:0::2;29265:7;29253:9;;:19;;;;:::i;:::-;29240:9;:32;29232:77;;;::::0;-1:-1:-1;;;29232:77:0;;24051:2:1;29232:77:0::2;::::0;::::2;24033:21:1::0;24090:2;24070:18;;;24063:30;-1:-1:-1;;;24109:18:1;;;24102:49;24168:18;;29232:77:0::2;23849:343:1::0;29232:77:0::2;29384:10;29367:28;::::0;;;:16:::2;:28;::::0;;;;:39;;29399:7;;29367:28;:39:::2;::::0;29399:7;;29367:39:::2;:::i;:::-;::::0;;;-1:-1:-1;;29419:146:0;::::2;;;29452:38;29470:10;29482:7;29452:17;:38::i;:::-;29419:146;;;29523:30;29533:10;29545:7;29523:9;:30::i;4200:109::-:0;4278:23;;;;:16;;:23;;;;;:::i;25567:557::-;25679:7;25665:11;;:21;;;;:::i;:::-;25652:9;;:34;;25644:88;;;;-1:-1:-1;;;25644:88:0;;31659:2:1;25644:88:0;;;31641:21:1;31698:2;31678:18;;;31671:30;31737;31717:18;;;31710:58;31785:18;;25644:88:0;31457:352:1;25644:88:0;25753:16;25772:11;;25786:1;25772:15;;;;:::i;:::-;25753:34;;25823:9;25818:266;25842:7;25838:1;:11;25818:266;;;25871:24;25877:3;25882:12;25893:1;25882:8;:12;:::i;:::-;25871:5;:24::i;:::-;25910:20;25917:12;25928:1;25917:8;:12;:::i;:::-;25910:6;:20::i;:::-;25992:12;26003:1;25992:8;:12;:::i;:::-;25986:3;;25964:41;;-1:-1:-1;;;;;25986:3:0;;;;25964:41;;;-1:-1:-1;;;;;;;;;;;25964:41:0;25986:3;;25964:41;26020:3;;-1:-1:-1;;;;;26020:3:0;:33;26054:3;26059:12;26070:1;26059:8;:12;:::i;:::-;26020:52;;-1:-1:-1;;;;;;26020:52:0;;;;;;;-1:-1:-1;;;;;16462:32:1;;;26020:52:0;;;16444:51:1;16511:18;;;16504:34;16417:18;;26020:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25851:3;;;;;:::i;:::-;;;;25818:266;;;;26109:7;26094:11;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;25567:557:0:o;25185:376::-;25289:7;25275:11;;:21;;;;:::i;:::-;25262:9;;:34;;25254:88;;;;-1:-1:-1;;;25254:88:0;;31659:2:1;25254:88:0;;;31641:21:1;31698:2;31678:18;;;31671:30;31737;31717:18;;;31710:58;31785:18;;25254:88:0;31457:352:1;25254:88:0;25367:16;25386:11;;25400:1;25386:15;;;;:::i;:::-;25367:34;;25437:9;25432:89;25456:7;25452:1;:11;25432:89;;;25485:24;25491:3;25496:12;25507:1;25496:8;:12;:::i;25485:24::-;25465:3;;;;:::i;:::-;;;;25432:89;;3501:234;3582:21;;;;:11;:21;;;;;;-1:-1:-1;;;;;3582:28:0;;;:21;;:28;3578:150;;3627:21;;;;:11;:21;;;;;:27;;-1:-1:-1;;;;;;3627:27:0;-1:-1:-1;;;;;3627:27:0;;;;;;;;:21;;3683:17;3627:21;3683:7;:17::i;:::-;-1:-1:-1;;;;;3674:42:0;;;;;;;;;;;3501:234;;:::o;4948:376::-;5043:4;;5068:17;5076:8;5068:7;:17::i;:::-;-1:-1:-1;;;;;5068:33:0;;;5060:98;;;;-1:-1:-1;;;5060:98:0;;30890:2:1;5060:98:0;;;30872:21:1;30929:2;30909:18;;;30902:30;30968:34;30948:18;;;30941:62;-1:-1:-1;;;31019:18:1;;;31012:50;31079:19;;5060:98:0;30688:416:1;5060:98:0;5169:14;5186:17;5194:8;5186:7;:17::i;:::-;5169:34;;5234:6;-1:-1:-1;;;;;5222:18:0;:8;-1:-1:-1;;;;;5222:18:0;;:55;;;-1:-1:-1;5256:21:0;;;;:11;:21;;;;;;-1:-1:-1;;;;;5244:33:0;;;5256:21;;5244:33;5222:55;:93;;;-1:-1:-1;;;;;;5281:24:0;;;;;;;:16;:24;;;;;;;;:34;;;;;;;;;;;;5222:93;5214:102;4948:376;-1:-1:-1;;;;4948:376:0:o;2934:543::-;3044:17;3052:8;3044:7;:17::i;:::-;-1:-1:-1;;;;;3035:26:0;:5;-1:-1:-1;;;;;3035:26:0;;3027:88;;;;-1:-1:-1;;;3027:88:0;;25925:2:1;3027:88:0;;;25907:21:1;25964:2;25944:18;;;25937:30;26003:34;25983:18;;;25976:62;-1:-1:-1;;;26054:18:1;;;26047:47;26111:19;;3027:88:0;25723:413:1;3027:88:0;-1:-1:-1;;;;;3134:19:0;;3126:78;;;;-1:-1:-1;;;3126:78:0;;21690:2:1;3126:78:0;;;21672:21:1;21729:2;21709:18;;;21702:30;21768:34;21748:18;;;21741:62;-1:-1:-1;;;21819:18:1;;;21812:44;21873:19;;3126:78:0;21488:410:1;3126:78:0;3254:3;3221:21;;;:11;:21;;;;;;-1:-1:-1;;;;;3221:21:0;:37;3217:104;;3276:32;3293:3;3299:8;3276;:32::i;:::-;3334:18;;;;:8;:18;;;;;;;;:30;;-1:-1:-1;;;;;;3334:30:0;-1:-1:-1;;;;;3334:30:0;;;;;;;;;;3376:16;;;;:9;:16;;;;;:18;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;3405:14:0;;;;;;:9;:14;;;;;:16;;;;;;:::i;:::-;;;;;;3460:8;3455:3;-1:-1:-1;;;;;3439:30:0;3448:5;-1:-1:-1;;;;;3439:30:0;-1:-1:-1;;;;;;;;;;;3439:30:0;;;;;;;;;2934:543;;;:::o;4093:101::-;4167:19;;;;:12;;:19;;;;;:::i;2172:301::-;2273:1;2244:17;2252:8;2244:7;:17::i;:::-;-1:-1:-1;;;;;2244:31:0;;;2236:89;;;;-1:-1:-1;;;2236:89:0;;27574:2:1;2236:89:0;;;27556:21:1;;;27593:18;;;27586:30;27652:34;27632:18;;;27625:62;27704:18;;2236:89:0;27372:356:1;2236:89:0;2344:18;2353:8;2344;:18::i;:::-;2336:76;;;;-1:-1:-1;;;2336:76:0;;29775:2:1;2336:76:0;;;29757:21:1;;;29794:18;;;29787:30;29853:34;29833:18;;;29826:62;29905:18;;2336:76:0;29573:356:1;2336:76:0;2464:1;2433:18;;;:8;:18;;;;;:32;;-1:-1:-1;;;;2433:32:0;;;2172:301::o;1848:312::-;1948:1;1919:17;1927:8;1919:7;:17::i;:::-;-1:-1:-1;;;;;1919:31:0;;;1911:88;;;;-1:-1:-1;;;1911:88:0;;28716:2:1;1911:88:0;;;28698:21:1;28755:2;28735:18;;;28728:30;28794:33;28774:18;;;28767:61;28845:18;;1911:88:0;28514:355:1;1911:88:0;2018:18;2027:8;2018;:18::i;:::-;2010:75;;;;-1:-1:-1;;;2010:75:0;;20172:2:1;2010:75:0;;;20154:21:1;20211:2;20191:18;;;20184:30;20250:33;20230:18;;;20223:61;20301:18;;2010:75:0;19970:355:1;2010:75:0;2098:18;;;;:8;:18;;;;;:54;;-1:-1:-1;;;;2098:54:0;-1:-1:-1;;;2136:15:0;2098:54;;;;;;1848:312::o;13161:198::-;13256:5;;;-1:-1:-1;;;;;13272:17:0;;;-1:-1:-1;;;;;;13272:17:0;;;;;;;13305:42;;13256:5;;;13272:17;13256:5;;13305:42;;13236:17;;13305:42;13225:134;13161:198;:::o;14825:197::-;14908:12;14934:8;-1:-1:-1;;;;;14926:22:0;14956:7;14926:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14907:61;;;14987:7;14979:35;;;;-1:-1:-1;;;14979:35:0;;20940:2:1;14979:35:0;;;20922:21:1;20979:2;20959:18;;;20952:30;-1:-1:-1;;;20998:18:1;;;20991:45;21053:18;;14979:35:0;20738:339:1;3741:326:0;3866:9;-1:-1:-1;;;;;3856:19:0;:6;-1:-1:-1;;;;;3856:19:0;;;3848:93;;;;-1:-1:-1;;;3848:93:0;;33961:2:1;3848:93:0;;;33943:21:1;34000:2;33980:18;;;33973:30;34039:34;34019:18;;;34012:62;34110:31;34090:18;;;34083:59;34159:19;;3848:93:0;33759:425:1;3848:93:0;-1:-1:-1;;;;;3952:24:0;;;;;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;:47;;-1:-1:-1;;3952:47:0;;;;;;;;;;4015:44;;18301:41:1;;;4015:44:0;;18274:18:1;4015:44:0;;;;;;;3741:326;;;:::o;4379:536::-;4437:13;4467:11;4463:32;;-1:-1:-1;;4482:10:0;;;;;;;;;;;;-1:-1:-1;;;4482:10:0;;;;;4379:536::o;4463:32::-;4524:6;4505:16;4558:52;4565:13;;4558:52;;4582:9;;;;:::i;:::-;;-1:-1:-1;4593:14:0;;-1:-1:-1;4605:2:0;4593:14;;:::i;:::-;;;4558:52;;;4644:20;4677:7;-1:-1:-1;;;;;4667:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4667:18:0;;4644:41;;4696:110;4703:11;;4696:110;;4718:9;;;;:::i;:::-;;-1:-1:-1;4774:11:0;;-1:-1:-1;4783:2:0;4774:6;:11;:::i;:::-;4761:26;;:2;:26;:::i;:::-;4748:41;;4729:7;4737;4729:16;;;;;;;;:::i;:::-;;;;:60;-1:-1:-1;;;;;4729:60:0;;;;;;;;-1:-1:-1;4791:12:0;4801:2;4791:12;;:::i;:::-;;;4696:110;;1526:314;1625:1;1596:17;1604:8;1596:7;:17::i;:::-;-1:-1:-1;;;;;1596:31:0;;;1588:87;;;;-1:-1:-1;;;1588:87:0;;19409:2:1;1588:87:0;;;19391:21:1;19448:2;19428:18;;;19421:30;19487:32;19467:18;;;19460:60;19537:18;;1588:87:0;19207:354:1;1588:87:0;1695:18;1704:8;1695;:18::i;:::-;1694:19;1686:79;;;;-1:-1:-1;;;1686:79:0;;33151:2:1;1686:79:0;;;33133:21:1;33190:2;33170:18;;;33163:30;33229:34;33209:18;;;33202:62;-1:-1:-1;;;33280:18:1;;;33273:32;33322:19;;1686:79:0;32949:398:1;2530:379:0;-1:-1:-1;;;;;2612:19:0;;2604:69;;;;-1:-1:-1;;;2604:69:0;;30136:2:1;2604:69:0;;;30118:21:1;30175:2;30155:18;;;30148:30;30214:34;30194:18;;;30187:62;-1:-1:-1;;;30265:18:1;;;30258:35;30310:19;;2604:69:0;29934:401:1;2604:69:0;2721:3;2692:17;2700:8;2692:7;:17::i;:::-;-1:-1:-1;;;;;2692:33:0;;2684:92;;;;-1:-1:-1;;;2684:92:0;;32736:2:1;2684:92:0;;;32718:21:1;32775:2;32755:18;;;32748:30;32814:34;32794:18;;;32787:62;-1:-1:-1;;;32865:18:1;;;32858:44;32919:19;;2684:92:0;32534:410:1;2684:92:0;-1:-1:-1;;;;;2789:14:0;;;;;;:9;:14;;;;;:16;;;;;;:::i;:::-;;;;-1:-1:-1;;2816:18:0;;;;:8;:18;;;;;;:30;;-1:-1:-1;;;;;;2816:30:0;-1:-1:-1;;;;;2816:30:0;;;;;;;;2864:37;;2816:18;;;-1:-1:-1;;;;;;;;;;;2864:37:0;2816:18;;2864:37;2530:379;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:367:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:1;;-1:-1:-1;;;;;214:30:1;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:681::-;440:5;493:3;486:4;478:6;474:17;470:27;460:55;;511:1;508;501:12;460:55;547:6;534:20;573:4;597:68;613:51;661:2;613:51;:::i;:::-;597:68;:::i;:::-;687:3;711:2;706:3;699:15;739:2;734:3;730:12;723:19;;774:2;766:6;762:15;826:3;821:2;815;812:1;808:10;800:6;796:23;792:32;789:41;786:61;;;843:1;840;833:12;786:61;865:1;875:163;889:2;886:1;883:9;875:163;;;946:17;;934:30;;984:12;;;;1016;;;;907:1;900:9;875:163;;;-1:-1:-1;1056:5:1;;386:681;-1:-1:-1;;;;;;;386:681:1:o;1072:160::-;1137:20;;1193:13;;1186:21;1176:32;;1166:60;;1222:1;1219;1212:12;1237:530;1279:5;1332:3;1325:4;1317:6;1313:17;1309:27;1299:55;;1350:1;1347;1340:12;1299:55;1386:6;1373:20;-1:-1:-1;;;;;1408:2:1;1405:26;1402:52;;;1434:18;;:::i;:::-;1478:55;1521:2;1502:13;;-1:-1:-1;;1498:27:1;1527:4;1494:38;1478:55;:::i;:::-;1558:2;1549:7;1542:19;1604:3;1597:4;1592:2;1584:6;1580:15;1576:26;1573:35;1570:55;;;1621:1;1618;1611:12;1570:55;1686:2;1679:4;1671:6;1667:17;1660:4;1651:7;1647:18;1634:55;1734:1;1709:16;;;1727:4;1705:27;1698:38;;;;1713:7;1237:530;-1:-1:-1;;;1237:530:1:o;1772:247::-;1831:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:52;;;1900:1;1897;1890:12;1852:52;1939:9;1926:23;1958:31;1983:5;1958:31;:::i;2024:388::-;2092:6;2100;2153:2;2141:9;2132:7;2128:23;2124:32;2121:52;;;2169:1;2166;2159:12;2121:52;2208:9;2195:23;2227:31;2252:5;2227:31;:::i;:::-;2277:5;-1:-1:-1;2334:2:1;2319:18;;2306:32;2347:33;2306:32;2347:33;:::i;:::-;2399:7;2389:17;;;2024:388;;;;;:::o;2417:624::-;2519:6;2527;2535;2588:2;2576:9;2567:7;2563:23;2559:32;2556:52;;;2604:1;2601;2594:12;2556:52;2643:9;2630:23;2662:31;2687:5;2662:31;:::i;:::-;2712:5;-1:-1:-1;2769:2:1;2754:18;;2741:32;2782:33;2741:32;2782:33;:::i;:::-;2834:7;-1:-1:-1;2892:2:1;2877:18;;2864:32;-1:-1:-1;;;;;2908:30:1;;2905:50;;;2951:1;2948;2941:12;2905:50;2974:61;3027:7;3018:6;3007:9;3003:22;2974:61;:::i;:::-;2964:71;;;2417:624;;;;;:::o;3046:844::-;3166:6;3174;3182;3190;3243:3;3231:9;3222:7;3218:23;3214:33;3211:53;;;3260:1;3257;3250:12;3211:53;3299:9;3286:23;3318:31;3343:5;3318:31;:::i;:::-;3368:5;-1:-1:-1;3425:2:1;3410:18;;3397:32;3438:33;3397:32;3438:33;:::i;:::-;3490:7;-1:-1:-1;3548:2:1;3533:18;;3520:32;-1:-1:-1;;;;;3601:14:1;;;3598:34;;;3628:1;3625;3618:12;3598:34;3651:61;3704:7;3695:6;3684:9;3680:22;3651:61;:::i;:::-;3641:71;;3765:2;3754:9;3750:18;3737:32;3721:48;;3794:2;3784:8;3781:16;3778:36;;;3810:1;3807;3800:12;3778:36;;3833:51;3876:7;3865:8;3854:9;3850:24;3833:51;:::i;:::-;3823:61;;;3046:844;;;;;;;:::o;3895:456::-;3972:6;3980;3988;4041:2;4029:9;4020:7;4016:23;4012:32;4009:52;;;4057:1;4054;4047:12;4009:52;4096:9;4083:23;4115:31;4140:5;4115:31;:::i;:::-;4165:5;-1:-1:-1;4222:2:1;4207:18;;4194:32;4235:33;4194:32;4235:33;:::i;:::-;3895:456;;4287:7;;-1:-1:-1;;;4341:2:1;4326:18;;;;4313:32;;3895:456::o;4356:665::-;4451:6;4459;4467;4475;4528:3;4516:9;4507:7;4503:23;4499:33;4496:53;;;4545:1;4542;4535:12;4496:53;4584:9;4571:23;4603:31;4628:5;4603:31;:::i;:::-;4653:5;-1:-1:-1;4710:2:1;4695:18;;4682:32;4723:33;4682:32;4723:33;:::i;:::-;4775:7;-1:-1:-1;4829:2:1;4814:18;;4801:32;;-1:-1:-1;4884:2:1;4869:18;;4856:32;-1:-1:-1;;;;;4900:30:1;;4897:50;;;4943:1;4940;4933:12;4897:50;4966:49;5007:7;4998:6;4987:9;4983:22;4966:49;:::i;5026:1045::-;5119:6;5127;5180:2;5168:9;5159:7;5155:23;5151:32;5148:52;;;5196:1;5193;5186:12;5148:52;5235:9;5222:23;5254:31;5279:5;5254:31;:::i;:::-;5304:5;-1:-1:-1;5328:2:1;5366:18;;;5353:32;-1:-1:-1;;;;;5397:30:1;;5394:50;;;5440:1;5437;5430:12;5394:50;5463:22;;5516:4;5508:13;;5504:27;-1:-1:-1;5494:55:1;;5545:1;5542;5535:12;5494:55;5581:2;5568:16;5604:68;5620:51;5668:2;5620:51;:::i;5604:68::-;5694:3;5718:2;5713:3;5706:15;5746:2;5741:3;5737:12;5730:19;;5777:2;5773;5769:11;5825:7;5820:2;5814;5811:1;5807:10;5803:2;5799:19;5795:28;5792:41;5789:61;;;5846:1;5843;5836:12;5789:61;5868:1;5859:10;;5878:163;5892:2;5889:1;5886:9;5878:163;;;5949:17;;5937:30;;5910:1;5903:9;;;;;5987:12;;;;6019;;5878:163;;;5882:3;6060:5;6050:15;;;;;;;5026:1045;;;;;:::o;6076:572::-;6171:6;6179;6187;6240:2;6228:9;6219:7;6215:23;6211:32;6208:52;;;6256:1;6253;6246:12;6208:52;6295:9;6282:23;6314:31;6339:5;6314:31;:::i;:::-;6364:5;-1:-1:-1;6420:2:1;6405:18;;6392:32;-1:-1:-1;;;;;6436:30:1;;6433:50;;;6479:1;6476;6469:12;6433:50;6518:70;6580:7;6571:6;6560:9;6556:22;6518:70;:::i;:::-;6076:572;;6607:8;;-1:-1:-1;6492:96:1;;-1:-1:-1;;;;6076:572:1:o;6653:315::-;6718:6;6726;6779:2;6767:9;6758:7;6754:23;6750:32;6747:52;;;6795:1;6792;6785:12;6747:52;6834:9;6821:23;6853:31;6878:5;6853:31;:::i;:::-;6903:5;-1:-1:-1;6927:35:1;6958:2;6943:18;;6927:35;:::i;:::-;6917:45;;6653:315;;;;;:::o;6973:::-;7041:6;7049;7102:2;7090:9;7081:7;7077:23;7073:32;7070:52;;;7118:1;7115;7108:12;7070:52;7157:9;7144:23;7176:31;7201:5;7176:31;:::i;:::-;7226:5;7278:2;7263:18;;;;7250:32;;-1:-1:-1;;;6973:315:1:o;7293:841::-;7421:6;7429;7437;7445;7453;7506:2;7494:9;7485:7;7481:23;7477:32;7474:52;;;7522:1;7519;7512:12;7474:52;7562:9;7549:23;-1:-1:-1;;;;;7632:2:1;7624:6;7621:14;7618:34;;;7648:1;7645;7638:12;7618:34;7687:70;7749:7;7740:6;7729:9;7725:22;7687:70;:::i;:::-;7776:8;;-1:-1:-1;7661:96:1;-1:-1:-1;7864:2:1;7849:18;;7836:32;;-1:-1:-1;7880:16:1;;;7877:36;;;7909:1;7906;7899:12;7877:36;;7948:72;8012:7;8001:8;7990:9;7986:24;7948:72;:::i;:::-;8039:8;;-1:-1:-1;7922:98:1;-1:-1:-1;8093:35:1;;-1:-1:-1;8124:2:1;8109:18;;8093:35;:::i;:::-;8083:45;;7293:841;;;;;;;;:::o;8139:1242::-;8265:6;8273;8326:2;8314:9;8305:7;8301:23;8297:32;8294:52;;;8342:1;8339;8332:12;8294:52;8382:9;8369:23;-1:-1:-1;;;;;8452:2:1;8444:6;8441:14;8438:34;;;8468:1;8465;8458:12;8438:34;8506:6;8495:9;8491:22;8481:32;;8551:7;8544:4;8540:2;8536:13;8532:27;8522:55;;8573:1;8570;8563:12;8522:55;8609:2;8596:16;8631:4;8655:68;8671:51;8719:2;8671:51;:::i;8655:68::-;8745:3;8769:2;8764:3;8757:15;8797:2;8792:3;8788:12;8781:19;;8828:2;8824;8820:11;8876:7;8871:2;8865;8862:1;8858:10;8854:2;8850:19;8846:28;8843:41;8840:61;;;8897:1;8894;8887:12;8840:61;8919:1;8910:10;;8929:238;8943:2;8940:1;8937:9;8929:238;;;9014:3;9001:17;9031:31;9056:5;9031:31;:::i;:::-;9075:18;;8961:1;8954:9;;;;;9113:12;;;;9145;;8929:238;;;-1:-1:-1;9186:5:1;-1:-1:-1;;9229:18:1;;9216:32;;-1:-1:-1;;9260:16:1;;;9257:36;;;9289:1;9286;9279:12;9257:36;;9312:63;9367:7;9356:8;9345:9;9341:24;9312:63;:::i;:::-;9302:73;;;8139:1242;;;;;:::o;9386:505::-;9478:6;9486;9494;9547:2;9535:9;9526:7;9522:23;9518:32;9515:52;;;9563:1;9560;9553:12;9515:52;9603:9;9590:23;-1:-1:-1;;;;;9628:6:1;9625:30;9622:50;;;9668:1;9665;9658:12;9622:50;9707:70;9769:7;9760:6;9749:9;9745:22;9707:70;:::i;:::-;9796:8;;-1:-1:-1;9681:96:1;-1:-1:-1;9850:35:1;;-1:-1:-1;9881:2:1;9866:18;;9850:35;:::i;:::-;9840:45;;9386:505;;;;;:::o;9896:573::-;9997:6;10005;10013;10021;10074:2;10062:9;10053:7;10049:23;10045:32;10042:52;;;10090:1;10087;10080:12;10042:52;10130:9;10117:23;-1:-1:-1;;;;;10155:6:1;10152:30;10149:50;;;10195:1;10192;10185:12;10149:50;10234:70;10296:7;10287:6;10276:9;10272:22;10234:70;:::i;:::-;10323:8;;-1:-1:-1;10208:96:1;-1:-1:-1;;10405:2:1;10390:18;;10377:32;;-1:-1:-1;10428:35:1;10459:2;10444:18;;10428:35;:::i;:::-;10418:45;;9896:573;;;;;;;:::o;10474:437::-;10560:6;10568;10621:2;10609:9;10600:7;10596:23;10592:32;10589:52;;;10637:1;10634;10627:12;10589:52;10677:9;10664:23;-1:-1:-1;;;;;10702:6:1;10699:30;10696:50;;;10742:1;10739;10732:12;10696:50;10781:70;10843:7;10834:6;10823:9;10819:22;10781:70;:::i;:::-;10870:8;;10755:96;;-1:-1:-1;10474:437:1;-1:-1:-1;;;;10474:437:1:o;10916:248::-;10981:6;10989;11042:2;11030:9;11021:7;11017:23;11013:32;11010:52;;;11058:1;11055;11048:12;11010:52;11081:26;11097:9;11081:26;:::i;11169:180::-;11228:6;11281:2;11269:9;11260:7;11256:23;11252:32;11249:52;;;11297:1;11294;11287:12;11249:52;-1:-1:-1;11320:23:1;;11169:180;-1:-1:-1;11169:180:1:o;11354:245::-;11412:6;11465:2;11453:9;11444:7;11440:23;11436:32;11433:52;;;11481:1;11478;11471:12;11433:52;11520:9;11507:23;11539:30;11563:5;11539:30;:::i;11604:249::-;11673:6;11726:2;11714:9;11705:7;11701:23;11697:32;11694:52;;;11742:1;11739;11732:12;11694:52;11774:9;11768:16;11793:30;11817:5;11793:30;:::i;11858:592::-;11929:6;11937;11990:2;11978:9;11969:7;11965:23;11961:32;11958:52;;;12006:1;12003;11996:12;11958:52;12046:9;12033:23;-1:-1:-1;;;;;12116:2:1;12108:6;12105:14;12102:34;;;12132:1;12129;12122:12;12102:34;12170:6;12159:9;12155:22;12145:32;;12215:7;12208:4;12204:2;12200:13;12196:27;12186:55;;12237:1;12234;12227:12;12186:55;12277:2;12264:16;12303:2;12295:6;12292:14;12289:34;;;12319:1;12316;12309:12;12289:34;12364:7;12359:2;12350:6;12346:2;12342:15;12338:24;12335:37;12332:57;;;12385:1;12382;12375:12;12332:57;12416:2;12408:11;;;;;12438:6;;-1:-1:-1;11858:592:1;;-1:-1:-1;;;;11858:592:1:o;12640:248::-;12705:6;12713;12766:2;12754:9;12745:7;12741:23;12737:32;12734:52;;;12782:1;12779;12772:12;12734:52;12818:9;12805:23;12795:33;;12847:35;12878:2;12867:9;12863:18;12847:35;:::i;12893:257::-;12934:3;12972:5;12966:12;12999:6;12994:3;12987:19;13015:63;13071:6;13064:4;13059:3;13055:14;13048:4;13041:5;13037:16;13015:63;:::i;:::-;13132:2;13111:15;-1:-1:-1;;13107:29:1;13098:39;;;;13139:4;13094:50;;12893:257;-1:-1:-1;;12893:257:1:o;13155:973::-;13240:12;;13205:3;;13295:1;13315:18;;;;13368;;;;13395:61;;13449:4;13441:6;13437:17;13427:27;;13395:61;13475:2;13523;13515:6;13512:14;13492:18;13489:38;13486:161;;;13569:10;13564:3;13560:20;13557:1;13550:31;13604:4;13601:1;13594:15;13632:4;13629:1;13622:15;13486:161;13663:18;13690:104;;;;13808:1;13803:319;;;;13656:466;;13690:104;-1:-1:-1;;13723:24:1;;13711:37;;13768:16;;;;-1:-1:-1;13690:104:1;;13803:319;35883:1;35876:14;;;35920:4;35907:18;;13897:1;13911:165;13925:6;13922:1;13919:13;13911:165;;;14003:14;;13990:11;;;13983:35;14046:16;;;;13940:10;;13911:165;;;13915:3;;14105:6;14100:3;14096:16;14089:23;;13656:466;;;;;;;13155:973;;;;:::o;14619:274::-;14748:3;14786:6;14780:13;14802:53;14848:6;14843:3;14836:4;14828:6;14824:17;14802:53;:::i;:::-;14871:16;;;;;14619:274;-1:-1:-1;;14619:274:1:o;14898:456::-;15119:3;15147:38;15181:3;15173:6;15147:38;:::i;:::-;15214:6;15208:13;15230:52;15275:6;15271:2;15264:4;15256:6;15252:17;15230:52;:::i;:::-;15298:50;15340:6;15336:2;15332:15;15324:6;15298:50;:::i;:::-;15291:57;14898:456;-1:-1:-1;;;;;;;14898:456:1:o;15777:488::-;-1:-1:-1;;;;;16046:15:1;;;16028:34;;16098:15;;16093:2;16078:18;;16071:43;16145:2;16130:18;;16123:34;;;16193:3;16188:2;16173:18;;16166:31;;;15971:4;;16214:45;;16239:19;;16231:6;16214:45;:::i;:::-;16206:53;15777:488;-1:-1:-1;;;;;;15777:488:1:o;16845:674::-;17032:2;17084:21;;;17154:13;;17057:18;;;17176:22;;;17003:4;;17032:2;17255:15;;;;17229:2;17214:18;;;17003:4;17298:195;17312:6;17309:1;17306:13;17298:195;;;17377:13;;-1:-1:-1;;;;;17373:39:1;17361:52;;17468:15;;;;17433:12;;;;17409:1;17327:9;17298:195;;;-1:-1:-1;17510:3:1;;16845:674;-1:-1:-1;;;;;;16845:674:1:o;17524:632::-;17695:2;17747:21;;;17817:13;;17720:18;;;17839:22;;;17666:4;;17695:2;17918:15;;;;17892:2;17877:18;;;17666:4;17961:169;17975:6;17972:1;17969:13;17961:169;;;18036:13;;18024:26;;18105:15;;;;18070:12;;;;17997:1;17990:9;17961:169;;18574:219;18723:2;18712:9;18705:21;18686:4;18743:44;18783:2;18772:9;18768:18;18760:6;18743:44;:::i;18798:404::-;19000:2;18982:21;;;19039:2;19019:18;;;19012:30;19078:34;19073:2;19058:18;;19051:62;-1:-1:-1;;;19144:2:1;19129:18;;19122:38;19192:3;19177:19;;18798:404::o;19566:399::-;19768:2;19750:21;;;19807:2;19787:18;;;19780:30;19846:34;19841:2;19826:18;;19819:62;-1:-1:-1;;;19912:2:1;19897:18;;19890:33;19955:3;19940:19;;19566:399::o;26141:398::-;26343:2;26325:21;;;26382:2;26362:18;;;26355:30;26421:34;26416:2;26401:18;;26394:62;-1:-1:-1;;;26487:2:1;26472:18;;26465:32;26529:3;26514:19;;26141:398::o;28153:356::-;28355:2;28337:21;;;28374:18;;;28367:30;28433:34;28428:2;28413:18;;28406:62;28500:2;28485:18;;28153:356::o;30340:343::-;30542:2;30524:21;;;30581:2;30561:18;;;30554:30;-1:-1:-1;;;30615:2:1;30600:18;;30593:49;30674:2;30659:18;;30340:343::o;31109:::-;31311:2;31293:21;;;31350:2;31330:18;;;31323:30;-1:-1:-1;;;31384:2:1;31369:18;;31362:49;31443:2;31428:18;;31109:343::o;33352:402::-;33554:2;33536:21;;;33593:2;33573:18;;;33566:30;33632:34;33627:2;33612:18;;33605:62;-1:-1:-1;;;33698:2:1;33683:18;;33676:36;33744:3;33729:19;;33352:402::o;35334:275::-;35405:2;35399:9;35470:2;35451:13;;-1:-1:-1;;35447:27:1;35435:40;;-1:-1:-1;;;;;35490:34:1;;35526:22;;;35487:62;35484:88;;;35552:18;;:::i;:::-;35588:2;35581:22;35334:275;;-1:-1:-1;35334:275:1:o;35614:191::-;35682:4;-1:-1:-1;;;;;35707:6:1;35704:30;35701:56;;;35737:18;;:::i;:::-;-1:-1:-1;35782:1:1;35778:14;35794:4;35774:25;;35614:191::o;35936:128::-;35976:3;36007:1;36003:6;36000:1;35997:13;35994:39;;;36013:18;;:::i;:::-;-1:-1:-1;36049:9:1;;35936:128::o;36069:120::-;36109:1;36135;36125:35;;36140:18;;:::i;:::-;-1:-1:-1;36174:9:1;;36069:120::o;36194:168::-;36234:7;36300:1;36296;36292:6;36288:14;36285:1;36282:21;36277:1;36270:9;36263:17;36259:45;36256:71;;;36307:18;;:::i;:::-;-1:-1:-1;36347:9:1;;36194:168::o;36367:125::-;36407:4;36435:1;36432;36429:8;36426:34;;;36440:18;;:::i;:::-;-1:-1:-1;36477:9:1;;36367:125::o;36497:258::-;36569:1;36579:113;36593:6;36590:1;36587:13;36579:113;;;36669:11;;;36663:18;36650:11;;;36643:39;36615:2;36608:10;36579:113;;;36710:6;36707:1;36704:13;36701:48;;;-1:-1:-1;;36745:1:1;36727:16;;36720:27;36497:258::o;36760:136::-;36799:3;36827:5;36817:39;;36836:18;;:::i;:::-;-1:-1:-1;;;36872:18:1;;36760:136::o;36901:380::-;36980:1;36976:12;;;;37023;;;37044:61;;37098:4;37090:6;37086:17;37076:27;;37044:61;37151:2;37143:6;37140:14;37120:18;37117:38;37114:161;;;37197:10;37192:3;37188:20;37185:1;37178:31;37232:4;37229:1;37222:15;37260:4;37257:1;37250:15;37114:161;;36901:380;;;:::o;37286:135::-;37325:3;-1:-1:-1;;37346:17:1;;37343:43;;;37366:18;;:::i;:::-;-1:-1:-1;37413:1:1;37402:13;;37286:135::o;37426:112::-;37458:1;37484;37474:35;;37489:18;;:::i;:::-;-1:-1:-1;37523:9:1;;37426:112::o;37543:127::-;37604:10;37599:3;37595:20;37592:1;37585:31;37635:4;37632:1;37625:15;37659:4;37656:1;37649:15;37675:127;37736:10;37731:3;37727:20;37724:1;37717:31;37767:4;37764:1;37757:15;37791:4;37788:1;37781:15;37807:127;37868:10;37863:3;37859:20;37856:1;37849:31;37899:4;37896:1;37889:15;37923:4;37920:1;37913:15;37939:127;38000:10;37995:3;37991:20;37988:1;37981:31;38031:4;38028:1;38021:15;38055:4;38052:1;38045:15;38071:127;38132:10;38127:3;38123:20;38120:1;38113:31;38163:4;38160:1;38153:15;38187:4;38184:1;38177:15;38203:131;-1:-1:-1;;;;;38278:31:1;;38268:42;;38258:70;;38324:1;38321;38314:12;38339:131;-1:-1:-1;;;;;;38413:32:1;;38403:43;;38393:71;;38460:1;38457;38450:12

Swarm Source

ipfs://42d5d33fc25d612eb479449862fe8dc0b09ae4463950a623053c297948b09a4d
Loading...
Loading
Loading...
Loading
[ 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.