ETH Price: $3,441.38 (-1.05%)
Gas: 3 Gwei

Contract

0xBBba5BA03d948d0A4cC010CA03D3b6E1b14f7098
 
Transaction Hash
Method
Block
From
To
Value
Erc20Airdrop202133812024-07-01 18:12:3514 hrs ago1719857555IN
Crypto Multisender
0.00039999 ETH0.0031148711.69159502
Airdrop Native C...201936862024-06-29 0:12:233 days ago1719619943IN
Crypto Multisender
0.05 ETH0.002819731.55321864
Airdrop Native C...201936522024-06-29 0:05:233 days ago1719619523IN
Crypto Multisender
0.025 ETH0.001694941.82226762
Airdrop Native C...201795532024-06-27 0:50:595 days ago1719449459IN
Crypto Multisender
0.01066666 ETH0.001104552.72146639
Airdrop Native C...201794952024-06-27 0:39:235 days ago1719448763IN
Crypto Multisender
0.005 ETH0.000795013.04651149
Erc20Airdrop201769402024-06-26 16:04:355 days ago1719417875IN
Crypto Multisender
0.00026666 ETH0.001899379.0969989
Erc20Airdrop201630912024-06-24 17:39:357 days ago1719250775IN
Crypto Multisender
0.00013333 ETH0.0014764711.01734412
Erc20Airdrop201614752024-06-24 12:14:597 days ago1719231299IN
Crypto Multisender
0.00099999 ETH0.002342354.23913311
Erc20Airdrop201614582024-06-24 12:11:357 days ago1719231095IN
Crypto Multisender
0.00199999 ETH0.004791064.6749832
Airdrop Native C...201545552024-06-23 13:01:598 days ago1719147719IN
Crypto Multisender
0.00385 ETH0.000200833.16484563
Airdrop Native C...201544562024-06-23 12:41:598 days ago1719146519IN
Crypto Multisender
0.004 ETH0.000205182.02128311
Airdrop Native C...201543222024-06-23 12:15:118 days ago1719144911IN
Crypto Multisender
0.00148782 ETH0.000207852.04710895
Erc20Airdrop201407052024-06-21 14:30:2310 days ago1718980223IN
Crypto Multisender
0.00493333 ETH0.0165492312.23918894
Erc20Airdrop201273472024-06-19 17:42:4712 days ago1718818967IN
Crypto Multisender
0 ETH0.0137326612.60254359
Erc20Airdrop201168222024-06-18 6:19:5914 days ago1718691599IN
Crypto Multisender
0.00199999 ETH0.004635674.50909455
Erc20Airdrop201167952024-06-18 6:14:3514 days ago1718691275IN
Crypto Multisender
0.00199999 ETH0.004239974.12420001
Erc20Airdrop201167742024-06-18 6:10:2314 days ago1718691023IN
Crypto Multisender
0.00199999 ETH0.004625744.51362155
Erc20Airdrop201167562024-06-18 6:06:4714 days ago1718690807IN
Crypto Multisender
0.00199999 ETH0.004944394.82448972
Erc20Airdrop201102112024-06-17 8:07:2315 days ago1718611643IN
Crypto Multisender
0.00199999 ETH0.003265653.18642529
Airdrop Native C...200859642024-06-13 22:46:4718 days ago1718318807IN
Crypto Multisender
0.00378741 ETH0.000504017.9805468
Airdrop Native C...200859542024-06-13 22:44:3518 days ago1718318675IN
Crypto Multisender
0.005 ETH0.001103278.67367793
Erc20Airdrop200806602024-06-13 4:56:3519 days ago1718254595IN
Crypto Multisender
0.00133333 ETH0.0073592510.31890342
Erc20Airdrop200806462024-06-13 4:53:4719 days ago1718254427IN
Crypto Multisender
0.00133333 ETH0.0076621710.74365288
Erc20Airdrop200806352024-06-13 4:51:3519 days ago1718254295IN
Crypto Multisender
0.00133333 ETH0.0078922611.06589158
Erc20Airdrop200806122024-06-13 4:46:5919 days ago1718254019IN
Crypto Multisender
0.00133333 ETH0.0086272412.09663664
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
202133812024-07-01 18:12:3514 hrs ago1719857555
Crypto Multisender
0.00039999 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
201936862024-06-29 0:12:233 days ago1719619943
Crypto Multisender
0.001 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CryptoMultisender

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-16
*/

pragma solidity ^0.8.0;
 

contract Ownable {
    
    address public owner;
    
    event OwnershipTransferred(address indexed from, address indexed to);
    
    /**
     * Constructor assigns ownership to the address used to deploy the contract.
     * */
    constructor() {
        owner = msg.sender;
    }

    function getOwner() public view returns(address) {
        return owner;
    }

    /**
     * Any function with this modifier in its method signature can only be executed by
     * the owner of the contract. Any attempt made by any other account to invoke the 
     * functions with this modifier will result in a loss of gas and the contract's state
     * will remain untampered.
     * */
    modifier onlyOwner {
        require(msg.sender == owner, "Function restricted to owner of contract");
        _;
    }

    /**
     * Allows for the transfer of ownership to another address;
     * 
     * @param _newOwner The address to be assigned new ownership.
     * */
    function transferOwnership(address _newOwner) public onlyOwner {
        require(
            _newOwner != address(0)
            && _newOwner != owner 
        );
        emit OwnershipTransferred(owner, _newOwner);
        owner = _newOwner;
    }
}



abstract contract DeprecatedMultisenderSC {
    function isPremiumMember(address _who) external virtual view returns(bool);
}

/**
 * Contract acts as an interface between the Crypto Multisender contract and all ERC20 compliant
 * tokens. 
 * */
abstract contract ERC20Interface {
    function transferFrom(address _from, address _to, uint256 _value) public virtual;
    function balanceOf(address who)  public virtual returns (uint256);
    function allowance(address owner, address spender)  public view virtual returns (uint256);
    function transfer(address to, uint256 value) public virtual returns(bool);
    function gasOptimizedAirdrop(address[] calldata _addrs, uint256[] calldata _values) external virtual; 
}

/**
 * Contract acts as an interface between the NFT Crypto Multisender contract and all ERC721 compliant
 * tokens. 
 * */
abstract contract ERC721Interface {
    function transferFrom(address _from, address _to, uint256 _tokenId) public virtual;
    function balanceOf(address who)  public virtual returns (uint256);
    function isApprovedForAll(address _owner, address _operator) public view virtual returns(bool);
    function setApprovalForAll(address _operator, bool approved) public virtual;
    function gasOptimizedAirdrop(address _invoker, address[] calldata _addrs, uint256[] calldata _tokenIds) external virtual;
}


/**
 * Contract acts as an interface between the NFT Crypto Multisender contract and all ERC1155 compliant
 * tokens. 
 * */
abstract contract ERC1155Interface {
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, uint256 _amount, bytes memory data) public virtual;
    function balanceOf(address _who, uint256 _id)  public virtual returns (uint256);
    function isApprovedForAll(address _owner, address _operator) public view virtual returns(bool);
    function setApprovalForAll(address _operator, bool approved) public virtual;
    function gasOptimizedAirdrop(address _invoker, address[] calldata _addrs, uint256[] calldata _tokenIds, uint256[] calldata _amounts) external virtual;
}



contract CryptoMultisender is Ownable {
 
    mapping (address => uint256) public tokenTrialDrops;
    mapping (address => uint256) public userTrialDrops;

    mapping (address => uint256) public premiumMembershipDiscount;
    mapping (address => uint256) public membershipExpiryTime;

    mapping (address => bool) public isGrantedPremiumMember;

    mapping (address => bool) public isListedToken;
    mapping (address => uint256) public tokenListingFeeDiscount;

    mapping (address => bool) public isGrantedListedToken;

    mapping (address => bool) public isAffiliate;
    mapping (string => address) public affiliateCodeToAddr;
    mapping (string => bool) public affiliateCodeExists;
    mapping (address => string) public affiliateCodeOfAddr;
    mapping (address => string) public isAffiliatedWith;
    mapping (string => uint256) public commissionPercentage;

    uint256 public oneDayMembershipFee;
    uint256 public sevenDayMembershipFee;
    uint256 public oneMonthMembershipFee;
    uint256 public lifetimeMembershipFee;
    uint256 public tokenListingFee;
    uint256 public rate;
    uint256 public dropUnitPrice;
    address public deprecatedMultisenderAddress;

    event TokenAirdrop(address indexed by, address indexed tokenAddress, uint256 totalTransfers);
    event EthAirdrop(address indexed by, uint256 totalTransfers, uint256 ethValue);
    event NftAirdrop(address indexed by, address indexed nftAddress, uint256 totalTransfers);
    event RateChanged(uint256 from, uint256 to);
    event RefundIssued(address indexed to, uint256 totalWei);
    event ERC20TokensWithdrawn(address token, address sentTo, uint256 value);
    event CommissionPaid(address indexed to, uint256 value);
    event NewPremiumMembership(address indexed premiumMember);
    event NewAffiliatePartnership(address indexed newAffiliate, string indexed affiliateCode);
    event AffiliatePartnershipRevoked(address indexed affiliate, string indexed affiliateCode);
    
    constructor() {
        rate = 3000;
        dropUnitPrice = 333333333333333; 
        oneDayMembershipFee = 9e17;
        sevenDayMembershipFee = 125e16;
        oneMonthMembershipFee = 2e18;
        lifetimeMembershipFee = 25e17;
        tokenListingFee = 5e18;
        deprecatedMultisenderAddress=address(0xF521007C7845590C6c5ae46833DEFa0A68883CD4);
    }

    /**
     * Allows the owner of this contract to change the fees for users to become premium members.
     * 
     * @param _oneDayFee Fee for single day membership.
     * @param _sevenDayFee Fee for one week membership.
     * @param _oneMonthFee Fee for one month membership.
     * @param _lifetimeFee Fee for lifetime membership.
     * 
     * @return success True if the fee is changed successfully. False otherwise.
     * */
    function setMembershipFees(uint256 _oneDayFee, uint256 _sevenDayFee, uint256 _oneMonthFee, uint256 _lifetimeFee) public onlyOwner returns(bool success) {
        require(_oneDayFee>0 && _oneDayFee<_sevenDayFee && _sevenDayFee<_oneMonthFee && _oneMonthFee<_lifetimeFee);
        oneDayMembershipFee = _oneDayFee;
        sevenDayMembershipFee = _sevenDayFee;
        oneMonthMembershipFee = _oneMonthFee;
        lifetimeMembershipFee = _lifetimeFee;
        return true;
    }

    /**
     * Allows for the conversion of an unsigned integer to a string value. 
     * 
     * @param _i The value of the unsigned integer
     * 
     * @return _uintAsString The string value of the unsigned integer.
     * */
    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    /**
    * Used to give change to users who accidentally send too much ETH to payable functions. 
    *
    * @param _price The service fee the user has to pay for function execution. 
    **/
    function giveChange(uint256 _price) internal {
        if(msg.value > _price) {
            uint256 change = msg.value - _price;
            payable(msg.sender).transfer(change);
        }
    }
    
    /**
    * Ensures that the correct affiliate code is used and also ensures that affiliate partners
    * are not able to 'jack' commissions from existing users who they are not affiliated with. 
    *
    * @param _afCode The affiliate code provided by the user.
    *
    * @return code The correct affiliate code or void.
    **/
    function processAffiliateCode(string memory _afCode) internal returns(string memory code) {
        if(stringsAreEqual(isAffiliatedWith[msg.sender], "void") || !isAffiliate[affiliateCodeToAddr[_afCode]]) {
            isAffiliatedWith[msg.sender] = "void";
            return "void";
        }
        if(!stringsAreEqual(_afCode, "") && stringsAreEqual(isAffiliatedWith[msg.sender],"") 
                                                                && affiliateCodeExists[_afCode]) {
            if(affiliateCodeToAddr[_afCode] == msg.sender) {
                return "void";
            }
            isAffiliatedWith[msg.sender] = _afCode;
        }
        if(stringsAreEqual(_afCode,"") && !stringsAreEqual(isAffiliatedWith[msg.sender],"")) {
            _afCode = isAffiliatedWith[msg.sender];
        } 
        if(stringsAreEqual(_afCode,"") || !affiliateCodeExists[_afCode]) {
            isAffiliatedWith[msg.sender] = "void";
            _afCode = "void";
        }
        return _afCode;
    }

    /**
     * Allows users to check if a user is a premium member or not. 
     * 
     * @param _addr The address of the user. 
     * 
     * @return isMember True if the user is a premium member, false otherwise.
     * */
    function checkIsPremiumMember(address _addr) public view returns(bool isMember) {
        return membershipExpiryTime[_addr] >= block.timestamp || isGrantedPremiumMember[_addr];
    }

    /**
    * Allows the owner of this contract to grant users with premium membership.
    *
    * @param _addr The address of the user who is being granted premium membership.
    *
    * @return success True if premium membership is granted successfully. False otherwise. 
    **/
    function grantPremiumMembership(address _addr) public onlyOwner returns(bool success) {
        require(checkIsPremiumMember(_addr) != true, "Is already premiumMember member");
        isGrantedPremiumMember[_addr] = true;
        emit NewPremiumMembership(_addr);
        return true; 
    }

    /**
    * Allows the owner of this contract to revoke a granted membership.
    *
    * @param _addr The address of the user whos membership is being revoked.
    *
    * @return success True if membership is revoked successfully. False otherwise. 
    **/
    function revokeGrantedPremiumMembership(address _addr) public onlyOwner returns(bool success) {
        require(isGrantedPremiumMember[_addr], "Not a granted membership");
        isGrantedPremiumMember[_addr] = false;
        return true;
    }

    /**
     * Allows the owner of the contract to grant a premium membership discount for a specified user.
     * 
     * @param _addr The address of the user.
     * @param _discount The discount being granted.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function setPremiumMembershipDiscount(address _addr, uint256 _discount) public onlyOwner returns(bool success) {
        premiumMembershipDiscount[_addr] = _discount;
        return true;
    }

    /**
     * Allows users to check VIP membership fees for a specific address. This is useful for validating if a discount
     * has been granted for the specified user. 
     * 
     * @param _addr The address of the user.
     * @param _fee The default fee. 
     * 
     * @return fee The membership fee for the specified user. 
     * 
     * */
    function getPremiumMembershipFeeOfUser(address _addr, uint256 _fee) public view returns(uint256 fee) {
        if(premiumMembershipDiscount[_addr] > 0) {
            return _fee * premiumMembershipDiscount[_addr] / 100;
        }
        return _fee;
    }



    /**
     * Allows the owner of the contract to set the contract address of the old multisender SC.
     * 
     * @param _addr The updated address.
     * */
    function setDeprecatedMultisenderAddress(address _addr) public onlyOwner {
        deprecatedMultisenderAddress = _addr;
    }


    /**
     * This function checks if a user address has a membership on the old SC.
     * 
     * @param _who The address of the user.
     * 
     * @return True if the user is a member on the old SC, false otherwise.
     * */
    function isMemberOfOldMultisender(address _who) public view returns(bool) {
        DeprecatedMultisenderSC oldMultisender = DeprecatedMultisenderSC(deprecatedMultisenderAddress);
        return oldMultisender.isPremiumMember(_who);
    }


    /**
     * Allows users to transfer their membership from the old SC to this SC. 
     * 
     * @return True if there is a membership to be transferred, false otherwise. 
     * */
    function transferMembership() public returns(bool) {
        require(isMemberOfOldMultisender(msg.sender), "No membership to transfer");
        membershipExpiryTime[msg.sender] = block.timestamp + (36500 * 1 days);
        return true;
    }
    

    /**
     * This function is invoked internally the functions for purchasing memberships.
     * 
     * @param _days The number of days that the membership will be valid for. 
     * @param _fee The fee that is to be paid. 
     * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
     * an affiliate code so the partner gets commission.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function assignMembership(uint256 _days, uint256 _fee, string memory _afCode) internal returns(bool success) {
        require(checkIsPremiumMember(msg.sender) != true, "Is already premiumMember member");
        uint256 fee = getPremiumMembershipFeeOfUser(msg.sender, _fee);
        require(
            msg.value >= fee,
            string(abi.encodePacked(
                "premiumMember fee is: ", uint2str(fee), ". Not enough funds sent. ", uint2str(msg.value)
            ))
        );
        membershipExpiryTime[msg.sender] = block.timestamp + (_days * 1 days);
        _afCode = processAffiliateCode(_afCode);
        giveChange(fee);
        distributeCommission(fee, _afCode);
        emit NewPremiumMembership(msg.sender);
        return true; 
    }

    /**
    * Allows users to become lifetime members.
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeLifetimeMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(36500, lifetimeMembershipFee, _afCode);
        return true;
    }


    /**
    * Allows users to become members for 1 day.
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeOneDayMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(1, oneDayMembershipFee, _afCode);
        return true;
    }


    /**
    * Allows users to become members for 7 days.
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeOneWeekMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(7, sevenDayMembershipFee, _afCode);
        return true;
    }


    /**
    * Allows users to become members for 1 month
    *
    * @param _afCode If a user has been refferred by an affiliate partner, they can provide 
    * an affiliate code so the partner gets commission.
    *
    * @return success True if user successfully becomes premium member. False otherwise. 
    **/
    function becomeOneMonthMember(string memory _afCode) public payable returns(bool success) {
        assignMembership(31, oneMonthMembershipFee, _afCode);
        return true;
    }


    /**
     * Allows users to check whether or not a token is listed.
     * 
     * @param _tokenAddr The address of the token to query.
     * 
     * @return isListed True if the token is listed, false otherwise. 
     * */
    function checkIsListedToken(address _tokenAddr) public view returns(bool isListed) {
        return isListedToken[_tokenAddr] || isGrantedListedToken[_tokenAddr];
    }


    /**
     * Allows the owner of the contract to set a listing discount for a specified token.
     * 
     * @param _tokenAddr The address of the token that will receive the discount. 
     * @param _discount The discount that will be applied. 
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function setTokenListingFeeDiscount(address _tokenAddr, uint256 _discount) public onlyOwner returns(bool success) {
        tokenListingFeeDiscount[_tokenAddr] = _discount;
        return true;
    }

    /**
     * Allows users to query the listing fee for a token. This is useful to verify that a discount has been set. 
     * 
     * @param _tokenAddr The address of the token. 
     * 
     * @return fee The listing fee for the token. 
     * */
    function getListingFeeForToken(address _tokenAddr) public view returns(uint256 fee) {
        if(tokenListingFeeDiscount[_tokenAddr] > 0) {
            return tokenListingFee * tokenListingFeeDiscount[_tokenAddr] / 100;
        }
        return tokenListingFee;
    }

    /**
     * Allows users to list a token of their choosing. 
     * 
     * @param _tokenAddr The address of the token that will be listed. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function purchaseTokenListing(address _tokenAddr, string memory _afCode) public payable returns(bool success) {
        require(!checkIsListedToken(_tokenAddr), "Token is already listed");
        _afCode = processAffiliateCode(_afCode);
        uint256 fee = getListingFeeForToken(_tokenAddr);
        require(msg.value >= fee, "Not enough funds sent for listing");
        isListedToken[_tokenAddr] = true;
        giveChange(fee);
        distributeCommission(fee, _afCode);
        return true;
    }

    /**
     * Allows the owner of the contract to revoke a granted token listing. 
     * 
     * @param _tokenAddr The address of the token that is being delisted. 
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function revokeGrantedTokenListing(address _tokenAddr) public onlyOwner returns(bool success) {
        require(checkIsListedToken(_tokenAddr), "Is not listed token");
        isGrantedListedToken[_tokenAddr] = false;
        return  true;
    }


    /**
     * Allows the owner of the contract to grant a token a free listing. 
     * 
     * @param _tokenAddr The address of the token being listed.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function grantTokenListing(address _tokenAddr) public onlyOwner returns(bool success){
        require(!checkIsListedToken(_tokenAddr), "Token is already listed");
        isGrantedListedToken[_tokenAddr] = true;
        return true;
    }

    /**
     * Allows the owner of the contract to modify the token listing fee. 
     * 
     * @param _newFee The new fee for token listings. 
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function setTokenListingFee(uint256 _newFee) public onlyOwner returns(bool success){
        tokenListingFee = _newFee;
        return true;
    }
    
    /**
    * Allows the owner of this contract to add an affiliate partner.
    *
    * @param _addr The address of the new affiliate partner.
    * @param _code The affiliate code.
    * 
    * @return success True if the affiliate has been added successfully. False otherwise. 
    **/
    function addAffiliate(address _addr, string memory _code, uint256 _percentage) public onlyOwner returns(bool success) {
        require(!isAffiliate[_addr], "Address is already an affiliate.");
        require(_addr != address(0), "0x00 address not allowed");
        require(!affiliateCodeExists[_code], "Affiliate code already exists!");
        require(_percentage <= 100 && _percentage > 0, "Percentage must be > 0 && <= 100");
        affiliateCodeExists[_code] = true;
        isAffiliate[_addr] = true;
        affiliateCodeToAddr[_code] = _addr;
        affiliateCodeOfAddr[_addr] = _code;
        commissionPercentage[_code] = _percentage;
        emit NewAffiliatePartnership(_addr,_code);
        return true;
    }


    /**
     * Allows the owner of the contract to set a customised commission percentage for a given affiliate partner.
     * 
     * @param _addressOfAffiliate The wallet address of the affiliate partner.
     * @param _percentage The commission percentage the affiliate will receive.
     * 
     * @return success True if function executes successfully, false otherwise.
     * */
    function changeAffiliatePercentage(address _addressOfAffiliate, uint256 _percentage) public onlyOwner returns(bool success) { 
        require(isAffiliate[_addressOfAffiliate]);
        string storage affCode = affiliateCodeOfAddr[_addressOfAffiliate];
        commissionPercentage[affCode] = _percentage;
        return true;
    }

    /**
    * Allows the owner of this contract to remove an affiliate partner. 
    *
    * @param _addr The address of the affiliate partner.
    *
    * @return success True if affiliate partner is removed successfully. False otherwise. 
    **/
    function removeAffiliate(address _addr) public onlyOwner returns(bool success) {
        require(isAffiliate[_addr]);
        isAffiliate[_addr] = false;
        affiliateCodeToAddr[affiliateCodeOfAddr[_addr]] = address(0);
        emit AffiliatePartnershipRevoked(_addr, affiliateCodeOfAddr[_addr]);
        affiliateCodeOfAddr[_addr] = "No longer an affiliate partner";
        return true;
    }
    
    /**
     * Checks whether or not an ERC20 token has used its free trial of 100 drops. This is a constant 
     * function which does not alter the state of the contract and therefore does not require any gas 
     * or a signature to be executed. 
     * 
     * @param _addressOfToken The address of the token being queried.
     * 
     * @return hasFreeTrial true if the token being queried has not used its 100 first free trial drops, false
     * otherwise.
     * */
    function tokenHasFreeTrial(address _addressOfToken) public view returns(bool hasFreeTrial) {
        return tokenTrialDrops[_addressOfToken] < 100;
    }


    /**
     * Checks whether or not a user has a free trial. 
     * 
     * @param _addressOfUser The address of the user being queried.
     * 
     * @return hasFreeTrial true if the user address being queried has not used the first 100 free trial drops, false
     * otherwise.
     * */
    function userHasFreeTrial(address _addressOfUser) public view returns(bool hasFreeTrial) {
        return userTrialDrops[_addressOfUser] < 100;
    }
    
    /**
     * Checks how many remaining free trial drops a token has.
     * 
     * @param _addressOfToken the address of the token being queried.
     * 
     * @return remainingTrialDrops the total remaining free trial drops of a token.
     * */
    function getRemainingTokenTrialDrops(address _addressOfToken) public view returns(uint256 remainingTrialDrops) {
        if(tokenHasFreeTrial(_addressOfToken)) {
            uint256 maxTrialDrops =  100;
            return maxTrialDrops - tokenTrialDrops[_addressOfToken];
        } 
        return 0;
    }

    /**
     * Checks how many remaining free trial drops a user has.
     * 
     * @param _addressOfUser the address of the user being queried.
     * 
     * @return remainingTrialDrops the total remaining free trial drops of a user.
     * */
    function getRemainingUserTrialDrops(address _addressOfUser) public view returns(uint256 remainingTrialDrops) {
        if(userHasFreeTrial(_addressOfUser)) {
            uint256 maxTrialDrops =  100;
            return maxTrialDrops - userTrialDrops[_addressOfUser];
        }
        return 0;
    }
    
    /**
     * Allows for the price of drops to be changed by the owner of the contract. Any attempt made by 
     * any other account to invoke the function will result in a loss of gas and the price will remain 
     * untampered.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */
    function setRate(uint256 _newRate) public onlyOwner returns(bool success) {
        require(
            _newRate != rate 
            && _newRate > 0
        );
        emit RateChanged(rate, _newRate);
        rate = _newRate;
        uint256 eth = 1 ether;
        dropUnitPrice = eth / rate;
        return true;
    }
    
    /**
     * Allows for the allowance of a token from its owner to this contract to be queried. 
     * 
     * As part of the ERC20 standard all tokens which fall under this category have an allowance 
     * function which enables owners of tokens to allow (or give permission) to another address 
     * to spend tokens on behalf of the owner. This contract uses this as part of its protocol.
     * Users must first give permission to the contract to transfer tokens on their behalf, however,
     * this does not mean that the tokens will ever be transferrable without the permission of the 
     * owner. This is a security feature which was implemented on this contract. It is not possible
     * for the owner of this contract or anyone else to transfer the tokens which belong to others. 
     * 
     * @param _addr The address of the token's owner.
     * @param _addressOfToken The contract address of the ERC20 token.
     * 
     * @return allowance The ERC20 token allowance from token owner to this contract. 
     * */
    function getTokenAllowance(address _addr, address _addressOfToken) public view returns(uint256 allowance) {
        ERC20Interface token = ERC20Interface(_addressOfToken);
        return token.allowance(_addr, address(this));
    }
    
    fallback() external payable {
        revert();
    }

    receive() external payable {
        revert();
    }
    
    /**
    * Checks if two strings are the same.
    *
    * @param _a String 1
    * @param _b String 2
    *
    * @return areEqual True if both strings are the same. False otherwise. 
    **/
    function stringsAreEqual(string memory _a, string memory _b) internal pure returns(bool areEqual) {
        bytes32 hashA = keccak256(abi.encodePacked(_a));
        bytes32 hashB = keccak256(abi.encodePacked(_b));
        return hashA == hashB;
    }
    
    /**
     * Allows for the distribution of Ether to be transferred to multiple recipients at 
     * a time. 
     * 
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _values The corresponding amounts that the recipients will receive 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */
    function airdropNativeCurrency(address[] memory _recipients, uint256[] memory _values, uint256 _totalToSend, string memory _afCode) public payable returns(bool success) {
        require(_recipients.length == _values.length, "Total number of recipients and values are not equal");
        uint256 totalEthValue = _totalToSend;
        uint256 price = _recipients.length * dropUnitPrice;
        uint256 totalCost = totalEthValue + price;
        bool userHasTrial = userHasFreeTrial(msg.sender);
        bool isVIP = checkIsPremiumMember(msg.sender) == true;
        require(
            msg.value >= totalCost || isVIP || userHasTrial, 
            "Not enough funds sent with transaction!"
        );
        _afCode = processAffiliateCode(_afCode);
        if(!isVIP && !userHasTrial) {
            distributeCommission(price, _afCode);
        }
        if((isVIP || userHasTrial) && msg.value > _totalToSend) {
            payable(msg.sender).transfer((msg.value) - _totalToSend);
        } else {
            giveChange(totalCost);
        }
        for(uint i = 0; i < _recipients.length; i++) {
            payable(_recipients[i]).transfer(_values[i]);
        }
        if(userHasTrial) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        emit EthAirdrop(msg.sender, _recipients.length, totalEthValue);
        return true;
    }

    /**
     * Allows for the distribution of an ERC20 token to be transferred to multiple recipients at 
     * a time. This function facilitates batch transfers of differing values (i.e., all recipients
     * can receive different amounts of tokens).
     * 
     * @param _addressOfToken The contract address of an ERC20 token.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _values The corresponding values of tokens which each address will receive.
     * @param _optimized Should only be enabled for tokens with gas optimized distribution functions. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */    
    function erc20Airdrop(address _addressOfToken,  address[] memory _recipients, uint256[] memory _values, uint256 _totalToSend, bool _isDeflationary, bool _optimized, string memory _afCode) public payable returns(bool success) {
        string memory afCode = processAffiliateCode(_afCode);
        ERC20Interface token = ERC20Interface(_addressOfToken);
        require(_recipients.length == _values.length, "Total number of recipients and values are not equal");
        uint256 price = _recipients.length * dropUnitPrice;
        bool isPremiumOrListed = checkIsPremiumMember(msg.sender) || checkIsListedToken(_addressOfToken);
        bool eligibleForFreeTrial = tokenHasFreeTrial(_addressOfToken) && userHasFreeTrial(msg.sender);
        require(
            msg.value >= price || tokenHasFreeTrial(_addressOfToken) || userHasFreeTrial(msg.sender) || isPremiumOrListed,
            "Not enough funds sent with transaction!"
        );
        if((eligibleForFreeTrial || isPremiumOrListed) && msg.value > 0) {
            payable(msg.sender).transfer(msg.value);
        } else {
            giveChange(price);
        }

        if(_optimized) {
            token.transferFrom(msg.sender, address(this), _totalToSend);
            token.gasOptimizedAirdrop(_recipients,_values);
        } else {
            if(!_isDeflationary) {
                token.transferFrom(msg.sender, address(this), _totalToSend);
                for(uint i = 0; i < _recipients.length; i++) {
                    token.transfer(_recipients[i], _values[i]);
                }
                if(token.balanceOf(address(this)) > 0) {
                    token.transfer(msg.sender,token.balanceOf(address(this)));
                }
            } else {
                for(uint i=0; i < _recipients.length; i++) {
                    token.transferFrom(msg.sender, _recipients[i], _values[i]);
                }
            }
        }

        if(tokenHasFreeTrial(_addressOfToken)) {
            tokenTrialDrops[_addressOfToken] = tokenTrialDrops[_addressOfToken] + _recipients.length;
        }
        if(userHasFreeTrial(msg.sender)) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        if(!eligibleForFreeTrial && !isPremiumOrListed) {
            distributeCommission(_recipients.length * dropUnitPrice, afCode);
        }
        emit TokenAirdrop(msg.sender, _addressOfToken, _recipients.length);
        return true;
    }


    /**
     * Allows for the distribution of ERC721 tokens to be transferred to multiple recipients at 
     * a time. 
     * 
     * @param _addressOfNFT The contract address of an ERC721 token collection.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _tokenIds The corresponding IDs of the NFT collection which each address will receive.
     * @param _optimized Should only be enabled for ERC721 token collections with gas optimized distribution functions. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */ 
    function erc721Airdrop(address _addressOfNFT, address[] memory _recipients, uint256[] memory _tokenIds, bool _optimized, string memory _afCode) public payable returns(bool success) {
        require(_recipients.length == _tokenIds.length, "Total number of recipients and total number of NFT IDs are not the same");
        string memory afCode = processAffiliateCode(_afCode);
        ERC721Interface erc721 = ERC721Interface(_addressOfNFT);
        uint256 price = _recipients.length * dropUnitPrice;
        bool isPremiumOrListed = checkIsPremiumMember(msg.sender) || checkIsListedToken(_addressOfNFT);
        bool eligibleForFreeTrial = tokenHasFreeTrial(_addressOfNFT) && userHasFreeTrial(msg.sender);
        require(
            msg.value >= price || eligibleForFreeTrial || isPremiumOrListed,
            "Not enough funds sent with transaction!"
        );
        if((eligibleForFreeTrial || isPremiumOrListed) && msg.value > 0) {
            payable(msg.sender).transfer(msg.value);
        } else {
            giveChange(price);
        }
        if(_optimized){
            erc721.gasOptimizedAirdrop(msg.sender,_recipients,_tokenIds);
        } else {
            for(uint i = 0; i < _recipients.length; i++) {
                erc721.transferFrom(msg.sender, _recipients[i], _tokenIds[i]);
            }
        }
        if(tokenHasFreeTrial(_addressOfNFT)) {
            tokenTrialDrops[_addressOfNFT] = tokenTrialDrops[_addressOfNFT] + _recipients.length;
        }
        if(userHasFreeTrial(msg.sender)) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        if(!eligibleForFreeTrial && !isPremiumOrListed) {
            distributeCommission(_recipients.length * dropUnitPrice, afCode);
        }
        emit NftAirdrop(msg.sender, _addressOfNFT, _recipients.length);
        return true;
    }

    /**
     * Allows for the distribution of ERC1155 tokens to be transferred to multiple recipients at 
     * a time. 
     * 
     * @param _addressOfNFT The contract address of an ERC1155 token contract.
     * @param _recipients The list of addresses which will receive tokens. 
     * @param _ids The corresponding IDs of the token collection which each address will receive.
     * @param _amounts The amount of tokens to send from each token type.
     * @param _optimized Should only be enabled for ERC721 token collections with gas optimized distribution functions. 
     * @param _afCode If the user is affiliated with a partner, they will provide this code so that 
     * the parter is paid commission.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */ 
    function erc1155Airdrop(address _addressOfNFT, address[] memory _recipients, uint256[] memory _ids, uint256[] memory _amounts, bool _optimized, string memory _afCode) public payable returns(bool success) {
        require(_recipients.length == _ids.length, "Total number of recipients and total number of NFT IDs are not the same");
        require(_recipients.length == _amounts.length, "Total number of recipients and total number of amounts are not the same");
        string memory afCode = processAffiliateCode(_afCode);
        ERC1155Interface erc1155 = ERC1155Interface(_addressOfNFT);
        uint256 price = _recipients.length * dropUnitPrice;
        bool isPremiumOrListed = checkIsPremiumMember(msg.sender) || checkIsListedToken(_addressOfNFT);
        bool eligibleForFreeTrial = tokenHasFreeTrial(_addressOfNFT) && userHasFreeTrial(msg.sender);
        require(
            msg.value >= price || eligibleForFreeTrial || isPremiumOrListed,
            "Not enough funds sent with transaction!"
        );
        if((eligibleForFreeTrial || isPremiumOrListed) && msg.value > 0) {
            payable(msg.sender).transfer(msg.value);
        } else {
            giveChange(price);
        }
        if(_optimized){
            erc1155.gasOptimizedAirdrop(msg.sender,_recipients,_ids,_amounts);
        } else {
            for(uint i = 0; i < _recipients.length; i++) {
                erc1155.safeTransferFrom(msg.sender, _recipients[i], _ids[i], _amounts[i], "");
            }
        }
        if(tokenHasFreeTrial(_addressOfNFT)) {
            tokenTrialDrops[_addressOfNFT] = tokenTrialDrops[_addressOfNFT] + _recipients.length;
        }
        if(userHasFreeTrial(msg.sender)) {
            userTrialDrops[msg.sender] = userTrialDrops[msg.sender] + _recipients.length;
        }
        if(!eligibleForFreeTrial && !isPremiumOrListed) {
            distributeCommission(_recipients.length * dropUnitPrice, afCode);
        }
        emit NftAirdrop(msg.sender, _addressOfNFT, _recipients.length);
        return true;
    }


    /**
    * Send the owner and affiliates commissions.
    **/
    function distributeCommission(uint256 _profits, string memory _afCode) internal {
        if(!stringsAreEqual(_afCode,"void") && isAffiliate[affiliateCodeToAddr[_afCode]]) {
            uint256 commission = _profits * commissionPercentage[_afCode] / 100;
            payable(owner).transfer(_profits - commission);
            payable(affiliateCodeToAddr[_afCode]).transfer(commission);
            emit CommissionPaid(affiliateCodeToAddr[_afCode], commission);
        } else {
            payable(owner).transfer(_profits);
        }
    }


    /**
     * Allows the owner of the contract to withdraw any funds that may reside on the contract address.
     * */
    function withdrawFunds() public onlyOwner returns(bool success) {
        payable(owner).transfer(address(this).balance);
        return true;
    }

    /**
     * Allows for any ERC20 tokens which have been mistakenly  sent to this contract to be returned 
     * to the original sender by the owner of the contract. Any attempt made by any other account 
     * to invoke the function will result in a loss of gas and no tokens will be transferred out.
     * 
     * @param _addressOfToken The contract address of an ERC20 token.
     * @param _recipient The address which will receive tokens. 
     * @param _value The amount of tokens to refund.
     * 
     * @return success true if function executes successfully, false otherwise.
     * */  
    function withdrawERC20Tokens(address _addressOfToken,  address _recipient, uint256 _value) public onlyOwner returns(bool success){
        ERC20Interface token = ERC20Interface(_addressOfToken);
        token.transfer(_recipient, _value);
        emit ERC20TokensWithdrawn(_addressOfToken, _recipient, _value);
        return true;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"affiliate","type":"address"},{"indexed":true,"internalType":"string","name":"affiliateCode","type":"string"}],"name":"AffiliatePartnershipRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"CommissionPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"sentTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ERC20TokensWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalTransfers","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethValue","type":"uint256"}],"name":"EthAirdrop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAffiliate","type":"address"},{"indexed":true,"internalType":"string","name":"affiliateCode","type":"string"}],"name":"NewAffiliatePartnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"premiumMember","type":"address"}],"name":"NewPremiumMembership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"nftAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalTransfers","type":"uint256"}],"name":"NftAirdrop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"from","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"to","type":"uint256"}],"name":"RateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalWei","type":"uint256"}],"name":"RefundIssued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalTransfers","type":"uint256"}],"name":"TokenAirdrop","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"string","name":"_code","type":"string"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"addAffiliate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"affiliateCodeExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"affiliateCodeOfAddr","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"affiliateCodeToAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"uint256","name":"_totalToSend","type":"uint256"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"airdropNativeCurrency","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeLifetimeMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeOneDayMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeOneMonthMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_afCode","type":"string"}],"name":"becomeOneWeekMember","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfAffiliate","type":"address"},{"internalType":"uint256","name":"_percentage","type":"uint256"}],"name":"changeAffiliatePercentage","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"checkIsListedToken","outputs":[{"internalType":"bool","name":"isListed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"checkIsPremiumMember","outputs":[{"internalType":"bool","name":"isMember","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"commissionPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deprecatedMultisenderAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dropUnitPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfNFT","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bool","name":"_optimized","type":"bool"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"erc1155Airdrop","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_values","type":"uint256[]"},{"internalType":"uint256","name":"_totalToSend","type":"uint256"},{"internalType":"bool","name":"_isDeflationary","type":"bool"},{"internalType":"bool","name":"_optimized","type":"bool"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"erc20Airdrop","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfNFT","type":"address"},{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"},{"internalType":"bool","name":"_optimized","type":"bool"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"erc721Airdrop","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"getListingFeeForToken","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"getPremiumMembershipFeeOfUser","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"getRemainingTokenTrialDrops","outputs":[{"internalType":"uint256","name":"remainingTrialDrops","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfUser","type":"address"}],"name":"getRemainingUserTrialDrops","outputs":[{"internalType":"uint256","name":"remainingTrialDrops","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"getTokenAllowance","outputs":[{"internalType":"uint256","name":"allowance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"grantPremiumMembership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"grantTokenListing","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAffiliate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAffiliatedWith","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGrantedListedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isGrantedPremiumMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isListedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"isMemberOfOldMultisender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lifetimeMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"membershipExpiryTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneDayMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oneMonthMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"premiumMembershipDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"string","name":"_afCode","type":"string"}],"name":"purchaseTokenListing","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"removeAffiliate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"revokeGrantedPremiumMembership","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"}],"name":"revokeGrantedTokenListing","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setDeprecatedMultisenderAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_oneDayFee","type":"uint256"},{"internalType":"uint256","name":"_sevenDayFee","type":"uint256"},{"internalType":"uint256","name":"_oneMonthFee","type":"uint256"},{"internalType":"uint256","name":"_lifetimeFee","type":"uint256"}],"name":"setMembershipFees","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_discount","type":"uint256"}],"name":"setPremiumMembershipDiscount","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRate","type":"uint256"}],"name":"setRate","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"setTokenListingFee","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"uint256","name":"_discount","type":"uint256"}],"name":"setTokenListingFeeDiscount","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sevenDayMembershipFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"}],"name":"tokenHasFreeTrial","outputs":[{"internalType":"bool","name":"hasFreeTrial","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenListingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenListingFeeDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenTrialDrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transferMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfUser","type":"address"}],"name":"userHasFreeTrial","outputs":[{"internalType":"bool","name":"hasFreeTrial","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTrialDrops","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addressOfToken","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdrawERC20Tokens","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561001057600080fd5b50600080546001600160a01b03199081163317909155610bb860145566012f2a36ecd555601555670c7d713b49da0000600f55671158e460913d0000601055671bc16d674ec800006011556722b1c8c1227a0000601255674563918244f400006013556016805490911673f521007c7845590c6c5ae46833defa0a68883cd4179055614287806100a16000396000f3fe60806040526004361061039b5760003560e01c80636dd77649116101dc578063ac5b2bbc11610102578063df3b0ad1116100a0578063f2fde38b1161006f578063f2fde38b14610af6578063f519983514610b16578063f86af85114610b43578063fec5c0c614610b5657600080fd5b8063df3b0ad114610a8a578063e24f6a9714610aa0578063e5a8ec5b14610ac0578063ea7ee01014610ad657600080fd5b8063bcdd1e13116100dc578063bcdd1e13146109fa578063be6630c814610a1a578063ceb10f0b14610a4a578063d34937db14610a6a57600080fd5b8063ac5b2bbc146109a4578063b1867685146109c4578063bb12db5c146109e457600080fd5b80638ad95cf11161017a57806398adf5771161014957806398adf57714610939578063a39a2b761461095b578063a7296ee914610971578063a7ced8e21461098457600080fd5b80638ad95cf1146108b95780638da5cb5b146108d95780638faea9a7146108f95780638ffd58ad1461091957600080fd5b806386a9a599116101b657806386a9a5991461082e578063893d20e81461084e578063896bac231461086c5780638a53a1301461088c57600080fd5b80636dd77649146107e657806375f1a95a146107f957806385fc0de71461081957600080fd5b806339cb9ba8116102c15780634a4a2feb1161025f578063590925e21161022e578063590925e214610728578063593d98b114610769578063638c5da9146107895780636cca7d3c146107b957600080fd5b80634a4a2feb146106a55780634a4df559146106d25780634fa85186146106e5578063583a23901461071557600080fd5b80633d2375f91161029b5780633d2375f91461060a578063428b52f81461064557806343a92b41146106725780634930df8f1461069257600080fd5b806339cb9ba8146105c15780633aaff47f146105d45780633b9ff843146105ea57600080fd5b80631e93a9f2116103395780632c4e722e116103085780632c4e722e146105405780632f5f1a341461055657806334fcf4371461058e5780633671caa0146105ae57600080fd5b80631e93a9f2146104d557806323a0fb02146104eb57806324600fc31461050b5780632a769eb41461052057600080fd5b80630e160255116103755780630e1602551461042d57806317077fb71461046557806319acc3671461048557806319d30a40146104b557600080fd5b806306d7d80f146103aa578063088ea102146103d25780630ad92c311461040d57600080fd5b366103a557600080fd5b600080fd5b6103bd6103b83660046136f3565b610b76565b60405190151581526020015b60405180910390f35b3480156103de57600080fd5b506103ff6103ed36600461373f565b60076020526000908152604090205481565b6040519081526020016103c9565b34801561041957600080fd5b506103bd61042836600461373f565b610b8f565b34801561043957600080fd5b506103ff6104483660046136f3565b8051602081830181018051600e8252928201919093012091525481565b34801561047157600080fd5b506103ff61048036600461373f565b610c40565b34801561049157600080fd5b506103bd6104a036600461373f565b60056020526000908152604090205460ff1681565b3480156104c157600080fd5b506103bd6104d036600461373f565b610c9e565b3480156104e157600080fd5b506103ff60135481565b3480156104f757600080fd5b506103bd61050636600461373f565b610cdf565b34801561051757600080fd5b506103bd610cfd565b34801561052c57600080fd5b506103ff61053b36600461375a565b610d6a565b34801561054c57600080fd5b506103ff60145481565b34801561056257600080fd5b50601654610576906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b34801561059a57600080fd5b506103bd6105a9366004613784565b610dc5565b6103bd6105bc3660046138a7565b610e6b565b6103bd6105cf366004613974565b611272565b3480156105e057600080fd5b506103ff60125481565b3480156105f657600080fd5b506103bd61060536600461373f565b6115a2565b34801561061657600080fd5b506103bd6106253660046136f3565b8051602081830181018051600b8252928201919093012091525460ff1681565b34801561065157600080fd5b506103ff61066036600461373f565b60036020526000908152604090205481565b34801561067e57600080fd5b506103bd61068d36600461373f565b611703565b6103bd6106a03660046136f3565b61179e565b3480156106b157600080fd5b506106c56106c036600461373f565b6117ae565b6040516103c99190613a52565b6103bd6106e0366004613a85565b611848565b3480156106f157600080fd5b506103bd61070036600461373f565b60096020526000908152604090205460ff1681565b6103bd610723366004613b51565b611e8a565b34801561073457600080fd5b506105766107433660046136f3565b8051602081830181018051600a825292820191909301209152546001600160a01b031681565b34801561077557600080fd5b506103bd61078436600461373f565b6120b1565b34801561079557600080fd5b506103bd6107a436600461373f565b60066020526000908152604090205460ff1681565b3480156107c557600080fd5b506103ff6107d436600461373f565b60016020526000908152604090205481565b6103bd6107f43660046136f3565b6120cf565b34801561080557600080fd5b506103bd61081436600461375a565b6120df565b34801561082557600080fd5b506103bd612176565b34801561083a57600080fd5b506103bd61084936600461373f565b6121f1565b34801561085a57600080fd5b506000546001600160a01b0316610576565b34801561087857600080fd5b506103bd610887366004613be3565b612269565b34801561089857600080fd5b506103ff6108a736600461373f565b60026020526000908152604090205481565b3480156108c557600080fd5b506103bd6108d4366004613784565b6122da565b3480156108e557600080fd5b50600054610576906001600160a01b031681565b34801561090557600080fd5b506103bd61091436600461373f565b61230e565b34801561092557600080fd5b506103ff61093436600461373f565b61234f565b34801561094557600080fd5b5061095961095436600461373f565b61238d565b005b34801561096757600080fd5b506103ff60155481565b6103bd61097f3660046136f3565b6123d9565b34801561099057600080fd5b506103bd61099f36600461375a565b6123ea565b3480156109b057600080fd5b506103ff6109bf36600461373f565b612436565b3480156109d057600080fd5b506106c56109df36600461373f565b61246c565b3480156109f057600080fd5b506103ff60105481565b348015610a0657600080fd5b506103bd610a15366004613c15565b612485565b348015610a2657600080fd5b506103bd610a3536600461373f565b60086020526000908152604090205460ff1681565b348015610a5657600080fd5b506103bd610a6536600461375a565b61256c565b348015610a7657600080fd5b506103bd610a8536600461373f565b6125b8565b348015610a9657600080fd5b506103ff60115481565b348015610aac57600080fd5b506103bd610abb366004613c51565b612670565b348015610acc57600080fd5b506103ff600f5481565b348015610ae257600080fd5b506103ff610af1366004613ca8565b612947565b348015610b0257600080fd5b50610959610b1136600461373f565b6129c4565b348015610b2257600080fd5b506103ff610b3136600461373f565b60046020526000908152604090205481565b6103bd610b51366004613cdb565b612a78565b348015610b6257600080fd5b506103bd610b7136600461373f565b612b7c565b6000610b86601f60115484612c52565b50600192915050565b600080546001600160a01b03163314610bc35760405162461bcd60e51b8152600401610bba90613d29565b60405180910390fd5b610bcc8261230e565b15610c135760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b506001600160a01b0381166000908152600860205260409020805460ff191660019081179091555b919050565b6001600160a01b03811660009081526007602052604081205415610c96576001600160a01b038216600090815260076020526040902054601354606491610c8691613d87565b610c909190613da6565b92915050565b505060135490565b6001600160a01b03811660009081526004602052604081205442111580610c905750506001600160a01b031660009081526005602052604090205460ff1690565b6001600160a01b031660009081526001602052604090205460641190565b600080546001600160a01b03163314610d285760405162461bcd60e51b8152600401610bba90613d29565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610d62573d6000803e3d6000fd5b506001905090565b6001600160a01b03821660009081526003602052604081205415610dbf576001600160a01b038316600090815260036020526040902054606490610dae9084613d87565b610db89190613da6565b9050610c90565b50919050565b600080546001600160a01b03163314610df05760405162461bcd60e51b8152600401610bba90613d29565b6014548214158015610e025750600082115b610e0b57600080fd5b60145460408051918252602082018490527f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f7186910160405180910390a16014829055670de0b6b3a7640000610e5f8382613da6565b60155550600192915050565b60008451865114610e8e5760405162461bcd60e51b8152600401610bba90613dc8565b8351865114610f155760405162461bcd60e51b815260206004820152604760248201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460448201527f6f74616c206e756d626572206f6620616d6f756e747320617265206e6f74207460648201526668652073616d6560c81b608482015260a401610bba565b6000610f2083612d8c565b60155488519192508991600091610f3691613d87565b90506000610f4333610c9e565b80610f525750610f528b61230e565b90506000610f5f8c610cdf565b8015610f6f5750610f6f336120b1565b90508234101580610f7d5750805b80610f855750815b610fa15760405162461bcd60e51b8152600401610bba90613e35565b8080610faa5750815b8015610fb65750600034115b15610fed5760405133903480156108fc02916000818181858888f19350505050158015610fe7573d6000803e3d6000fd5b50610ff6565b610ff6836131f8565b8715611065576040516322e31d0560e11b81526001600160a01b038516906345c63a0a9061102e9033908f908f908f90600401613ef0565b600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b50505050611161565b60005b8b5181101561115f57846001600160a01b031663f242432a338e848151811061109357611093613f45565b60200260200101518e85815181106110ad576110ad613f45565b60200260200101518e86815181106110c7576110c7613f45565b60209081029190910101516040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260a06084820152600060a482015260c401600060405180830381600087803b15801561113457600080fd5b505af1158015611148573d6000803e3d6000fd5b50505050808061115790613f5b565b915050611068565b505b61116a8c610cdf565b156111ae578a516001600160a01b038d166000908152600160205260409020546111949190613f74565b6001600160a01b038d166000908152600160205260409020555b6111b7336120b1565b156111e9578a51336000908152600260205260409020546111d89190613f74565b336000908152600260205260409020555b801580156111f5575081155b15611212576112126015548c5161120c9190613d87565b86613242565b8b6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768d5160405161125891815260200190565b60405180910390a35060019b9a5050505050505050505050565b600083518551146112955760405162461bcd60e51b8152600401610bba90613dc8565b60006112a083612d8c565b601554875191925088916000916112b691613d87565b905060006112c333610c9e565b806112d257506112d28a61230e565b905060006112df8b610cdf565b80156112ef57506112ef336120b1565b905082341015806112fd5750805b806113055750815b6113215760405162461bcd60e51b8152600401610bba90613e35565b808061132a5750815b80156113365750600034115b1561136d5760405133903480156108fc02916000818181858888f19350505050158015611367573d6000803e3d6000fd5b50611376565b611376836131f8565b87156113e3576040516304b1cddf60e31b81526001600160a01b0385169063258e6ef8906113ac9033908e908e90600401613f8c565b600060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b50505050611498565b60005b8a5181101561149657846001600160a01b03166323b872dd338d848151811061141157611411613f45565b60200260200101518d858151811061142b5761142b613f45565b60200260200101516040518463ffffffff1660e01b815260040161145193929190613fcc565b600060405180830381600087803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b50505050808061148e90613f5b565b9150506113e6565b505b6114a18b610cdf565b156114e55789516001600160a01b038c166000908152600160205260409020546114cb9190613f74565b6001600160a01b038c166000908152600160205260409020555b6114ee336120b1565b156115205789513360009081526002602052604090205461150f9190613f74565b336000908152600260205260409020555b8015801561152c575081155b15611543576115436015548b5161120c9190613d87565b8a6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768c5160405161158991815260200190565b60405180910390a35060019a9950505050505050505050565b600080546001600160a01b031633146115cd5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526009602052604090205460ff166115f257600080fd5b6001600160a01b0382166000908152600960209081526040808320805460ff19169055600c9091528082209051600a9161162b916140bc565b908152604080516020928190038301812080546001600160a01b0319166001600160a01b039586161790559285166000908152600c909252902061166e916140bc565b604051908190038120906001600160a01b038416907f4ddc7b8659a2faf8698c810ab0219aa981bfccb47c036d3cc7ae8a32c15dc4ec90600090a3604080518082018252601e81527f4e6f206c6f6e67657220616e20616666696c6961746520706172746e6572000060208083019182526001600160a01b0386166000908152600c909152929092209051610b8692906135ac565b600080546001600160a01b0316331461172e5760405162461bcd60e51b8152600401610bba90613d29565b6117378261230e565b6117795760405162461bcd60e51b815260206004820152601360248201527224b9903737ba103634b9ba32b2103a37b5b2b760691b6044820152606401610bba565b506001600160a01b03166000908152600860205260409020805460ff19169055600190565b6000610b86600760105484612c52565b600c60205260009081526040902080546117c790613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546117f390613ff0565b80156118405780601f1061181557610100808354040283529160200191611840565b820191906000526020600020905b81548152906001019060200180831161182357829003601f168201915b505050505081565b60008061185483612d8c565b875189519192508a911461187a5760405162461bcd60e51b8152600401610bba906140c8565b60006015548a5161188b9190613d87565b9050600061189833610c9e565b806118a757506118a78c61230e565b905060006118b48d610cdf565b80156118c457506118c4336120b1565b905082341015806118d957506118d98d610cdf565b806118e857506118e8336120b1565b806118f05750815b61190c5760405162461bcd60e51b8152600401610bba90613e35565b80806119155750815b80156119215750600034115b156119585760405133903480156108fc02916000818181858888f19350505050158015611952573d6000803e3d6000fd5b50611961565b611961836131f8565b8715611a2e576040516323b872dd60e01b81526001600160a01b038516906323b872dd9061199790339030908f90600401613fcc565b600060405180830381600087803b1580156119b157600080fd5b505af11580156119c5573d6000803e3d6000fd5b5050604051633ae4b60360e21b81526001600160a01b038716925063eb92d80c91506119f7908f908f9060040161411b565b600060405180830381600087803b158015611a1157600080fd5b505af1158015611a25573d6000803e3d6000fd5b50505050611d7e565b88611cc9576040516323b872dd60e01b81526001600160a01b038516906323b872dd90611a6390339030908f90600401613fcc565b600060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b5050505060005b8c51811015611b6b57846001600160a01b031663a9059cbb8e8381518110611ac257611ac2613f45565b60200260200101518e8481518110611adc57611adc613f45565b60200260200101516040518363ffffffff1660e01b8152600401611b159291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b589190614149565b5080611b6381613f5b565b915050611a98565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a08231906024016020604051808303816000875af1158015611bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd99190614166565b1115611cc4576040516370a0823160e01b81523060048201526001600160a01b0385169063a9059cbb90339083906370a08231906024016020604051808303816000875af1158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c539190614166565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc29190614149565b505b611d7e565b60005b8c51811015611d7c57846001600160a01b03166323b872dd338f8481518110611cf757611cf7613f45565b60200260200101518f8581518110611d1157611d11613f45565b60200260200101516040518463ffffffff1660e01b8152600401611d3793929190613fcc565b600060405180830381600087803b158015611d5157600080fd5b505af1158015611d65573d6000803e3d6000fd5b505050508080611d7490613f5b565b915050611ccc565b505b611d878d610cdf565b15611dcb578b516001600160a01b038e16600090815260016020526040902054611db19190613f74565b6001600160a01b038e166000908152600160205260409020555b611dd4336120b1565b15611e06578b5133600090815260026020526040902054611df59190613f74565b336000908152600260205260409020555b80158015611e12575081155b15611e2957611e296015548d5161120c9190613d87565b8c6001600160a01b0316336001600160a01b03167f39015fe519110ce3ccad418b153817407dc5312684839c8700af7436a80a07af8e51604051611e6f91815260200190565b60405180910390a35060019c9b505050505050505050505050565b60008351855114611ead5760405162461bcd60e51b8152600401610bba906140c8565b60155485518491600091611ec19190613d87565b90506000611ecf8284613f74565b90506000611edc336120b1565b90506000611ee933610c9e565b1515600115151490508234101580611efe5750805b80611f065750815b611f225760405162461bcd60e51b8152600401610bba90613e35565b611f2b87612d8c565b965080158015611f39575081155b15611f4857611f488488613242565b8080611f515750815b8015611f5c57508734115b15611f9d57336108fc611f6f8a3461417f565b6040518115909202916000818181858888f19350505050158015611f97573d6000803e3d6000fd5b50611fa6565b611fa6836131f8565b60005b8a51811015612030578a8181518110611fc457611fc4613f45565b60200260200101516001600160a01b03166108fc8b8381518110611fea57611fea613f45565b60200260200101519081150290604051600060405180830381858888f1935050505015801561201d573d6000803e3d6000fd5b508061202881613f5b565b915050611fa9565b508115612064578951336000908152600260205260409020546120539190613f74565b336000908152600260205260409020555b8951604080519182526020820187905233917f96280f1b9a54271a5ff3d2bc027d857d9386da43de7540d42b8b73180a15864a910160405180910390a25060019998505050505050505050565b6001600160a01b031660009081526002602052604090205460641190565b6000610b866001600f5484612c52565b600080546001600160a01b0316331461210a5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03831660009081526009602052604090205460ff1661212f57600080fd5b6001600160a01b0383166000908152600c60205260409081902090518390600e9061215b9084906140bc565b90815260405190819003602001902055506001905092915050565b6000612181336121f1565b6121cd5760405162461bcd60e51b815260206004820152601960248201527f4e6f206d656d6265727368697020746f207472616e73666572000000000000006044820152606401610bba565b6121db4263bbf81e00613f74565b3360009081526004602052604090205550600190565b601654604051633a28175360e21b81526001600160a01b0383811660048301526000921690819063e8a05d4c90602401602060405180830381865afa15801561223e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122629190614149565b9392505050565b600080546001600160a01b031633146122945760405162461bcd60e51b8152600401610bba90613d29565b6000851180156122a357508385105b80156122ae57508284105b80156122b957508183105b6122c257600080fd5b50600f93909355601091909155601155601255600190565b600080546001600160a01b031633146123055760405162461bcd60e51b8152600401610bba90613d29565b50601355600190565b6001600160a01b03811660009081526006602052604081205460ff1680610c905750506001600160a01b031660009081526008602052604090205460ff1690565b600061235a82610cdf565b15612385576001600160a01b038216600090815260016020526040902054606490612262908261417f565b506000919050565b6000546001600160a01b031633146123b75760405162461bcd60e51b8152600401610bba90613d29565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b86618e9460125484612c52565b600080546001600160a01b031633146124155760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260076020526040902055600190565b6000612441826120b1565b15612385576001600160a01b038216600090815260026020526040902054606490612262908261417f565b600d60205260009081526040902080546117c790613ff0565b600080546001600160a01b031633146124b05760405162461bcd60e51b8152600401610bba90613d29565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285919082169063a9059cbb906044016020604051808303816000875af1158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614149565b507ee763f7778b8ceef7270c89b7d1df1008b0e482da39c43831417733af96fb0d85858560405161255993929190613fcc565b60405180910390a1506001949350505050565b600080546001600160a01b031633146125975760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260036020526040902055600190565b600080546001600160a01b031633146125e35760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526005602052604090205460ff1661264b5760405162461bcd60e51b815260206004820152601860248201527f4e6f742061206772616e746564206d656d6265727368697000000000000000006044820152606401610bba565b506001600160a01b03166000908152600560205260409020805460ff19169055600190565b600080546001600160a01b0316331461269b5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03841660009081526009602052604090205460ff16156127045760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320616c726561647920616e20616666696c696174652e6044820152606401610bba565b6001600160a01b03841661275a5760405162461bcd60e51b815260206004820152601860248201527f307830302061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610bba565b600b8360405161276a9190614196565b9081526040519081900360200190205460ff16156127ca5760405162461bcd60e51b815260206004820152601e60248201527f416666696c6961746520636f646520616c7265616479206578697374732100006044820152606401610bba565b606482111580156127db5750600082115b6128275760405162461bcd60e51b815260206004820181905260248201527f50657263656e74616765206d757374206265203e2030202626203c3d203130306044820152606401610bba565b6001600b846040516128399190614196565b908152604080519182900360209081018320805494151560ff199586161790556001600160a01b038816600090815260099091522080549092166001179091558490600a90612889908690614196565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039485161790559186166000908152600c82529190912084516128d2928601906135ac565b5081600e846040516128e49190614196565b90815260405190819003602001812091909155612902908490614196565b604051908190038120906001600160a01b038616907ff30f92c3d1eddb3772622c3b7d6a3985a8de818f7eebd5cef6650ee86d5ddbce90600090a35060019392505050565b604051636eb1769f60e11b81526001600160a01b038381166004830152306024830152600091839182169063dd62ed3e90604401602060405180830381865afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc9190614166565b949350505050565b6000546001600160a01b031633146129ee5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03811615801590612a1457506000546001600160a01b03828116911614155b612a1d57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612a838361230e565b15612aca5760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b612ad382612d8c565b91506000612ae084610c40565b905080341015612b3c5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f7567682066756e64732073656e7420666f72206c697374696e6044820152606760f81b6064820152608401610bba565b6001600160a01b0384166000908152600660205260409020805460ff19166001179055612b68816131f8565b612b728184613242565b5060019392505050565b600080546001600160a01b03163314612ba75760405162461bcd60e51b8152600401610bba90613d29565b612bb082610c9e565b1515600103612c015760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6001600160a01b038216600081815260056020526040808220805460ff19166001179055517fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb0095159190a2506001919050565b6000612c5d33610c9e565b1515600103612cae5760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6000612cba3385610d6a565b905080341015612cc98261341d565b612cd23461341d565b604051602001612ce39291906141b2565b60405160208183030381529060405290612d105760405162461bcd60e51b8152600401610bba9190613a52565b50612d1e8562015180613d87565b612d289042613f74565b33600090815260046020526040902055612d4183612d8c565b9250612d4c816131f8565b612d568184613242565b60405133907fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb00951590600090a2506001949350505050565b336000908152600d602052604090208054606091612e4d91612dad90613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd990613ff0565b8015612e265780601f10612dfb57610100808354040283529160200191612e26565b820191906000526020600020905b815481529060010190602001808311612e0957829003601f168201915b5050505050604051806040016040528060048152602001631d9bda5960e21b815250613549565b80612e95575060096000600a84604051612e679190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff16155b15612ef45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d909152929092209051612ed292906135ac565b50506040805180820190915260048152631d9bda5960e21b6020820152919050565b612f0d8260405180602001604052806000815250613549565b158015612fc75750336000908152600d602052604090208054612fc79190612f3490613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6090613ff0565b8015612fad5780601f10612f8257610100808354040283529160200191612fad565b820191906000526020600020905b815481529060010190602001808311612f9057829003601f168201915b505050505060405180602001604052806000815250613549565b8015612ff25750600b82604051612fde9190614196565b9081526040519081900360200190205460ff165b1561307157336001600160a01b0316600a836040516130119190614196565b908152604051908190036020019020546001600160a01b03160361304f5750506040805180820190915260048152631d9bda5960e21b602082015290565b336000908152600d60209081526040909120835161306f928501906135ac565b505b61308a8260405180602001604052806000815250613549565b80156130b25750336000908152600d6020526040902080546130b09190612f3490613ff0565b155b1561315257336000908152600d6020526040902080546130d190613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546130fd90613ff0565b801561314a5780601f1061311f5761010080835404028352916020019161314a565b820191906000526020600020905b81548152906001019060200180831161312d57829003601f168201915b505050505091505b61316b8260405180602001604052806000815250613549565b806131965750600b826040516131819190614196565b9081526040519081900360200190205460ff16155b156131f45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d9091529290922090516131d392906135ac565b50604051806040016040528060048152602001631d9bda5960e21b81525091505b5090565b8034111561323f57600061320c823461417f565b604051909150339082156108fc029083906000818181858888f1935050505015801561323c573d6000803e3d6000fd5b50505b50565b61326881604051806040016040528060048152602001631d9bda5960e21b815250613549565b1580156132b1575060096000600a836040516132849190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff165b156133e45760006064600e836040516132ca9190614196565b908152602001604051809103902054846132e49190613d87565b6132ee9190613da6565b6000549091506001600160a01b03166108fc61330a838661417f565b6040518115909202916000818181858888f19350505050158015613332573d6000803e3d6000fd5b50600a826040516133439190614196565b908152604051908190036020018120546001600160a01b03169082156108fc029083906000818181858888f19350505050158015613385573d6000803e3d6000fd5b50600a826040516133969190614196565b90815260405160209181900382018120548382526001600160a01b0316917f885e6f6235626292940f78c947a331f4c7c1d7f50a48b38092cf546bc9c7907a910160405180910390a2505050565b600080546040516001600160a01b039091169184156108fc02918591818181858888f1935050505015801561323c573d6000803e3d6000fd5b6060816000036134445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561346e578061345881613f5b565b91506134679050600a83613da6565b9150613448565b60008167ffffffffffffffff8111156134895761348961363c565b6040519080825280601f01601f1916602001820160405280156134b3576020820181803683370190505b509050815b8515613540576134c960018261417f565b905060006134d8600a88613da6565b6134e390600a613d87565b6134ed908861417f565b6134f890603061422c565b905060008160f81b90508084848151811061351557613515613f45565b60200101906001600160f81b031916908160001a905350613537600a89613da6565b975050506134b8565b50949350505050565b6000808360405160200161355d9190614196565b6040516020818303038152906040528051906020012090506000836040516020016135889190614196565b60408051601f19818403018152919052805160209091012091909114949350505050565b8280546135b890613ff0565b90600052602060002090601f0160209004810192826135da5760008555613620565b82601f106135f357805160ff1916838001178555613620565b82800160010185558215613620579182015b82811115613620578251825591602001919060010190613605565b506131f49291505b808211156131f45760008155600101613628565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561367b5761367b61363c565b604052919050565b600082601f83011261369457600080fd5b813567ffffffffffffffff8111156136ae576136ae61363c565b6136c1601f8201601f1916602001613652565b8181528460208386010111156136d657600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561370557600080fd5b813567ffffffffffffffff81111561371c57600080fd5b6129bc84828501613683565b80356001600160a01b0381168114610c3b57600080fd5b60006020828403121561375157600080fd5b61226282613728565b6000806040838503121561376d57600080fd5b61377683613728565b946020939093013593505050565b60006020828403121561379657600080fd5b5035919050565b600067ffffffffffffffff8211156137b7576137b761363c565b5060051b60200190565b600082601f8301126137d257600080fd5b813560206137e76137e28361379d565b613652565b82815260059290921b8401810191818101908684111561380657600080fd5b8286015b848110156138285761381b81613728565b835291830191830161380a565b509695505050505050565b600082601f83011261384457600080fd5b813560206138546137e28361379d565b82815260059290921b8401810191818101908684111561387357600080fd5b8286015b848110156138285780358352918301918301613877565b801515811461323f57600080fd5b8035610c3b8161388e565b60008060008060008060c087890312156138c057600080fd5b6138c987613728565b9550602087013567ffffffffffffffff808211156138e657600080fd5b6138f28a838b016137c1565b9650604089013591508082111561390857600080fd5b6139148a838b01613833565b9550606089013591508082111561392a57600080fd5b6139368a838b01613833565b945061394460808a0161389c565b935060a089013591508082111561395a57600080fd5b5061396789828a01613683565b9150509295509295509295565b600080600080600060a0868803121561398c57600080fd5b61399586613728565b9450602086013567ffffffffffffffff808211156139b257600080fd5b6139be89838a016137c1565b955060408801359150808211156139d457600080fd5b6139e089838a01613833565b9450606088013591506139f28261388e565b90925060808701359080821115613a0857600080fd5b50613a1588828901613683565b9150509295509295909350565b60005b83811015613a3d578181015183820152602001613a25565b83811115613a4c576000848401525b50505050565b6020815260008251806020840152613a71816040850160208701613a22565b601f01601f19169190910160400192915050565b600080600080600080600060e0888a031215613aa057600080fd5b613aa988613728565b9650602088013567ffffffffffffffff80821115613ac657600080fd5b613ad28b838c016137c1565b975060408a0135915080821115613ae857600080fd5b613af48b838c01613833565b965060608a0135955060808a01359150613b0d8261388e565b90935060a089013590613b1f8261388e565b90925060c08901359080821115613b3557600080fd5b50613b428a828b01613683565b91505092959891949750929550565b60008060008060808587031215613b6757600080fd5b843567ffffffffffffffff80821115613b7f57600080fd5b613b8b888389016137c1565b95506020870135915080821115613ba157600080fd5b613bad88838901613833565b9450604087013593506060870135915080821115613bca57600080fd5b50613bd787828801613683565b91505092959194509250565b60008060008060808587031215613bf957600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613c2a57600080fd5b613c3384613728565b9250613c4160208501613728565b9150604084013590509250925092565b600080600060608486031215613c6657600080fd5b613c6f84613728565b9250602084013567ffffffffffffffff811115613c8b57600080fd5b613c9786828701613683565b925050604084013590509250925092565b60008060408385031215613cbb57600080fd5b613cc483613728565b9150613cd260208401613728565b90509250929050565b60008060408385031215613cee57600080fd5b613cf783613728565b9150602083013567ffffffffffffffff811115613d1357600080fd5b613d1f85828601613683565b9150509250929050565b60208082526028908201527f46756e6374696f6e207265737472696374656420746f206f776e6572206f662060408201526718dbdb9d1c9858dd60c21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613da157613da1613d71565b500290565b600082613dc357634e487b7160e01b600052601260045260246000fd5b500490565b60208082526047908201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460408201527f6f74616c206e756d626572206f66204e46542049447320617265206e6f74207460608201526668652073616d6560c81b608082015260a00190565b60208082526027908201527f4e6f7420656e6f7567682066756e64732073656e742077697468207472616e73604082015266616374696f6e2160c81b606082015260800190565b600081518084526020808501945080840160005b83811015613eb55781516001600160a01b031687529582019590820190600101613e90565b509495945050505050565b600081518084526020808501945080840160005b83811015613eb557815187529582019590820190600101613ed4565b6001600160a01b0385168152608060208201819052600090613f1490830186613e7c565b8281036040840152613f268186613ec0565b90508281036060840152613f3a8185613ec0565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201613f6d57613f6d613d71565b5060010190565b60008219821115613f8757613f87613d71565b500190565b6001600160a01b0384168152606060208201819052600090613fb090830185613e7c565b8281036040840152613fc28185613ec0565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600181811c9082168061400457607f821691505b602082108103610dbf57634e487b7160e01b600052602260045260246000fd5b8054600090600181811c908083168061403e57607f831692505b6020808410820361405f57634e487b7160e01b600052602260045260246000fd5b8180156140735760018114614084576140b0565b60ff198616895284890196506140b0565b876000528160002060005b868110156140a85781548b82015290850190830161408f565b505084890196505b50505050505092915050565b60006122628284614024565b60208082526033908201527f546f74616c206e756d626572206f6620726563697069656e747320616e642076604082015272185b1d595cc8185c99481b9bdd08195c5d585b606a1b606082015260800190565b60408152600061412e6040830185613e7c565b82810360208401526141408185613ec0565b95945050505050565b60006020828403121561415b57600080fd5b81516122628161388e565b60006020828403121561417857600080fd5b5051919050565b60008282101561419157614191613d71565b500390565b600082516141a8818460208701613a22565b9190910192915050565b750383932b6b4bab6a6b2b6b132b9103332b29034b99d160551b8152600083516141e3816016850160208801613a22565b7f2e204e6f7420656e6f7567682066756e64732073656e742e2000000000000000601691840191820152835161422081602f840160208801613a22565b01602f01949350505050565b600060ff821660ff84168060ff0382111561424957614249613d71565b01939250505056fea264697066735822122035c5e8f3553979e1813663e7cc74e13ddf5806e704cbbd11a72f3fd977376b3a64736f6c634300080d0033

Deployed Bytecode

0x60806040526004361061039b5760003560e01c80636dd77649116101dc578063ac5b2bbc11610102578063df3b0ad1116100a0578063f2fde38b1161006f578063f2fde38b14610af6578063f519983514610b16578063f86af85114610b43578063fec5c0c614610b5657600080fd5b8063df3b0ad114610a8a578063e24f6a9714610aa0578063e5a8ec5b14610ac0578063ea7ee01014610ad657600080fd5b8063bcdd1e13116100dc578063bcdd1e13146109fa578063be6630c814610a1a578063ceb10f0b14610a4a578063d34937db14610a6a57600080fd5b8063ac5b2bbc146109a4578063b1867685146109c4578063bb12db5c146109e457600080fd5b80638ad95cf11161017a57806398adf5771161014957806398adf57714610939578063a39a2b761461095b578063a7296ee914610971578063a7ced8e21461098457600080fd5b80638ad95cf1146108b95780638da5cb5b146108d95780638faea9a7146108f95780638ffd58ad1461091957600080fd5b806386a9a599116101b657806386a9a5991461082e578063893d20e81461084e578063896bac231461086c5780638a53a1301461088c57600080fd5b80636dd77649146107e657806375f1a95a146107f957806385fc0de71461081957600080fd5b806339cb9ba8116102c15780634a4a2feb1161025f578063590925e21161022e578063590925e214610728578063593d98b114610769578063638c5da9146107895780636cca7d3c146107b957600080fd5b80634a4a2feb146106a55780634a4df559146106d25780634fa85186146106e5578063583a23901461071557600080fd5b80633d2375f91161029b5780633d2375f91461060a578063428b52f81461064557806343a92b41146106725780634930df8f1461069257600080fd5b806339cb9ba8146105c15780633aaff47f146105d45780633b9ff843146105ea57600080fd5b80631e93a9f2116103395780632c4e722e116103085780632c4e722e146105405780632f5f1a341461055657806334fcf4371461058e5780633671caa0146105ae57600080fd5b80631e93a9f2146104d557806323a0fb02146104eb57806324600fc31461050b5780632a769eb41461052057600080fd5b80630e160255116103755780630e1602551461042d57806317077fb71461046557806319acc3671461048557806319d30a40146104b557600080fd5b806306d7d80f146103aa578063088ea102146103d25780630ad92c311461040d57600080fd5b366103a557600080fd5b600080fd5b6103bd6103b83660046136f3565b610b76565b60405190151581526020015b60405180910390f35b3480156103de57600080fd5b506103ff6103ed36600461373f565b60076020526000908152604090205481565b6040519081526020016103c9565b34801561041957600080fd5b506103bd61042836600461373f565b610b8f565b34801561043957600080fd5b506103ff6104483660046136f3565b8051602081830181018051600e8252928201919093012091525481565b34801561047157600080fd5b506103ff61048036600461373f565b610c40565b34801561049157600080fd5b506103bd6104a036600461373f565b60056020526000908152604090205460ff1681565b3480156104c157600080fd5b506103bd6104d036600461373f565b610c9e565b3480156104e157600080fd5b506103ff60135481565b3480156104f757600080fd5b506103bd61050636600461373f565b610cdf565b34801561051757600080fd5b506103bd610cfd565b34801561052c57600080fd5b506103ff61053b36600461375a565b610d6a565b34801561054c57600080fd5b506103ff60145481565b34801561056257600080fd5b50601654610576906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b34801561059a57600080fd5b506103bd6105a9366004613784565b610dc5565b6103bd6105bc3660046138a7565b610e6b565b6103bd6105cf366004613974565b611272565b3480156105e057600080fd5b506103ff60125481565b3480156105f657600080fd5b506103bd61060536600461373f565b6115a2565b34801561061657600080fd5b506103bd6106253660046136f3565b8051602081830181018051600b8252928201919093012091525460ff1681565b34801561065157600080fd5b506103ff61066036600461373f565b60036020526000908152604090205481565b34801561067e57600080fd5b506103bd61068d36600461373f565b611703565b6103bd6106a03660046136f3565b61179e565b3480156106b157600080fd5b506106c56106c036600461373f565b6117ae565b6040516103c99190613a52565b6103bd6106e0366004613a85565b611848565b3480156106f157600080fd5b506103bd61070036600461373f565b60096020526000908152604090205460ff1681565b6103bd610723366004613b51565b611e8a565b34801561073457600080fd5b506105766107433660046136f3565b8051602081830181018051600a825292820191909301209152546001600160a01b031681565b34801561077557600080fd5b506103bd61078436600461373f565b6120b1565b34801561079557600080fd5b506103bd6107a436600461373f565b60066020526000908152604090205460ff1681565b3480156107c557600080fd5b506103ff6107d436600461373f565b60016020526000908152604090205481565b6103bd6107f43660046136f3565b6120cf565b34801561080557600080fd5b506103bd61081436600461375a565b6120df565b34801561082557600080fd5b506103bd612176565b34801561083a57600080fd5b506103bd61084936600461373f565b6121f1565b34801561085a57600080fd5b506000546001600160a01b0316610576565b34801561087857600080fd5b506103bd610887366004613be3565b612269565b34801561089857600080fd5b506103ff6108a736600461373f565b60026020526000908152604090205481565b3480156108c557600080fd5b506103bd6108d4366004613784565b6122da565b3480156108e557600080fd5b50600054610576906001600160a01b031681565b34801561090557600080fd5b506103bd61091436600461373f565b61230e565b34801561092557600080fd5b506103ff61093436600461373f565b61234f565b34801561094557600080fd5b5061095961095436600461373f565b61238d565b005b34801561096757600080fd5b506103ff60155481565b6103bd61097f3660046136f3565b6123d9565b34801561099057600080fd5b506103bd61099f36600461375a565b6123ea565b3480156109b057600080fd5b506103ff6109bf36600461373f565b612436565b3480156109d057600080fd5b506106c56109df36600461373f565b61246c565b3480156109f057600080fd5b506103ff60105481565b348015610a0657600080fd5b506103bd610a15366004613c15565b612485565b348015610a2657600080fd5b506103bd610a3536600461373f565b60086020526000908152604090205460ff1681565b348015610a5657600080fd5b506103bd610a6536600461375a565b61256c565b348015610a7657600080fd5b506103bd610a8536600461373f565b6125b8565b348015610a9657600080fd5b506103ff60115481565b348015610aac57600080fd5b506103bd610abb366004613c51565b612670565b348015610acc57600080fd5b506103ff600f5481565b348015610ae257600080fd5b506103ff610af1366004613ca8565b612947565b348015610b0257600080fd5b50610959610b1136600461373f565b6129c4565b348015610b2257600080fd5b506103ff610b3136600461373f565b60046020526000908152604090205481565b6103bd610b51366004613cdb565b612a78565b348015610b6257600080fd5b506103bd610b7136600461373f565b612b7c565b6000610b86601f60115484612c52565b50600192915050565b600080546001600160a01b03163314610bc35760405162461bcd60e51b8152600401610bba90613d29565b60405180910390fd5b610bcc8261230e565b15610c135760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b506001600160a01b0381166000908152600860205260409020805460ff191660019081179091555b919050565b6001600160a01b03811660009081526007602052604081205415610c96576001600160a01b038216600090815260076020526040902054601354606491610c8691613d87565b610c909190613da6565b92915050565b505060135490565b6001600160a01b03811660009081526004602052604081205442111580610c905750506001600160a01b031660009081526005602052604090205460ff1690565b6001600160a01b031660009081526001602052604090205460641190565b600080546001600160a01b03163314610d285760405162461bcd60e51b8152600401610bba90613d29565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610d62573d6000803e3d6000fd5b506001905090565b6001600160a01b03821660009081526003602052604081205415610dbf576001600160a01b038316600090815260036020526040902054606490610dae9084613d87565b610db89190613da6565b9050610c90565b50919050565b600080546001600160a01b03163314610df05760405162461bcd60e51b8152600401610bba90613d29565b6014548214158015610e025750600082115b610e0b57600080fd5b60145460408051918252602082018490527f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f7186910160405180910390a16014829055670de0b6b3a7640000610e5f8382613da6565b60155550600192915050565b60008451865114610e8e5760405162461bcd60e51b8152600401610bba90613dc8565b8351865114610f155760405162461bcd60e51b815260206004820152604760248201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460448201527f6f74616c206e756d626572206f6620616d6f756e747320617265206e6f74207460648201526668652073616d6560c81b608482015260a401610bba565b6000610f2083612d8c565b60155488519192508991600091610f3691613d87565b90506000610f4333610c9e565b80610f525750610f528b61230e565b90506000610f5f8c610cdf565b8015610f6f5750610f6f336120b1565b90508234101580610f7d5750805b80610f855750815b610fa15760405162461bcd60e51b8152600401610bba90613e35565b8080610faa5750815b8015610fb65750600034115b15610fed5760405133903480156108fc02916000818181858888f19350505050158015610fe7573d6000803e3d6000fd5b50610ff6565b610ff6836131f8565b8715611065576040516322e31d0560e11b81526001600160a01b038516906345c63a0a9061102e9033908f908f908f90600401613ef0565b600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b50505050611161565b60005b8b5181101561115f57846001600160a01b031663f242432a338e848151811061109357611093613f45565b60200260200101518e85815181106110ad576110ad613f45565b60200260200101518e86815181106110c7576110c7613f45565b60209081029190910101516040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260a06084820152600060a482015260c401600060405180830381600087803b15801561113457600080fd5b505af1158015611148573d6000803e3d6000fd5b50505050808061115790613f5b565b915050611068565b505b61116a8c610cdf565b156111ae578a516001600160a01b038d166000908152600160205260409020546111949190613f74565b6001600160a01b038d166000908152600160205260409020555b6111b7336120b1565b156111e9578a51336000908152600260205260409020546111d89190613f74565b336000908152600260205260409020555b801580156111f5575081155b15611212576112126015548c5161120c9190613d87565b86613242565b8b6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768d5160405161125891815260200190565b60405180910390a35060019b9a5050505050505050505050565b600083518551146112955760405162461bcd60e51b8152600401610bba90613dc8565b60006112a083612d8c565b601554875191925088916000916112b691613d87565b905060006112c333610c9e565b806112d257506112d28a61230e565b905060006112df8b610cdf565b80156112ef57506112ef336120b1565b905082341015806112fd5750805b806113055750815b6113215760405162461bcd60e51b8152600401610bba90613e35565b808061132a5750815b80156113365750600034115b1561136d5760405133903480156108fc02916000818181858888f19350505050158015611367573d6000803e3d6000fd5b50611376565b611376836131f8565b87156113e3576040516304b1cddf60e31b81526001600160a01b0385169063258e6ef8906113ac9033908e908e90600401613f8c565b600060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b50505050611498565b60005b8a5181101561149657846001600160a01b03166323b872dd338d848151811061141157611411613f45565b60200260200101518d858151811061142b5761142b613f45565b60200260200101516040518463ffffffff1660e01b815260040161145193929190613fcc565b600060405180830381600087803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b50505050808061148e90613f5b565b9150506113e6565b505b6114a18b610cdf565b156114e55789516001600160a01b038c166000908152600160205260409020546114cb9190613f74565b6001600160a01b038c166000908152600160205260409020555b6114ee336120b1565b156115205789513360009081526002602052604090205461150f9190613f74565b336000908152600260205260409020555b8015801561152c575081155b15611543576115436015548b5161120c9190613d87565b8a6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768c5160405161158991815260200190565b60405180910390a35060019a9950505050505050505050565b600080546001600160a01b031633146115cd5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526009602052604090205460ff166115f257600080fd5b6001600160a01b0382166000908152600960209081526040808320805460ff19169055600c9091528082209051600a9161162b916140bc565b908152604080516020928190038301812080546001600160a01b0319166001600160a01b039586161790559285166000908152600c909252902061166e916140bc565b604051908190038120906001600160a01b038416907f4ddc7b8659a2faf8698c810ab0219aa981bfccb47c036d3cc7ae8a32c15dc4ec90600090a3604080518082018252601e81527f4e6f206c6f6e67657220616e20616666696c6961746520706172746e6572000060208083019182526001600160a01b0386166000908152600c909152929092209051610b8692906135ac565b600080546001600160a01b0316331461172e5760405162461bcd60e51b8152600401610bba90613d29565b6117378261230e565b6117795760405162461bcd60e51b815260206004820152601360248201527224b9903737ba103634b9ba32b2103a37b5b2b760691b6044820152606401610bba565b506001600160a01b03166000908152600860205260409020805460ff19169055600190565b6000610b86600760105484612c52565b600c60205260009081526040902080546117c790613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546117f390613ff0565b80156118405780601f1061181557610100808354040283529160200191611840565b820191906000526020600020905b81548152906001019060200180831161182357829003601f168201915b505050505081565b60008061185483612d8c565b875189519192508a911461187a5760405162461bcd60e51b8152600401610bba906140c8565b60006015548a5161188b9190613d87565b9050600061189833610c9e565b806118a757506118a78c61230e565b905060006118b48d610cdf565b80156118c457506118c4336120b1565b905082341015806118d957506118d98d610cdf565b806118e857506118e8336120b1565b806118f05750815b61190c5760405162461bcd60e51b8152600401610bba90613e35565b80806119155750815b80156119215750600034115b156119585760405133903480156108fc02916000818181858888f19350505050158015611952573d6000803e3d6000fd5b50611961565b611961836131f8565b8715611a2e576040516323b872dd60e01b81526001600160a01b038516906323b872dd9061199790339030908f90600401613fcc565b600060405180830381600087803b1580156119b157600080fd5b505af11580156119c5573d6000803e3d6000fd5b5050604051633ae4b60360e21b81526001600160a01b038716925063eb92d80c91506119f7908f908f9060040161411b565b600060405180830381600087803b158015611a1157600080fd5b505af1158015611a25573d6000803e3d6000fd5b50505050611d7e565b88611cc9576040516323b872dd60e01b81526001600160a01b038516906323b872dd90611a6390339030908f90600401613fcc565b600060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b5050505060005b8c51811015611b6b57846001600160a01b031663a9059cbb8e8381518110611ac257611ac2613f45565b60200260200101518e8481518110611adc57611adc613f45565b60200260200101516040518363ffffffff1660e01b8152600401611b159291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b589190614149565b5080611b6381613f5b565b915050611a98565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a08231906024016020604051808303816000875af1158015611bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd99190614166565b1115611cc4576040516370a0823160e01b81523060048201526001600160a01b0385169063a9059cbb90339083906370a08231906024016020604051808303816000875af1158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c539190614166565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc29190614149565b505b611d7e565b60005b8c51811015611d7c57846001600160a01b03166323b872dd338f8481518110611cf757611cf7613f45565b60200260200101518f8581518110611d1157611d11613f45565b60200260200101516040518463ffffffff1660e01b8152600401611d3793929190613fcc565b600060405180830381600087803b158015611d5157600080fd5b505af1158015611d65573d6000803e3d6000fd5b505050508080611d7490613f5b565b915050611ccc565b505b611d878d610cdf565b15611dcb578b516001600160a01b038e16600090815260016020526040902054611db19190613f74565b6001600160a01b038e166000908152600160205260409020555b611dd4336120b1565b15611e06578b5133600090815260026020526040902054611df59190613f74565b336000908152600260205260409020555b80158015611e12575081155b15611e2957611e296015548d5161120c9190613d87565b8c6001600160a01b0316336001600160a01b03167f39015fe519110ce3ccad418b153817407dc5312684839c8700af7436a80a07af8e51604051611e6f91815260200190565b60405180910390a35060019c9b505050505050505050505050565b60008351855114611ead5760405162461bcd60e51b8152600401610bba906140c8565b60155485518491600091611ec19190613d87565b90506000611ecf8284613f74565b90506000611edc336120b1565b90506000611ee933610c9e565b1515600115151490508234101580611efe5750805b80611f065750815b611f225760405162461bcd60e51b8152600401610bba90613e35565b611f2b87612d8c565b965080158015611f39575081155b15611f4857611f488488613242565b8080611f515750815b8015611f5c57508734115b15611f9d57336108fc611f6f8a3461417f565b6040518115909202916000818181858888f19350505050158015611f97573d6000803e3d6000fd5b50611fa6565b611fa6836131f8565b60005b8a51811015612030578a8181518110611fc457611fc4613f45565b60200260200101516001600160a01b03166108fc8b8381518110611fea57611fea613f45565b60200260200101519081150290604051600060405180830381858888f1935050505015801561201d573d6000803e3d6000fd5b508061202881613f5b565b915050611fa9565b508115612064578951336000908152600260205260409020546120539190613f74565b336000908152600260205260409020555b8951604080519182526020820187905233917f96280f1b9a54271a5ff3d2bc027d857d9386da43de7540d42b8b73180a15864a910160405180910390a25060019998505050505050505050565b6001600160a01b031660009081526002602052604090205460641190565b6000610b866001600f5484612c52565b600080546001600160a01b0316331461210a5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03831660009081526009602052604090205460ff1661212f57600080fd5b6001600160a01b0383166000908152600c60205260409081902090518390600e9061215b9084906140bc565b90815260405190819003602001902055506001905092915050565b6000612181336121f1565b6121cd5760405162461bcd60e51b815260206004820152601960248201527f4e6f206d656d6265727368697020746f207472616e73666572000000000000006044820152606401610bba565b6121db4263bbf81e00613f74565b3360009081526004602052604090205550600190565b601654604051633a28175360e21b81526001600160a01b0383811660048301526000921690819063e8a05d4c90602401602060405180830381865afa15801561223e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122629190614149565b9392505050565b600080546001600160a01b031633146122945760405162461bcd60e51b8152600401610bba90613d29565b6000851180156122a357508385105b80156122ae57508284105b80156122b957508183105b6122c257600080fd5b50600f93909355601091909155601155601255600190565b600080546001600160a01b031633146123055760405162461bcd60e51b8152600401610bba90613d29565b50601355600190565b6001600160a01b03811660009081526006602052604081205460ff1680610c905750506001600160a01b031660009081526008602052604090205460ff1690565b600061235a82610cdf565b15612385576001600160a01b038216600090815260016020526040902054606490612262908261417f565b506000919050565b6000546001600160a01b031633146123b75760405162461bcd60e51b8152600401610bba90613d29565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b86618e9460125484612c52565b600080546001600160a01b031633146124155760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260076020526040902055600190565b6000612441826120b1565b15612385576001600160a01b038216600090815260026020526040902054606490612262908261417f565b600d60205260009081526040902080546117c790613ff0565b600080546001600160a01b031633146124b05760405162461bcd60e51b8152600401610bba90613d29565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285919082169063a9059cbb906044016020604051808303816000875af1158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614149565b507ee763f7778b8ceef7270c89b7d1df1008b0e482da39c43831417733af96fb0d85858560405161255993929190613fcc565b60405180910390a1506001949350505050565b600080546001600160a01b031633146125975760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260036020526040902055600190565b600080546001600160a01b031633146125e35760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526005602052604090205460ff1661264b5760405162461bcd60e51b815260206004820152601860248201527f4e6f742061206772616e746564206d656d6265727368697000000000000000006044820152606401610bba565b506001600160a01b03166000908152600560205260409020805460ff19169055600190565b600080546001600160a01b0316331461269b5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03841660009081526009602052604090205460ff16156127045760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320616c726561647920616e20616666696c696174652e6044820152606401610bba565b6001600160a01b03841661275a5760405162461bcd60e51b815260206004820152601860248201527f307830302061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610bba565b600b8360405161276a9190614196565b9081526040519081900360200190205460ff16156127ca5760405162461bcd60e51b815260206004820152601e60248201527f416666696c6961746520636f646520616c7265616479206578697374732100006044820152606401610bba565b606482111580156127db5750600082115b6128275760405162461bcd60e51b815260206004820181905260248201527f50657263656e74616765206d757374206265203e2030202626203c3d203130306044820152606401610bba565b6001600b846040516128399190614196565b908152604080519182900360209081018320805494151560ff199586161790556001600160a01b038816600090815260099091522080549092166001179091558490600a90612889908690614196565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039485161790559186166000908152600c82529190912084516128d2928601906135ac565b5081600e846040516128e49190614196565b90815260405190819003602001812091909155612902908490614196565b604051908190038120906001600160a01b038616907ff30f92c3d1eddb3772622c3b7d6a3985a8de818f7eebd5cef6650ee86d5ddbce90600090a35060019392505050565b604051636eb1769f60e11b81526001600160a01b038381166004830152306024830152600091839182169063dd62ed3e90604401602060405180830381865afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc9190614166565b949350505050565b6000546001600160a01b031633146129ee5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03811615801590612a1457506000546001600160a01b03828116911614155b612a1d57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612a838361230e565b15612aca5760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b612ad382612d8c565b91506000612ae084610c40565b905080341015612b3c5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f7567682066756e64732073656e7420666f72206c697374696e6044820152606760f81b6064820152608401610bba565b6001600160a01b0384166000908152600660205260409020805460ff19166001179055612b68816131f8565b612b728184613242565b5060019392505050565b600080546001600160a01b03163314612ba75760405162461bcd60e51b8152600401610bba90613d29565b612bb082610c9e565b1515600103612c015760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6001600160a01b038216600081815260056020526040808220805460ff19166001179055517fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb0095159190a2506001919050565b6000612c5d33610c9e565b1515600103612cae5760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6000612cba3385610d6a565b905080341015612cc98261341d565b612cd23461341d565b604051602001612ce39291906141b2565b60405160208183030381529060405290612d105760405162461bcd60e51b8152600401610bba9190613a52565b50612d1e8562015180613d87565b612d289042613f74565b33600090815260046020526040902055612d4183612d8c565b9250612d4c816131f8565b612d568184613242565b60405133907fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb00951590600090a2506001949350505050565b336000908152600d602052604090208054606091612e4d91612dad90613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd990613ff0565b8015612e265780601f10612dfb57610100808354040283529160200191612e26565b820191906000526020600020905b815481529060010190602001808311612e0957829003601f168201915b5050505050604051806040016040528060048152602001631d9bda5960e21b815250613549565b80612e95575060096000600a84604051612e679190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff16155b15612ef45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d909152929092209051612ed292906135ac565b50506040805180820190915260048152631d9bda5960e21b6020820152919050565b612f0d8260405180602001604052806000815250613549565b158015612fc75750336000908152600d602052604090208054612fc79190612f3490613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6090613ff0565b8015612fad5780601f10612f8257610100808354040283529160200191612fad565b820191906000526020600020905b815481529060010190602001808311612f9057829003601f168201915b505050505060405180602001604052806000815250613549565b8015612ff25750600b82604051612fde9190614196565b9081526040519081900360200190205460ff165b1561307157336001600160a01b0316600a836040516130119190614196565b908152604051908190036020019020546001600160a01b03160361304f5750506040805180820190915260048152631d9bda5960e21b602082015290565b336000908152600d60209081526040909120835161306f928501906135ac565b505b61308a8260405180602001604052806000815250613549565b80156130b25750336000908152600d6020526040902080546130b09190612f3490613ff0565b155b1561315257336000908152600d6020526040902080546130d190613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546130fd90613ff0565b801561314a5780601f1061311f5761010080835404028352916020019161314a565b820191906000526020600020905b81548152906001019060200180831161312d57829003601f168201915b505050505091505b61316b8260405180602001604052806000815250613549565b806131965750600b826040516131819190614196565b9081526040519081900360200190205460ff16155b156131f45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d9091529290922090516131d392906135ac565b50604051806040016040528060048152602001631d9bda5960e21b81525091505b5090565b8034111561323f57600061320c823461417f565b604051909150339082156108fc029083906000818181858888f1935050505015801561323c573d6000803e3d6000fd5b50505b50565b61326881604051806040016040528060048152602001631d9bda5960e21b815250613549565b1580156132b1575060096000600a836040516132849190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff165b156133e45760006064600e836040516132ca9190614196565b908152602001604051809103902054846132e49190613d87565b6132ee9190613da6565b6000549091506001600160a01b03166108fc61330a838661417f565b6040518115909202916000818181858888f19350505050158015613332573d6000803e3d6000fd5b50600a826040516133439190614196565b908152604051908190036020018120546001600160a01b03169082156108fc029083906000818181858888f19350505050158015613385573d6000803e3d6000fd5b50600a826040516133969190614196565b90815260405160209181900382018120548382526001600160a01b0316917f885e6f6235626292940f78c947a331f4c7c1d7f50a48b38092cf546bc9c7907a910160405180910390a2505050565b600080546040516001600160a01b039091169184156108fc02918591818181858888f1935050505015801561323c573d6000803e3d6000fd5b6060816000036134445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561346e578061345881613f5b565b91506134679050600a83613da6565b9150613448565b60008167ffffffffffffffff8111156134895761348961363c565b6040519080825280601f01601f1916602001820160405280156134b3576020820181803683370190505b509050815b8515613540576134c960018261417f565b905060006134d8600a88613da6565b6134e390600a613d87565b6134ed908861417f565b6134f890603061422c565b905060008160f81b90508084848151811061351557613515613f45565b60200101906001600160f81b031916908160001a905350613537600a89613da6565b975050506134b8565b50949350505050565b6000808360405160200161355d9190614196565b6040516020818303038152906040528051906020012090506000836040516020016135889190614196565b60408051601f19818403018152919052805160209091012091909114949350505050565b8280546135b890613ff0565b90600052602060002090601f0160209004810192826135da5760008555613620565b82601f106135f357805160ff1916838001178555613620565b82800160010185558215613620579182015b82811115613620578251825591602001919060010190613605565b506131f49291505b808211156131f45760008155600101613628565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561367b5761367b61363c565b604052919050565b600082601f83011261369457600080fd5b813567ffffffffffffffff8111156136ae576136ae61363c565b6136c1601f8201601f1916602001613652565b8181528460208386010111156136d657600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561370557600080fd5b813567ffffffffffffffff81111561371c57600080fd5b6129bc84828501613683565b80356001600160a01b0381168114610c3b57600080fd5b60006020828403121561375157600080fd5b61226282613728565b6000806040838503121561376d57600080fd5b61377683613728565b946020939093013593505050565b60006020828403121561379657600080fd5b5035919050565b600067ffffffffffffffff8211156137b7576137b761363c565b5060051b60200190565b600082601f8301126137d257600080fd5b813560206137e76137e28361379d565b613652565b82815260059290921b8401810191818101908684111561380657600080fd5b8286015b848110156138285761381b81613728565b835291830191830161380a565b509695505050505050565b600082601f83011261384457600080fd5b813560206138546137e28361379d565b82815260059290921b8401810191818101908684111561387357600080fd5b8286015b848110156138285780358352918301918301613877565b801515811461323f57600080fd5b8035610c3b8161388e565b60008060008060008060c087890312156138c057600080fd5b6138c987613728565b9550602087013567ffffffffffffffff808211156138e657600080fd5b6138f28a838b016137c1565b9650604089013591508082111561390857600080fd5b6139148a838b01613833565b9550606089013591508082111561392a57600080fd5b6139368a838b01613833565b945061394460808a0161389c565b935060a089013591508082111561395a57600080fd5b5061396789828a01613683565b9150509295509295509295565b600080600080600060a0868803121561398c57600080fd5b61399586613728565b9450602086013567ffffffffffffffff808211156139b257600080fd5b6139be89838a016137c1565b955060408801359150808211156139d457600080fd5b6139e089838a01613833565b9450606088013591506139f28261388e565b90925060808701359080821115613a0857600080fd5b50613a1588828901613683565b9150509295509295909350565b60005b83811015613a3d578181015183820152602001613a25565b83811115613a4c576000848401525b50505050565b6020815260008251806020840152613a71816040850160208701613a22565b601f01601f19169190910160400192915050565b600080600080600080600060e0888a031215613aa057600080fd5b613aa988613728565b9650602088013567ffffffffffffffff80821115613ac657600080fd5b613ad28b838c016137c1565b975060408a0135915080821115613ae857600080fd5b613af48b838c01613833565b965060608a0135955060808a01359150613b0d8261388e565b90935060a089013590613b1f8261388e565b90925060c08901359080821115613b3557600080fd5b50613b428a828b01613683565b91505092959891949750929550565b60008060008060808587031215613b6757600080fd5b843567ffffffffffffffff80821115613b7f57600080fd5b613b8b888389016137c1565b95506020870135915080821115613ba157600080fd5b613bad88838901613833565b9450604087013593506060870135915080821115613bca57600080fd5b50613bd787828801613683565b91505092959194509250565b60008060008060808587031215613bf957600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613c2a57600080fd5b613c3384613728565b9250613c4160208501613728565b9150604084013590509250925092565b600080600060608486031215613c6657600080fd5b613c6f84613728565b9250602084013567ffffffffffffffff811115613c8b57600080fd5b613c9786828701613683565b925050604084013590509250925092565b60008060408385031215613cbb57600080fd5b613cc483613728565b9150613cd260208401613728565b90509250929050565b60008060408385031215613cee57600080fd5b613cf783613728565b9150602083013567ffffffffffffffff811115613d1357600080fd5b613d1f85828601613683565b9150509250929050565b60208082526028908201527f46756e6374696f6e207265737472696374656420746f206f776e6572206f662060408201526718dbdb9d1c9858dd60c21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613da157613da1613d71565b500290565b600082613dc357634e487b7160e01b600052601260045260246000fd5b500490565b60208082526047908201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460408201527f6f74616c206e756d626572206f66204e46542049447320617265206e6f74207460608201526668652073616d6560c81b608082015260a00190565b60208082526027908201527f4e6f7420656e6f7567682066756e64732073656e742077697468207472616e73604082015266616374696f6e2160c81b606082015260800190565b600081518084526020808501945080840160005b83811015613eb55781516001600160a01b031687529582019590820190600101613e90565b509495945050505050565b600081518084526020808501945080840160005b83811015613eb557815187529582019590820190600101613ed4565b6001600160a01b0385168152608060208201819052600090613f1490830186613e7c565b8281036040840152613f268186613ec0565b90508281036060840152613f3a8185613ec0565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201613f6d57613f6d613d71565b5060010190565b60008219821115613f8757613f87613d71565b500190565b6001600160a01b0384168152606060208201819052600090613fb090830185613e7c565b8281036040840152613fc28185613ec0565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600181811c9082168061400457607f821691505b602082108103610dbf57634e487b7160e01b600052602260045260246000fd5b8054600090600181811c908083168061403e57607f831692505b6020808410820361405f57634e487b7160e01b600052602260045260246000fd5b8180156140735760018114614084576140b0565b60ff198616895284890196506140b0565b876000528160002060005b868110156140a85781548b82015290850190830161408f565b505084890196505b50505050505092915050565b60006122628284614024565b60208082526033908201527f546f74616c206e756d626572206f6620726563697069656e747320616e642076604082015272185b1d595cc8185c99481b9bdd08195c5d585b606a1b606082015260800190565b60408152600061412e6040830185613e7c565b82810360208401526141408185613ec0565b95945050505050565b60006020828403121561415b57600080fd5b81516122628161388e565b60006020828403121561417857600080fd5b5051919050565b60008282101561419157614191613d71565b500390565b600082516141a8818460208701613a22565b9190910192915050565b750383932b6b4bab6a6b2b6b132b9103332b29034b99d160551b8152600083516141e3816016850160208801613a22565b7f2e204e6f7420656e6f7567682066756e64732073656e742e2000000000000000601691840191820152835161422081602f840160208801613a22565b01602f01949350505050565b600060ff821660ff84168060ff0382111561424957614249613d71565b01939250505056fea264697066735822122035c5e8f3553979e1813663e7cc74e13ddf5806e704cbbd11a72f3fd977376b3a64736f6c634300080d0033

Deployed Bytecode Sourcemap

3411:37217:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;;;;;;;;;;;;;27264:8;;;3411:37217;;;;27326:8;;;3411:37217;27264:8;;;16446:183;;;;;;:::i;:::-;;:::i;:::-;;;1454:14:1;;1447:22;1429:41;;1417:2;1402:18;16446:183:0;;;;;;;;3826:59;;;;;;;;;;-1:-1:-1;3826:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1996:25:1;;;1984:2;1969:18;3826:59:0;1850:177:1;19857:243:0;;;;;;;;;;-1:-1:-1;19857:243:0;;;;;:::i;:::-;;:::i;4245:55::-;;;;;;;;;;-1:-1:-1;4245:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;17876:272;;;;;;;;;;-1:-1:-1;17876:272:0;;;;;:::i;:::-;;:::i;3709:55::-;;;;;;;;;;-1:-1:-1;3709:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;9585:185;;;;;;;;;;-1:-1:-1;9585:185:0;;;;;:::i;:::-;;:::i;4479:30::-;;;;;;;;;;;;;;;;23463:155;;;;;;;;;;-1:-1:-1;23463:155:0;;;;;:::i;:::-;;:::i;39509:151::-;;;;;;;;;;;;;:::i;11786:261::-;;;;;;;;;;-1:-1:-1;11786:261:0;;;;;:::i;:::-;;:::i;4516:19::-;;;;;;;;;;;;;;;;4577:43;;;;;;;;;;-1:-1:-1;4577:43:0;;;;-1:-1:-1;;;;;4577:43:0;;;;;;-1:-1:-1;;;;;2455:32:1;;;2437:51;;2425:2;2410:18;4577:43:0;2291:203:1;25581:332:0;;;;;;;;;;-1:-1:-1;25581:332:0;;;;;:::i;:::-;;:::i;36666:2081::-;;;;;;:::i;:::-;;:::i;33922:1906::-;;;;;;:::i;:::-;;:::i;4436:36::-;;;;;;;;;;;;;;;;22559:405;;;;;;;;;;-1:-1:-1;22559:405:0;;;;;:::i;:::-;;:::i;4068:51::-;;;;;;;;;;-1:-1:-1;4068:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3576:61;;;;;;;;;;-1:-1:-1;3576:61:0;;;;;:::i;:::-;;;;;;;;;;;;;;19339:249;;;;;;;;;;-1:-1:-1;19339:249:0;;;;;:::i;:::-;;:::i;15931:181::-;;;;;;:::i;:::-;;:::i;4126:54::-;;;;;;;;;;-1:-1:-1;4126:54:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30639:2515::-;;;;;;:::i;:::-;;:::i;3956:44::-;;;;;;;;;;-1:-1:-1;3956:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;28351:1424;;;;;;:::i;:::-;;:::i;4007:54::-;;;;;;;;;;-1:-1:-1;4007:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4007:54:0;;;23929:151;;;;;;;;;;-1:-1:-1;23929:151:0;;;;;:::i;:::-;;:::i;3773:46::-;;;;;;;;;;-1:-1:-1;3773:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;3459:51;;;;;;;;;;-1:-1:-1;3459:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;15419:178;;;;;;:::i;:::-;;:::i;21958:337::-;;;;;;;;;;-1:-1:-1;21958:337:0;;;;;:::i;:::-;;:::i;13045:246::-;;;;;;;;;;;;;:::i;12603:241::-;;;;;;;;;;-1:-1:-1;12603:241:0;;;;;:::i;:::-;;:::i;335:80::-;;;;;;;;;;-1:-1:-1;375:7:0;402:5;-1:-1:-1;;;;;402:5:0;335:80;;6248:483;;;;;;;;;;-1:-1:-1;6248:483:0;;;;;:::i;:::-;;:::i;3517:50::-;;;;;;;;;;-1:-1:-1;3517:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;20358:149;;;;;;;;;;-1:-1:-1;20358:149:0;;;;;:::i;:::-;;:::i;60:20::-;;;;;;;;;;-1:-1:-1;60:20:0;;;;-1:-1:-1;;;;;60:20:0;;;16874:170;;;;;;;;;;-1:-1:-1;16874:170:0;;;;;:::i;:::-;;:::i;24350:313::-;;;;;;;;;;-1:-1:-1;24350:313:0;;;;;:::i;:::-;;:::i;12226:128::-;;;;;;;;;;-1:-1:-1;12226:128:0;;;;;:::i;:::-;;:::i;:::-;;4542:28;;;;;;;;;;;;;;;;14900:186;;;;;;:::i;:::-;;:::i;17408:202::-;;;;;;;;;;-1:-1:-1;17408:202:0;;;;;:::i;:::-;;:::i;24925:306::-;;;;;;;;;;-1:-1:-1;24925:306:0;;;;;:::i;:::-;;:::i;4187:51::-;;;;;;;;;;-1:-1:-1;4187:51:0;;;;;:::i;:::-;;:::i;4350:36::-;;;;;;;;;;;;;;;;40281:342;;;;;;;;;;-1:-1:-1;40281:342:0;;;;;:::i;:::-;;:::i;3894:53::-;;;;;;;;;;-1:-1:-1;3894:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;11219:196;;;;;;;;;;-1:-1:-1;11219:196:0;;;;;:::i;:::-;;:::i;10642:249::-;;;;;;;;;;-1:-1:-1;10642:249:0;;;;;:::i;:::-;;:::i;4393:36::-;;;;;;;;;;;;;;;;20816:738;;;;;;;;;;-1:-1:-1;20816:738:0;;;;;:::i;:::-;;:::i;4309:34::-;;;;;;;;;;;;;;;;26979:234;;;;;;;;;;-1:-1:-1;26979:234:0;;;;;:::i;:::-;;:::i;1033:256::-;;;;;;;;;;-1:-1:-1;1033:256:0;;;;;:::i;:::-;;:::i;3644:56::-;;;;;;;;;;-1:-1:-1;3644:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;18546:513;;;;;;:::i;:::-;;:::i;10069:297::-;;;;;;;;;;-1:-1:-1;10069:297:0;;;;;:::i;:::-;;:::i;16446:183::-;16522:12;16547:52;16564:2;16568:21;;16591:7;16547:16;:52::i;:::-;-1:-1:-1;16617:4:0;;16446:183;-1:-1:-1;;16446:183:0:o;19857:243::-;19929:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;;;;;;;;;19962:30:::1;19981:10;19962:18;:30::i;:::-;19961:31;19953:67;;;::::0;-1:-1:-1;;;19953:67:0;;11843:2:1;19953:67:0::1;::::0;::::1;11825:21:1::0;11882:2;11862:18;;;11855:30;-1:-1:-1;;;11901:18:1;;;11894:53;11964:18;;19953:67:0::1;11641:347:1::0;19953:67:0::1;-1:-1:-1::0;;;;;;20031:32:0;::::1;;::::0;;;:20:::1;:32;::::0;;;;:39;;-1:-1:-1;;20031:39:0::1;20066:4;20031:39:::0;;::::1;::::0;;;855:1:::1;19857:243:::0;;;:::o;17876:272::-;-1:-1:-1;;;;;17974:35:0;;17947:11;17974:35;;;:23;:35;;;;;;:39;17971:137;;-1:-1:-1;;;;;18055:35:0;;;;;;:23;:35;;;;;;18037:15;;18093:3;;18037:53;;;:::i;:::-;:59;;;;:::i;:::-;18030:66;17876:272;-1:-1:-1;;17876:272:0:o;17971:137::-;-1:-1:-1;;18125:15:0;;;17876:272::o;9585:185::-;-1:-1:-1;;;;;9683:27:0;;9650:13;9683:27;;;:20;:27;;;;;;9714:15;-1:-1:-1;9683:46:0;;:79;;-1:-1:-1;;;;;;;9733:29:0;;;;;:22;:29;;;;;;;;;9585:185::o;23463:155::-;-1:-1:-1;;;;;23572:32:0;23535:17;23572:32;;;:15;:32;;;;;;23607:3;-1:-1:-1;23572:38:0;23463:155::o;39509:151::-;39559:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;39592:5:::1;::::0;;39584:46:::1;::::0;-1:-1:-1;;;;;39592:5:0;;::::1;::::0;39608:21:::1;39584:46:::0;::::1;;;::::0;39608:21;;39584:46;39592:5;39584:46;39608:21;39592:5;39584:46;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;39648:4;39641:11;;39509:151:::0;:::o;11786:261::-;-1:-1:-1;;;;;11901:32:0;;11874:11;11901:32;;;:25;:32;;;;;;:36;11898:120;;-1:-1:-1;;;;;11968:32:0;;;;;;:25;:32;;;;;;12003:3;;11961:39;;:4;:39;:::i;:::-;:45;;;;:::i;:::-;11954:52;;;;11898:120;-1:-1:-1;12035:4:0;11786:261;-1:-1:-1;11786:261:0:o;25581:332::-;25641:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;25700:4:::1;;25688:8;:16;;:46;;;;;25733:1;25722:8;:12;25688:46;25666:79;;;::::0;::::1;;25773:4;::::0;25761:27:::1;::::0;;12694:25:1;;;12750:2;12735:18;;12728:34;;;25761:27:0::1;::::0;12667:18:1;25761:27:0::1;;;;;;;25799:4;:15:::0;;;25839:7:::1;25873:10;25806:8:::0;25839:7;25873:10:::1;:::i;:::-;25857:13;:26:::0;-1:-1:-1;25901:4:0::1;::::0;25581:332;-1:-1:-1;;25581:332:0:o;36666:2081::-;36856:12;36911:4;:11;36889;:18;:33;36881:117;;;;-1:-1:-1;;;36881:117:0;;;;;;;:::i;:::-;37039:8;:15;37017:11;:18;:37;37009:121;;;;-1:-1:-1;;;37009:121:0;;13455:2:1;37009:121:0;;;13437:21:1;13494:2;13474:18;;;13467:30;13533:34;13513:18;;;13506:62;13604:34;13584:18;;;13577:62;-1:-1:-1;;;13655:19:1;;;13648:38;13703:19;;37009:121:0;13253:475:1;37009:121:0;37141:20;37164:29;37185:7;37164:20;:29::i;:::-;37310:13;;37289:18;;37141:52;;-1:-1:-1;37248:13:0;;37204:24;;37289:34;;;:::i;:::-;37273:50;;37334:22;37359:32;37380:10;37359:20;:32::i;:::-;:69;;;;37395:33;37414:13;37395:18;:33::i;:::-;37334:94;;37439:25;37467:32;37485:13;37467:17;:32::i;:::-;:64;;;;;37503:28;37520:10;37503:16;:28::i;:::-;37439:92;;37577:5;37564:9;:18;;:42;;;;37586:20;37564:42;:63;;;;37610:17;37564:63;37542:152;;;;-1:-1:-1;;;37542:152:0;;;;;;;:::i;:::-;37709:20;:41;;;;37733:17;37709:41;37708:60;;;;;37767:1;37755:9;:13;37708:60;37705:181;;;37785:39;;37793:10;;37814:9;37785:39;;;;;;;;;37814:9;37793:10;37785:39;;;;;;;;;;;;;;;;;;;;;37705:181;;;37857:17;37868:5;37857:10;:17::i;:::-;37899:10;37896:296;;;37925:65;;-1:-1:-1;;;37925:65:0;;-1:-1:-1;;;;;37925:27:0;;;;;:65;;37953:10;;37964:11;;37976:4;;37981:8;;37925:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37896:296;;;38027:6;38023:158;38043:11;:18;38039:1;:22;38023:158;;;38087:7;-1:-1:-1;;;;;38087:24:0;;38112:10;38124:11;38136:1;38124:14;;;;;;;;:::i;:::-;;;;;;;38140:4;38145:1;38140:7;;;;;;;;:::i;:::-;;;;;;;38149:8;38158:1;38149:11;;;;;;;;:::i;:::-;;;;;;;;;;;38087:78;;-1:-1:-1;;;;;;38087:78:0;;;;;;;-1:-1:-1;;;;;16303:15:1;;;38087:78:0;;;16285:34:1;16355:15;;;;16335:18;;;16328:43;16387:18;;;16380:34;16430:18;;;16423:34;16265:3;16473:19;;;16466:32;-1:-1:-1;16514:19:1;;;16507:30;16554:19;;38087:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38063:3;;;;;:::i;:::-;;;;38023:158;;;;37896:296;38205:32;38223:13;38205:17;:32::i;:::-;38202:148;;;38320:18;;-1:-1:-1;;;;;38287:30:0;;;;;;:15;:30;;;;;;:51;;38320:18;38287:51;:::i;:::-;-1:-1:-1;;;;;38254:30:0;;;;;;:15;:30;;;;;:84;38202:148;38363:28;38380:10;38363:16;:28::i;:::-;38360:136;;;38466:18;;38452:10;38437:26;;;;:14;:26;;;;;;:47;;38466:18;38437:47;:::i;:::-;38423:10;38408:26;;;;:14;:26;;;;;:76;38360:136;38510:20;38509:21;:43;;;;;38535:17;38534:18;38509:43;38506:139;;;38569:64;38611:13;;38590:11;:18;:34;;;;:::i;:::-;38626:6;38569:20;:64::i;:::-;38683:13;-1:-1:-1;;;;;38660:57:0;38671:10;-1:-1:-1;;;;;38660:57:0;;38698:11;:18;38660:57;;;;1996:25:1;;1984:2;1969:18;;1850:177;38660:57:0;;;;;;;;-1:-1:-1;38735:4:0;;36666:2081;-1:-1:-1;;;;;;;;;;;36666:2081:0:o;33922:1906::-;34089:12;34144:9;:16;34122:11;:18;:38;34114:122;;;;-1:-1:-1;;;34114:122:0;;;;;;;:::i;:::-;34247:20;34270:29;34291:7;34270:20;:29::i;:::-;34413:13;;34392:18;;34247:52;;-1:-1:-1;34351:13:0;;34310:22;;34392:34;;;:::i;:::-;34376:50;;34437:22;34462:32;34483:10;34462:20;:32::i;:::-;:69;;;;34498:33;34517:13;34498:18;:33::i;:::-;34437:94;;34542:25;34570:32;34588:13;34570:17;:32::i;:::-;:64;;;;;34606:28;34623:10;34606:16;:28::i;:::-;34542:92;;34680:5;34667:9;:18;;:42;;;;34689:20;34667:42;:63;;;;34713:17;34667:63;34645:152;;;;-1:-1:-1;;;34645:152:0;;;;;;;:::i;:::-;34812:20;:41;;;;34836:17;34812:41;34811:60;;;;;34870:1;34858:9;:13;34811:60;34808:181;;;34888:39;;34896:10;;34917:9;34888:39;;;;;;;;;34917:9;34896:10;34888:39;;;;;;;;;;;;;;;;;;;;;34808:181;;;34960:17;34971:5;34960:10;:17::i;:::-;35002:10;34999:274;;;35028:60;;-1:-1:-1;;;35028:60:0;;-1:-1:-1;;;;;35028:26:0;;;;;:60;;35055:10;;35066:11;;35078:9;;35028:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34999:274;;;35125:6;35121:141;35141:11;:18;35137:1;:22;35121:141;;;35185:6;-1:-1:-1;;;;;35185:19:0;;35205:10;35217:11;35229:1;35217:14;;;;;;;;:::i;:::-;;;;;;;35233:9;35243:1;35233:12;;;;;;;;:::i;:::-;;;;;;;35185:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35161:3;;;;;:::i;:::-;;;;35121:141;;;;34999:274;35286:32;35304:13;35286:17;:32::i;:::-;35283:148;;;35401:18;;-1:-1:-1;;;;;35368:30:0;;;;;;:15;:30;;;;;;:51;;35401:18;35368:51;:::i;:::-;-1:-1:-1;;;;;35335:30:0;;;;;;:15;:30;;;;;:84;35283:148;35444:28;35461:10;35444:16;:28::i;:::-;35441:136;;;35547:18;;35533:10;35518:26;;;;:14;:26;;;;;;:47;;35547:18;35518:47;:::i;:::-;35504:10;35489:26;;;;:14;:26;;;;;:76;35441:136;35591:20;35590:21;:43;;;;;35616:17;35615:18;35590:43;35587:139;;;35650:64;35692:13;;35671:11;:18;:34;;;;:::i;35650:64::-;35764:13;-1:-1:-1;;;;;35741:57:0;35752:10;-1:-1:-1;;;;;35741:57:0;;35779:11;:18;35741:57;;;;1996:25:1;;1984:2;1969:18;;1850:177;35741:57:0;;;;;;;;-1:-1:-1;35816:4:0;;33922:1906;-1:-1:-1;;;;;;;;;;33922:1906:0:o;22559:405::-;22624:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22657:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;22649:27;;;::::0;::::1;;-1:-1:-1::0;;;;;22687:18:0;::::1;22708:5;22687:18:::0;;;:11:::1;:18;::::0;;;;;;;:26;;-1:-1:-1;;22687:26:0::1;::::0;;22744:19:::1;:26:::0;;;;;;22724:47;;:19:::1;::::0;:47:::1;::::0;::::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:60;;-1:-1:-1;;;;;;22724:60:0::1;-1:-1:-1::0;;;;;22724:60:0;;::::1;;::::0;;22835:26;;::::1;-1:-1:-1::0;22835:26:0;;;:19:::1;:26:::0;;;;;22800:62:::1;::::0;::::1;:::i;:::-;;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;22800:62:0;::::1;::::0;::::1;::::0;;;::::1;22873:61;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;;;;;22873:26:0;::::1;-1:-1:-1::0;22873:26:0;;;:19:::1;:26:::0;;;;;;;:61;;::::1;::::0;;::::1;:::i;19339:249::-:0;19419:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;19452:30:::1;19471:10;19452:18;:30::i;:::-;19444:62;;;::::0;-1:-1:-1;;;19444:62:0;;19580:2:1;19444:62:0::1;::::0;::::1;19562:21:1::0;19619:2;19599:18;;;19592:30;-1:-1:-1;;;19638:18:1;;;19631:49;19697:18;;19444:62:0::1;19378:343:1::0;19444:62:0::1;-1:-1:-1::0;;;;;;19517:32:0::1;19552:5;19517:32:::0;;;:20:::1;:32;::::0;;;;:40;;-1:-1:-1;;19517:40:0::1;::::0;;-1:-1:-1;;19339:249:0:o;15931:181::-;16006:12;16031:51;16048:1;16051:21;;16074:7;16031:16;:51::i;4126:54::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30639:2515::-;30850:12;30875:20;30898:29;30919:7;30898:20;:29::i;:::-;31033:14;;31011:18;;30875:52;;-1:-1:-1;30976:15:0;;31011:36;31003:100;;;;-1:-1:-1;;;31003:100:0;;;;;;;:::i;:::-;31114:13;31151;;31130:11;:18;:34;;;;:::i;:::-;31114:50;;31175:22;31200:32;31221:10;31200:20;:32::i;:::-;:71;;;;31236:35;31255:15;31236:18;:35::i;:::-;31175:96;;31282:25;31310:34;31328:15;31310:17;:34::i;:::-;:66;;;;;31348:28;31365:10;31348:16;:28::i;:::-;31282:94;;31422:5;31409:9;:18;;:56;;;;31431:34;31449:15;31431:17;:34::i;:::-;31409:88;;;;31469:28;31486:10;31469:16;:28::i;:::-;31409:109;;;;31501:17;31409:109;31387:198;;;;-1:-1:-1;;;31387:198:0;;;;;;;:::i;:::-;31600:20;:41;;;;31624:17;31600:41;31599:60;;;;;31658:1;31646:9;:13;31599:60;31596:181;;;31676:39;;31684:10;;31705:9;31676:39;;;;;;;;;31705:9;31684:10;31676:39;;;;;;;;;;;;;;;;;;;;;31596:181;;;31748:17;31759:5;31748:10;:17::i;:::-;31792:10;31789:798;;;31819:59;;-1:-1:-1;;;31819:59:0;;-1:-1:-1;;;;;31819:18:0;;;;;:59;;31838:10;;31858:4;;31865:12;;31819:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31893:46:0;;-1:-1:-1;;;31893:46:0;;-1:-1:-1;;;;;31893:25:0;;;-1:-1:-1;31893:25:0;;-1:-1:-1;31893:46:0;;31919:11;;31931:7;;31893:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31789:798;;;31976:15;31972:604;;32012:59;;-1:-1:-1;;;32012:59:0;;-1:-1:-1;;;;;32012:18:0;;;;;:59;;32031:10;;32051:4;;32058:12;;32012:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32094:6;32090:130;32110:11;:18;32106:1;:22;32090:130;;;32158:5;-1:-1:-1;;;;;32158:14:0;;32173:11;32185:1;32173:14;;;;;;;;:::i;:::-;;;;;;;32189:7;32197:1;32189:10;;;;;;;;:::i;:::-;;;;;;;32158:42;;;;;;;;;;;;;;;-1:-1:-1;;;;;20808:32:1;;;;20790:51;;20872:2;20857:18;;20850:34;20778:2;20763:18;;20616:274;32158:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32130:3:0;;;;:::i;:::-;;;;32090:130;;;-1:-1:-1;32241:30:0;;-1:-1:-1;;;32241:30:0;;32265:4;32241:30;;;2437:51:1;32274:1:0;;-1:-1:-1;;;;;32241:15:0;;;;;2410:18:1;;32241:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:34;32238:139;;;32326:30;;-1:-1:-1;;;32326:30:0;;32350:4;32326:30;;;2437:51:1;-1:-1:-1;;;;;32300:14:0;;;;;32315:10;;32300:14;;32326:15;;2410:18:1;;32326:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32300:57;;-1:-1:-1;;;;;;32300:57:0;;;;;;;-1:-1:-1;;;;;20808:32:1;;;32300:57:0;;;20790:51:1;20857:18;;;20850:34;20763:18;;32300:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32238:139;31972:604;;;32421:6;32417:144;32435:11;:18;32431:1;:22;32417:144;;;32483:5;-1:-1:-1;;;;;32483:18:0;;32502:10;32514:11;32526:1;32514:14;;;;;;;;:::i;:::-;;;;;;;32530:7;32538:1;32530:10;;;;;;;;:::i;:::-;;;;;;;32483:58;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32455:3;;;;;:::i;:::-;;;;32417:144;;;;31972:604;32602:34;32620:15;32602:17;:34::i;:::-;32599:154;;;32723:18;;-1:-1:-1;;;;;32688:32:0;;;;;;:15;:32;;;;;;:53;;32723:18;32688:53;:::i;:::-;-1:-1:-1;;;;;32653:32:0;;;;;;:15;:32;;;;;:88;32599:154;32766:28;32783:10;32766:16;:28::i;:::-;32763:136;;;32869:18;;32855:10;32840:26;;;;:14;:26;;;;;;:47;;32869:18;32840:47;:::i;:::-;32826:10;32811:26;;;;:14;:26;;;;;:76;32763:136;32913:20;32912:21;:43;;;;;32938:17;32937:18;32912:43;32909:139;;;32972:64;33014:13;;32993:11;:18;:34;;;;:::i;32972:64::-;33088:15;-1:-1:-1;;;;;33063:61:0;33076:10;-1:-1:-1;;;;;33063:61:0;;33105:11;:18;33063:61;;;;1996:25:1;;1984:2;1969:18;;1850:177;33063:61:0;;;;;;;;-1:-1:-1;33142:4:0;;30639:2515;-1:-1:-1;;;;;;;;;;;;30639:2515:0:o;28351:1424::-;28506:12;28561:7;:14;28539:11;:18;:36;28531:100;;;;-1:-1:-1;;;28531:100:0;;;;;;;:::i;:::-;28726:13;;28705:18;;28666:12;;28642:21;;28705:34;;28726:13;28705:34;:::i;:::-;28689:50;-1:-1:-1;28750:17:0;28770:21;28689:50;28770:13;:21;:::i;:::-;28750:41;;28802:17;28822:28;28839:10;28822:16;:28::i;:::-;28802:48;;28861:10;28874:32;28895:10;28874:20;:32::i;:::-;:40;;28910:4;28874:40;;;28861:53;;28960:9;28947;:22;;:31;;;;28973:5;28947:31;:47;;;;28982:12;28947:47;28925:137;;;;-1:-1:-1;;;28925:137:0;;;;;;;:::i;:::-;29083:29;29104:7;29083:20;:29::i;:::-;29073:39;;29127:5;29126:6;:23;;;;;29137:12;29136:13;29126:23;29123:91;;;29166:36;29187:5;29194:7;29166:20;:36::i;:::-;29228:5;:21;;;;29237:12;29228:21;29227:51;;;;;29266:12;29254:9;:24;29227:51;29224:193;;;29303:10;29295:56;29324:26;29338:12;29325:9;29324:26;:::i;:::-;29295:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29224:193;;;29384:21;29395:9;29384:10;:21::i;:::-;29431:6;29427:116;29447:11;:18;29443:1;:22;29427:116;;;29495:11;29507:1;29495:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;29487:32:0;:44;29520:7;29528:1;29520:10;;;;;;;;:::i;:::-;;;;;;;29487:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29467:3:0;;;;:::i;:::-;;;;29427:116;;;;29556:12;29553:120;;;29643:18;;29629:10;29614:26;;;;:14;:26;;;;;;:47;;29643:18;29614:47;:::i;:::-;29600:10;29585:26;;;;:14;:26;;;;;:76;29553:120;29711:18;;29688:57;;;12694:25:1;;;12750:2;12735:18;;12728:34;;;29699:10:0;;29688:57;;12667:18:1;29688:57:0;;;;;;;-1:-1:-1;29763:4:0;;28351:1424;-1:-1:-1;;;;;;;;;28351:1424:0:o;23929:151::-;-1:-1:-1;;;;;24036:30:0;23999:17;24036:30;;;:14;:30;;;;;;24069:3;-1:-1:-1;24036:36:0;23929:151::o;15419:178::-;15493:12;15518:49;15535:1;15538:19;;15559:7;15518:16;:49::i;21958:337::-;22068:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22102:32:0;::::1;;::::0;;;:11:::1;:32;::::0;;;;;::::1;;22094:41;;;::::0;::::1;;-1:-1:-1::0;;;;;22171:40:0;::::1;22146:22;22171:40:::0;;;:19:::1;:40;::::0;;;;;;22222:29;;22254:11;;22222:20:::1;::::0;:29:::1;::::0;22171:40;;22222:29:::1;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:43;-1:-1:-1;22283:4:0::1;::::0;-1:-1:-1;21958:337:0;;;;:::o;13045:246::-;13090:4;13115:36;13140:10;13115:24;:36::i;:::-;13107:74;;;;-1:-1:-1;;;13107:74:0;;21872:2:1;13107:74:0;;;21854:21:1;21911:2;21891:18;;;21884:30;21950:27;21930:18;;;21923:55;21995:18;;13107:74:0;21670:349:1;13107:74:0;13227:34;:15;13246:14;13227:34;:::i;:::-;13213:10;13192:32;;;;:20;:32;;;;;:69;-1:-1:-1;13279:4:0;;13045:246::o;12603:241::-;12753:28;;12800:36;;-1:-1:-1;;;12800:36:0;;-1:-1:-1;;;;;2455:32:1;;;12800:36:0;;;2437:51:1;12671:4:0;;12753:28;;;;12800:30;;2410:18:1;;12800:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12793:43;12603:241;-1:-1:-1;;;12603:241:0:o;6248:483::-;6386:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;6430:1:::1;6419:10;:12;:39;;;;;6446:12;6435:10;:23;6419:39;:68;;;;;6475:12;6462;:25;6419:68;:97;;;;;6504:12;6491;:25;6419:97;6411:106;;;::::0;::::1;;-1:-1:-1::0;6528:19:0::1;:32:::0;;;;6571:21:::1;:36:::0;;;;6618:21:::1;:36:::0;6665:21:::1;:36:::0;6719:4:::1;::::0;6248:483::o;20358:149::-;20428:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;20452:15:0::1;:25:::0;20495:4:::1;::::0;20358:149::o;16874:170::-;-1:-1:-1;;;;;16975:25:0;;16942:13;16975:25;;;:13;:25;;;;;;;;;:61;;-1:-1:-1;;;;;;;17004:32:0;;;;;:20;:32;;;;;;;;;16874:170::o;24350:313::-;24432:27;24475:34;24493:15;24475:17;:34::i;:::-;24472:164;;;-1:-1:-1;;;;;24592:32:0;;24526:21;24592:32;;;:15;:32;;;;;;24551:3;;24576:48;;24551:3;24576:48;:::i;24472:164::-;-1:-1:-1;24654:1:0;;24350:313;-1:-1:-1;24350:313:0:o;12226:128::-;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;12310:28:::1;:36:::0;;-1:-1:-1;;;;;;12310:36:0::1;-1:-1:-1::0;;;;;12310:36:0;;;::::1;::::0;;;::::1;::::0;;12226:128::o;14900:186::-;14976:12;15001:55;15018:5;15025:21;;15048:7;15001:16;:55::i;17408:202::-;17508:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;17533:35:0;;;::::1;;::::0;;;:23:::1;:35;::::0;;;;:47;17598:4:::1;::::0;17408:202::o;24925:306::-;25005:27;25048:32;25065:14;25048:16;:32::i;:::-;25045:160;;;-1:-1:-1;;;;;25163:30:0;;25097:21;25163:30;;;:14;:30;;;;;;25122:3;;25147:46;;25122:3;25147:46;:::i;4187:51::-;;;;;;;;;;;;;;;;:::i;40281:342::-;40397:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;40486:34:::1;::::0;-1:-1:-1;;;40486:34:0;;-1:-1:-1;;;;;20808:32:1;;;40486:34:0::1;::::0;::::1;20790:51:1::0;20857:18;;;20850:34;;;40459:15:0;;40486:14;;::::1;::::0;::::1;::::0;20763:18:1;;40486:34:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40536:57;40557:15;40574:10;40586:6;40536:57;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;40611:4:0::1;::::0;40281:342;-1:-1:-1;;;;40281:342:0:o;11219:196::-;11316:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;11341:32:0;;;::::1;;::::0;;;:25:::1;:32;::::0;;;;:44;11403:4:::1;::::0;11219:196::o;10642:249::-;10722:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10755:29:0;::::1;;::::0;;;:22:::1;:29;::::0;;;;;::::1;;10747:66;;;::::0;-1:-1:-1;;;10747:66:0;;22226:2:1;10747:66:0::1;::::0;::::1;22208:21:1::0;22265:2;22245:18;;;22238:30;22304:26;22284:18;;;22277:54;22348:18;;10747:66:0::1;22024:348:1::0;10747:66:0::1;-1:-1:-1::0;;;;;;10824:29:0::1;10856:5;10824:29:::0;;;:22:::1;:29;::::0;;;;:37;;-1:-1:-1;;10824:37:0::1;::::0;;-1:-1:-1;;10642:249:0:o;20816:738::-;20920:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20954:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;20953:19;20945:64;;;::::0;-1:-1:-1;;;20945:64:0;;22579:2:1;20945:64:0::1;::::0;::::1;22561:21:1::0;;;22598:18;;;22591:30;22657:34;22637:18;;;22630:62;22709:18;;20945:64:0::1;22377:356:1::0;20945:64:0::1;-1:-1:-1::0;;;;;21028:19:0;::::1;21020:56;;;::::0;-1:-1:-1;;;21020:56:0;;22940:2:1;21020:56:0::1;::::0;::::1;22922:21:1::0;22979:2;22959:18;;;22952:30;23018:26;22998:18;;;22991:54;23062:18;;21020:56:0::1;22738:348:1::0;21020:56:0::1;21096:19;21116:5;21096:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;21095:27;21087:70;;;::::0;-1:-1:-1;;;21087:70:0;;23574:2:1;21087:70:0::1;::::0;::::1;23556:21:1::0;23613:2;23593:18;;;23586:30;23652:32;23632:18;;;23625:60;23702:18;;21087:70:0::1;23372:354:1::0;21087:70:0::1;21191:3;21176:11;:18;;:37;;;;;21212:1;21198:11;:15;21176:37;21168:82;;;::::0;-1:-1:-1;;;21168:82:0;;23933:2:1;21168:82:0::1;::::0;::::1;23915:21:1::0;;;23952:18;;;23945:30;24011:34;23991:18;;;23984:62;24063:18;;21168:82:0::1;23731:356:1::0;21168:82:0::1;21290:4;21261:19;21281:5;21261:26;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;;:33;;;::::1;;-1:-1:-1::0;;21261:33:0;;::::1;;::::0;;-1:-1:-1;;;;;21305:18:0;::::1;21261:26;21305:18:::0;;;:11:::1;:18:::0;;;;:25;;;;::::1;21261:33:::0;21305:25:::1;::::0;;;21317:5;;21341:19:::1;::::0;:26:::1;::::0;21361:5;;21341:26:::1;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;:34;;-1:-1:-1;;;;;;21341:34:0::1;-1:-1:-1::0;;;;;21341:34:0;;::::1;;::::0;;21386:26;;::::1;-1:-1:-1::0;21386:26:0;;;:19:::1;:26:::0;;;;;;:34;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;21461:11;21431:20;21452:5;21431:27;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:41;;;;21488:36:::1;::::0;21518:5;;21488:36:::1;:::i;:::-;;::::0;;;;::::1;::::0;;;-1:-1:-1;;;;;21488:36:0;::::1;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;21542:4:0::1;20816:738:::0;;;;;:::o;26979:234::-;27168:37;;-1:-1:-1;;;27168:37:0;;-1:-1:-1;;;;;24322:15:1;;;27168:37:0;;;24304:34:1;27199:4:0;24354:18:1;;;24347:43;27066:17:0;;27134:15;;27168;;;;;24239:18:1;;27168:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27161:44;26979:234;-1:-1:-1;;;;26979:234:0:o;1033:256::-;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1129:23:0;::::1;::::0;;::::1;::::0;:58:::1;;-1:-1:-1::0;1182:5:0::1;::::0;-1:-1:-1;;;;;1169:18:0;;::::1;1182:5:::0;::::1;1169:18;;1129:58;1107:92;;;::::0;::::1;;1236:5;::::0;;1215:38:::1;::::0;-1:-1:-1;;;;;1215:38:0;;::::1;::::0;1236:5;::::1;::::0;1215:38:::1;::::0;::::1;1264:5;:17:::0;;-1:-1:-1;;;;;;1264:17:0::1;-1:-1:-1::0;;;;;1264:17:0;;;::::1;::::0;;;::::1;::::0;;1033:256::o;18546:513::-;18642:12;18676:30;18695:10;18676:18;:30::i;:::-;18675:31;18667:67;;;;-1:-1:-1;;;18667:67:0;;11843:2:1;18667:67:0;;;11825:21:1;11882:2;11862:18;;;11855:30;-1:-1:-1;;;11901:18:1;;;11894:53;11964:18;;18667:67:0;11641:347:1;18667:67:0;18755:29;18776:7;18755:20;:29::i;:::-;18745:39;;18795:11;18809:33;18831:10;18809:21;:33::i;:::-;18795:47;;18874:3;18861:9;:16;;18853:62;;;;-1:-1:-1;;;18853:62:0;;24603:2:1;18853:62:0;;;24585:21:1;24642:2;24622:18;;;24615:30;24681:34;24661:18;;;24654:62;-1:-1:-1;;;24732:18:1;;;24725:31;24773:19;;18853:62:0;24401:397:1;18853:62:0;-1:-1:-1;;;;;18926:25:0;;;;;;:13;:25;;;;;:32;;-1:-1:-1;;18926:32:0;18954:4;18926:32;;;18969:15;18980:3;18969:10;:15::i;:::-;18995:34;19016:3;19021:7;18995:20;:34::i;:::-;-1:-1:-1;19047:4:0;;18546:513;-1:-1:-1;;;18546:513:0:o;10069:297::-;10141:12;794:5;;-1:-1:-1;;;;;794:5:0;780:10;:19;772:72;;;;-1:-1:-1;;;772:72:0;;;;;;;:::i;:::-;10174:27:::1;10195:5;10174:20;:27::i;:::-;:35;;10205:4;10174:35:::0;10166:79:::1;;;::::0;-1:-1:-1;;;10166:79:0;;25005:2:1;10166:79:0::1;::::0;::::1;24987:21:1::0;25044:2;25024:18;;;25017:30;25083:33;25063:18;;;25056:61;25134:18;;10166:79:0::1;24803:355:1::0;10166:79:0::1;-1:-1:-1::0;;;;;10256:29:0;::::1;;::::0;;;:22:::1;:29;::::0;;;;;:36;;-1:-1:-1;;10256:36:0::1;10288:4;10256:36;::::0;;10308:27;::::1;::::0;10256:29;10308:27:::1;-1:-1:-1::0;10353:4:0::1;10069:297:::0;;;:::o;13792:778::-;13887:12;13920:32;13941:10;13920:20;:32::i;:::-;:40;;13956:4;13920:40;13912:84;;;;-1:-1:-1;;;13912:84:0;;25005:2:1;13912:84:0;;;24987:21:1;25044:2;25024:18;;;25017:30;25083:33;25063:18;;;25056:61;25134:18;;13912:84:0;24803:355:1;13912:84:0;14007:11;14021:47;14051:10;14063:4;14021:29;:47::i;:::-;14007:61;;14114:3;14101:9;:16;;14200:13;14209:3;14200:8;:13::i;:::-;14244:19;14253:9;14244:8;:19::i;:::-;14139:139;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14079:211;;;;;-1:-1:-1;;;14079:211:0;;;;;;;;:::i;:::-;-1:-1:-1;14355:14:0;:5;14363:6;14355:14;:::i;:::-;14336:34;;:15;:34;:::i;:::-;14322:10;14301:32;;;;:20;:32;;;;;:69;14391:29;14412:7;14391:20;:29::i;:::-;14381:39;;14431:15;14442:3;14431:10;:15::i;:::-;14457:34;14478:3;14483:7;14457:20;:34::i;:::-;14507:32;;14528:10;;14507:32;;;;;-1:-1:-1;14557:4:0;;13792:778;-1:-1:-1;;;;13792:778:0:o;8315:1028::-;8452:10;8435:28;;;;:16;:28;;;;;8419:53;;8385:18;;8419:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8419:53:0;;;:15;:53::i;:::-;:99;;;;8477:11;:41;8489:19;8509:7;8489:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8489:28:0;8477:41;;;;;;;;;;-1:-1:-1;8477:41:0;;;;8476:42;8419:99;8416:196;;;8535:37;;;;;;;;;;;-1:-1:-1;;;8535:37:0;;;;;;;8552:10;-1:-1:-1;8535:28:0;;;:16;:28;;;;;;;:37;;;;;;:::i;:::-;-1:-1:-1;;8587:13:0;;;;;;;;;;;;-1:-1:-1;;;8587:13:0;;;;;8315:1028;-1:-1:-1;8315:1028:0:o;8416:196::-;8626:28;8642:7;8626:28;;;;;;;;;;;;:15;:28::i;:::-;8625:29;:81;;;;-1:-1:-1;8691:10:0;8674:28;;;;:16;:28;;;;;8658:48;;;;8674:28;8658:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:15;:48::i;:::-;8625:179;;;;;8776:19;8796:7;8776:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;8625:179;8622:358;;;8856:10;-1:-1:-1;;;;;8824:42:0;:19;8844:7;8824:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;8824:28:0;:42;8821:95;;-1:-1:-1;;8887:13:0;;;;;;;;;;;;-1:-1:-1;;;8887:13:0;;;;;8315:1028::o;8821:95::-;8947:10;8930:28;;;;:16;:28;;;;;;;;:38;;;;;;;;:::i;:::-;;8622:358;8993:27;9009:7;8993:27;;;;;;;;;;;;:15;:27::i;:::-;:80;;;;-1:-1:-1;9058:10:0;9041:28;;;;:16;:28;;;;;9025:48;;;;9041:28;9025:48;;;:::i;:::-;9024:49;8993:80;8990:150;;;9117:10;9100:28;;;;:16;:28;;;;;9090:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8990:150;9154:27;9170:7;9154:27;;;;;;;;;;;;:15;:27::i;:::-;:60;;;;9186:19;9206:7;9186:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;9185:29;9154:60;9151:160;;;9231:37;;;;;;;;;;;-1:-1:-1;;;9231:37:0;;;;;;;9248:10;-1:-1:-1;9231:28:0;;;:16;:28;;;;;;;:37;;;;;;:::i;:::-;;9283:16;;;;;;;;;;;;;-1:-1:-1;;;9283:16:0;;;;;9151:160;-1:-1:-1;9328:7:0;8315:1028::o;7760:199::-;7831:6;7819:9;:18;7816:136;;;7854:14;7871:18;7883:6;7871:9;:18;:::i;:::-;7904:36;;7854:35;;-1:-1:-1;7912:10:0;;7904:36;;;;;7854:35;;7904:36;;;;7854:35;7912:10;7904:36;;;;;;;;;;;;;;;;;;;;;7839:113;7816:136;7760:199;:::o;38825:550::-;38920:31;38936:7;38920:31;;;;;;;;;;;;;-1:-1:-1;;;38920:31:0;;;:15;:31::i;:::-;38919:32;:77;;;;;38955:11;:41;38967:19;38987:7;38967:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38967:28:0;38955:41;;;;;;;;;;-1:-1:-1;38955:41:0;;;;38919:77;38916:452;;;39013:18;39077:3;39045:20;39066:7;39045:29;;;;;;:::i;:::-;;;;;;;;;;;;;;39034:8;:40;;;;:::i;:::-;:46;;;;:::i;:::-;39103:5;;39013:67;;-1:-1:-1;;;;;;39103:5:0;39095:46;39119:21;39013:67;39119:8;:21;:::i;:::-;39095:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39164:19;39184:7;39164:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;;;39164:28:0;;39156:58;;;;;39203:10;;39164:28;;;;39203:10;39164:28;39156:58;;;;;;;;;;;;;;;;;;;;;39249:19;39269:7;39249:28;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1996:25:1;;;-1:-1:-1;;;;;39249:28:0;;39234:56;;1969:18:1;39234:56:0;;;;;;;38998:304;38825:550;;:::o;38916:452::-;39331:5;;;39323:33;;-1:-1:-1;;;;;39331:5:0;;;;39323:33;;;;;39347:8;;39323:33;39331:5;39323:33;39347:8;39331:5;39323:33;;;;;;;;;;;;;;;;;;;6978:573;7028:27;7072:2;7078:1;7072:7;7068:50;;-1:-1:-1;;7096:10:0;;;;;;;;;;;;-1:-1:-1;;;7096:10:0;;;;;6978:573::o;7068:50::-;7137:2;7128:6;7169:69;7176:6;;7169:69;;7199:5;;;;:::i;:::-;;-1:-1:-1;7219:7:0;;-1:-1:-1;7224:2:0;7219:7;;:::i;:::-;;;7169:69;;;7248:17;7278:3;7268:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7268:14:0;-1:-1:-1;7248:34:0;-1:-1:-1;7302:3:0;7316:198;7323:7;;7316:198;;7351:3;7353:1;7351;:3;:::i;:::-;7347:7;-1:-1:-1;7369:10:0;7399:7;7404:2;7399;:7;:::i;:::-;:12;;7409:2;7399:12;:::i;:::-;7394:17;;:2;:17;:::i;:::-;7383:29;;:2;:29;:::i;:::-;7369:44;;7428:9;7447:4;7440:12;;7428:24;;7477:2;7467:4;7472:1;7467:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;7467:12:0;;;;;;;;-1:-1:-1;7494:8:0;7500:2;7494:8;;:::i;:::-;;;7332:182;;7316:198;;;-1:-1:-1;7538:4:0;6978:573;-1:-1:-1;;;;6978:573:0:o;27558:254::-;27641:13;27667;27710:2;27693:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;27683:31;;;;;;27667:47;;27725:13;27768:2;27751:20;;;;;;;;:::i;:::-;;;;-1:-1:-1;;27751:20:0;;;;;;;;;27741:31;;27751:20;27741:31;;;;27790:14;;;;;27558:254;-1:-1:-1;;;;27558:254:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:127:1;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:275;217:2;211:9;282:2;263:13;;-1:-1:-1;;259:27:1;247:40;;317:18;302:34;;338:22;;;299:62;296:88;;;364:18;;:::i;:::-;400:2;393:22;146:275;;-1:-1:-1;146:275:1:o;426:531::-;469:5;522:3;515:4;507:6;503:17;499:27;489:55;;540:1;537;530:12;489:55;576:6;563:20;602:18;598:2;595:26;592:52;;;624:18;;:::i;:::-;668:55;711:2;692:13;;-1:-1:-1;;688:27:1;717:4;684:38;668:55;:::i;:::-;748:2;739:7;732:19;794:3;787:4;782:2;774:6;770:15;766:26;763:35;760:55;;;811:1;808;801:12;760:55;876:2;869:4;861:6;857:17;850:4;841:7;837:18;824:55;924:1;899:16;;;917:4;895:27;888:38;;;;903:7;426:531;-1:-1:-1;;;426:531:1:o;962:322::-;1031:6;1084:2;1072:9;1063:7;1059:23;1055:32;1052:52;;;1100:1;1097;1090:12;1052:52;1140:9;1127:23;1173:18;1165:6;1162:30;1159:50;;;1205:1;1202;1195:12;1159:50;1228;1270:7;1261:6;1250:9;1246:22;1228:50;:::i;1481:173::-;1549:20;;-1:-1:-1;;;;;1598:31:1;;1588:42;;1578:70;;1644:1;1641;1634:12;1659:186;1718:6;1771:2;1759:9;1750:7;1746:23;1742:32;1739:52;;;1787:1;1784;1777:12;1739:52;1810:29;1829:9;1810:29;:::i;2032:254::-;2100:6;2108;2161:2;2149:9;2140:7;2136:23;2132:32;2129:52;;;2177:1;2174;2167:12;2129:52;2200:29;2219:9;2200:29;:::i;:::-;2190:39;2276:2;2261:18;;;;2248:32;;-1:-1:-1;;;2032:254:1:o;2499:180::-;2558:6;2611:2;2599:9;2590:7;2586:23;2582:32;2579:52;;;2627:1;2624;2617:12;2579:52;-1:-1:-1;2650:23:1;;2499:180;-1:-1:-1;2499:180:1:o;2684:183::-;2744:4;2777:18;2769:6;2766:30;2763:56;;;2799:18;;:::i;:::-;-1:-1:-1;2844:1:1;2840:14;2856:4;2836:25;;2684:183::o;2872:668::-;2926:5;2979:3;2972:4;2964:6;2960:17;2956:27;2946:55;;2997:1;2994;2987:12;2946:55;3033:6;3020:20;3059:4;3083:60;3099:43;3139:2;3099:43;:::i;:::-;3083:60;:::i;:::-;3177:15;;;3263:1;3259:10;;;;3247:23;;3243:32;;;3208:12;;;;3287:15;;;3284:35;;;3315:1;3312;3305:12;3284:35;3351:2;3343:6;3339:15;3363:148;3379:6;3374:3;3371:15;3363:148;;;3445:23;3464:3;3445:23;:::i;:::-;3433:36;;3489:12;;;;3396;;3363:148;;;-1:-1:-1;3529:5:1;2872:668;-1:-1:-1;;;;;;2872:668:1:o;3545:662::-;3599:5;3652:3;3645:4;3637:6;3633:17;3629:27;3619:55;;3670:1;3667;3660:12;3619:55;3706:6;3693:20;3732:4;3756:60;3772:43;3812:2;3772:43;:::i;3756:60::-;3850:15;;;3936:1;3932:10;;;;3920:23;;3916:32;;;3881:12;;;;3960:15;;;3957:35;;;3988:1;3985;3978:12;3957:35;4024:2;4016:6;4012:15;4036:142;4052:6;4047:3;4044:15;4036:142;;;4118:17;;4106:30;;4156:12;;;;4069;;4036:142;;4212:118;4298:5;4291:13;4284:21;4277:5;4274:32;4264:60;;4320:1;4317;4310:12;4335:128;4400:20;;4429:28;4400:20;4429:28;:::i;4468:1166::-;4654:6;4662;4670;4678;4686;4694;4747:3;4735:9;4726:7;4722:23;4718:33;4715:53;;;4764:1;4761;4754:12;4715:53;4787:29;4806:9;4787:29;:::i;:::-;4777:39;;4867:2;4856:9;4852:18;4839:32;4890:18;4931:2;4923:6;4920:14;4917:34;;;4947:1;4944;4937:12;4917:34;4970:61;5023:7;5014:6;5003:9;4999:22;4970:61;:::i;:::-;4960:71;;5084:2;5073:9;5069:18;5056:32;5040:48;;5113:2;5103:8;5100:16;5097:36;;;5129:1;5126;5119:12;5097:36;5152:63;5207:7;5196:8;5185:9;5181:24;5152:63;:::i;:::-;5142:73;;5268:2;5257:9;5253:18;5240:32;5224:48;;5297:2;5287:8;5284:16;5281:36;;;5313:1;5310;5303:12;5281:36;5336:63;5391:7;5380:8;5369:9;5365:24;5336:63;:::i;:::-;5326:73;;5418:36;5449:3;5438:9;5434:19;5418:36;:::i;:::-;5408:46;;5507:3;5496:9;5492:19;5479:33;5463:49;;5537:2;5527:8;5524:16;5521:36;;;5553:1;5550;5543:12;5521:36;;5576:52;5620:7;5609:8;5598:9;5594:24;5576:52;:::i;:::-;5566:62;;;4468:1166;;;;;;;;:::o;5639:1000::-;5791:6;5799;5807;5815;5823;5876:3;5864:9;5855:7;5851:23;5847:33;5844:53;;;5893:1;5890;5883:12;5844:53;5916:29;5935:9;5916:29;:::i;:::-;5906:39;;5996:2;5985:9;5981:18;5968:32;6019:18;6060:2;6052:6;6049:14;6046:34;;;6076:1;6073;6066:12;6046:34;6099:61;6152:7;6143:6;6132:9;6128:22;6099:61;:::i;:::-;6089:71;;6213:2;6202:9;6198:18;6185:32;6169:48;;6242:2;6232:8;6229:16;6226:36;;;6258:1;6255;6248:12;6226:36;6281:63;6336:7;6325:8;6314:9;6310:24;6281:63;:::i;:::-;6271:73;;6394:2;6383:9;6379:18;6366:32;6353:45;;6407:28;6429:5;6407:28;:::i;:::-;6454:5;;-1:-1:-1;6512:3:1;6497:19;;6484:33;;6529:16;;;6526:36;;;6558:1;6555;6548:12;6526:36;;6581:52;6625:7;6614:8;6603:9;6599:24;6581:52;:::i;:::-;6571:62;;;5639:1000;;;;;;;;:::o;6644:258::-;6716:1;6726:113;6740:6;6737:1;6734:13;6726:113;;;6816:11;;;6810:18;6797:11;;;6790:39;6762:2;6755:10;6726:113;;;6857:6;6854:1;6851:13;6848:48;;;6892:1;6883:6;6878:3;6874:16;6867:27;6848:48;;6644:258;;;:::o;6907:383::-;7056:2;7045:9;7038:21;7019:4;7088:6;7082:13;7131:6;7126:2;7115:9;7111:18;7104:34;7147:66;7206:6;7201:2;7190:9;7186:18;7181:2;7173:6;7169:15;7147:66;:::i;:::-;7274:2;7253:15;-1:-1:-1;;7249:29:1;7234:45;;;;7281:2;7230:54;;6907:383;-1:-1:-1;;6907:383:1:o;7295:1205::-;7462:6;7470;7478;7486;7494;7502;7510;7563:3;7551:9;7542:7;7538:23;7534:33;7531:53;;;7580:1;7577;7570:12;7531:53;7603:29;7622:9;7603:29;:::i;:::-;7593:39;;7683:2;7672:9;7668:18;7655:32;7706:18;7747:2;7739:6;7736:14;7733:34;;;7763:1;7760;7753:12;7733:34;7786:61;7839:7;7830:6;7819:9;7815:22;7786:61;:::i;:::-;7776:71;;7900:2;7889:9;7885:18;7872:32;7856:48;;7929:2;7919:8;7916:16;7913:36;;;7945:1;7942;7935:12;7913:36;7968:63;8023:7;8012:8;8001:9;7997:24;7968:63;:::i;:::-;7958:73;;8078:2;8067:9;8063:18;8050:32;8040:42;;8132:3;8121:9;8117:19;8104:33;8091:46;;8146:28;8168:5;8146:28;:::i;:::-;8193:5;;-1:-1:-1;8250:3:1;8235:19;;8222:33;;8264:30;8222:33;8264:30;:::i;:::-;8313:7;;-1:-1:-1;8373:3:1;8358:19;;8345:33;;8390:16;;;8387:36;;;8419:1;8416;8409:12;8387:36;;8442:52;8486:7;8475:8;8464:9;8460:24;8442:52;:::i;:::-;8432:62;;;7295:1205;;;;;;;;;;:::o;8505:864::-;8651:6;8659;8667;8675;8728:3;8716:9;8707:7;8703:23;8699:33;8696:53;;;8745:1;8742;8735:12;8696:53;8785:9;8772:23;8814:18;8855:2;8847:6;8844:14;8841:34;;;8871:1;8868;8861:12;8841:34;8894:61;8947:7;8938:6;8927:9;8923:22;8894:61;:::i;:::-;8884:71;;9008:2;8997:9;8993:18;8980:32;8964:48;;9037:2;9027:8;9024:16;9021:36;;;9053:1;9050;9043:12;9021:36;9076:63;9131:7;9120:8;9109:9;9105:24;9076:63;:::i;:::-;9066:73;;9186:2;9175:9;9171:18;9158:32;9148:42;;9243:2;9232:9;9228:18;9215:32;9199:48;;9272:2;9262:8;9259:16;9256:36;;;9288:1;9285;9278:12;9256:36;;9311:52;9355:7;9344:8;9333:9;9329:24;9311:52;:::i;:::-;9301:62;;;8505:864;;;;;;;:::o;9374:385::-;9460:6;9468;9476;9484;9537:3;9525:9;9516:7;9512:23;9508:33;9505:53;;;9554:1;9551;9544:12;9505:53;-1:-1:-1;;9577:23:1;;;9647:2;9632:18;;9619:32;;-1:-1:-1;9698:2:1;9683:18;;9670:32;;9749:2;9734:18;9721:32;;-1:-1:-1;9374:385:1;-1:-1:-1;9374:385:1:o;9764:328::-;9841:6;9849;9857;9910:2;9898:9;9889:7;9885:23;9881:32;9878:52;;;9926:1;9923;9916:12;9878:52;9949:29;9968:9;9949:29;:::i;:::-;9939:39;;9997:38;10031:2;10020:9;10016:18;9997:38;:::i;:::-;9987:48;;10082:2;10071:9;10067:18;10054:32;10044:42;;9764:328;;;;;:::o;10097:464::-;10184:6;10192;10200;10253:2;10241:9;10232:7;10228:23;10224:32;10221:52;;;10269:1;10266;10259:12;10221:52;10292:29;10311:9;10292:29;:::i;:::-;10282:39;;10372:2;10361:9;10357:18;10344:32;10399:18;10391:6;10388:30;10385:50;;;10431:1;10428;10421:12;10385:50;10454;10496:7;10487:6;10476:9;10472:22;10454:50;:::i;:::-;10444:60;;;10551:2;10540:9;10536:18;10523:32;10513:42;;10097:464;;;;;:::o;10566:260::-;10634:6;10642;10695:2;10683:9;10674:7;10670:23;10666:32;10663:52;;;10711:1;10708;10701:12;10663:52;10734:29;10753:9;10734:29;:::i;:::-;10724:39;;10782:38;10816:2;10805:9;10801:18;10782:38;:::i;:::-;10772:48;;10566:260;;;;;:::o;10831:396::-;10909:6;10917;10970:2;10958:9;10949:7;10945:23;10941:32;10938:52;;;10986:1;10983;10976:12;10938:52;11009:29;11028:9;11009:29;:::i;:::-;10999:39;;11089:2;11078:9;11074:18;11061:32;11116:18;11108:6;11105:30;11102:50;;;11148:1;11145;11138:12;11102:50;11171;11213:7;11204:6;11193:9;11189:22;11171:50;:::i;:::-;11161:60;;;10831:396;;;;;:::o;11232:404::-;11434:2;11416:21;;;11473:2;11453:18;;;11446:30;11512:34;11507:2;11492:18;;11485:62;-1:-1:-1;;;11578:2:1;11563:18;;11556:38;11626:3;11611:19;;11232:404::o;11993:127::-;12054:10;12049:3;12045:20;12042:1;12035:31;12085:4;12082:1;12075:15;12109:4;12106:1;12099:15;12125:168;12165:7;12231:1;12227;12223:6;12219:14;12216:1;12213:21;12208:1;12201:9;12194:17;12190:45;12187:71;;;12238:18;;:::i;:::-;-1:-1:-1;12278:9:1;;12125:168::o;12298:217::-;12338:1;12364;12354:132;;12408:10;12403:3;12399:20;12396:1;12389:31;12443:4;12440:1;12433:15;12471:4;12468:1;12461:15;12354:132;-1:-1:-1;12500:9:1;;12298:217::o;12773:475::-;12975:2;12957:21;;;13014:2;12994:18;;;12987:30;13053:34;13048:2;13033:18;;13026:62;13124:34;13119:2;13104:18;;13097:62;-1:-1:-1;;;13190:3:1;13175:19;;13168:38;13238:3;13223:19;;12773:475::o;13733:403::-;13935:2;13917:21;;;13974:2;13954:18;;;13947:30;14013:34;14008:2;13993:18;;13986:62;-1:-1:-1;;;14079:2:1;14064:18;;14057:37;14126:3;14111:19;;13733:403::o;14141:461::-;14194:3;14232:5;14226:12;14259:6;14254:3;14247:19;14285:4;14314:2;14309:3;14305:12;14298:19;;14351:2;14344:5;14340:14;14372:1;14382:195;14396:6;14393:1;14390:13;14382:195;;;14461:13;;-1:-1:-1;;;;;14457:39:1;14445:52;;14517:12;;;;14552:15;;;;14493:1;14411:9;14382:195;;;-1:-1:-1;14593:3:1;;14141:461;-1:-1:-1;;;;;14141:461:1:o;14607:435::-;14660:3;14698:5;14692:12;14725:6;14720:3;14713:19;14751:4;14780:2;14775:3;14771:12;14764:19;;14817:2;14810:5;14806:14;14838:1;14848:169;14862:6;14859:1;14856:13;14848:169;;;14923:13;;14911:26;;14957:12;;;;14992:15;;;;14884:1;14877:9;14848:169;;15047:768;-1:-1:-1;;;;;15410:32:1;;15392:51;;15479:3;15474:2;15459:18;;15452:31;;;-1:-1:-1;;15506:57:1;;15543:19;;15535:6;15506:57;:::i;:::-;15611:9;15603:6;15599:22;15594:2;15583:9;15579:18;15572:50;15645:44;15682:6;15674;15645:44;:::i;:::-;15631:58;;15737:9;15729:6;15725:22;15720:2;15709:9;15705:18;15698:50;15765:44;15802:6;15794;15765:44;:::i;:::-;15757:52;15047:768;-1:-1:-1;;;;;;;15047:768:1:o;15820:127::-;15881:10;15876:3;15872:20;15869:1;15862:31;15912:4;15909:1;15902:15;15936:4;15933:1;15926:15;16584:135;16623:3;16644:17;;;16641:43;;16664:18;;:::i;:::-;-1:-1:-1;16711:1:1;16700:13;;16584:135::o;16724:128::-;16764:3;16795:1;16791:6;16788:1;16785:13;16782:39;;;16801:18;;:::i;:::-;-1:-1:-1;16837:9:1;;16724:128::o;16857:562::-;-1:-1:-1;;;;;17142:32:1;;17124:51;;17211:2;17206;17191:18;;17184:30;;;-1:-1:-1;;17237:56:1;;17274:18;;17266:6;17237:56;:::i;:::-;17341:9;17333:6;17329:22;17324:2;17313:9;17309:18;17302:50;17369:44;17406:6;17398;17369:44;:::i;:::-;17361:52;16857:562;-1:-1:-1;;;;;;16857:562:1:o;17424:375::-;-1:-1:-1;;;;;17682:15:1;;;17664:34;;17734:15;;;;17729:2;17714:18;;17707:43;17781:2;17766:18;;17759:34;;;;17614:2;17599:18;;17424:375::o;17804:380::-;17883:1;17879:12;;;;17926;;;17947:61;;18001:4;17993:6;17989:17;17979:27;;17947:61;18054:2;18046:6;18043:14;18023:18;18020:38;18017:161;;18100:10;18095:3;18091:20;18088:1;18081:31;18135:4;18132:1;18125:15;18163:4;18160:1;18153:15;18189:982;18274:12;;18239:3;;18329:1;18349:18;;;;18402;;;;18429:61;;18483:4;18475:6;18471:17;18461:27;;18429:61;18509:2;18557;18549:6;18546:14;18526:18;18523:38;18520:161;;18603:10;18598:3;18594:20;18591:1;18584:31;18638:4;18635:1;18628:15;18666:4;18663:1;18656:15;18520:161;18697:18;18724:104;;;;18842:1;18837:328;;;;18690:475;;18724:104;-1:-1:-1;;18757:24:1;;18745:37;;18802:16;;;;-1:-1:-1;18724:104:1;;18837:328;18868:5;18865:1;18858:16;18915:2;18912:1;18902:16;18940:1;18954:165;18968:6;18965:1;18962:13;18954:165;;;19046:14;;19033:11;;;19026:35;19089:16;;;;18983:10;;18954:165;;;18958:3;;19148:6;19143:3;19139:16;19132:23;;18690:475;;;;;;;18189:982;;;;:::o;19176:197::-;19304:3;19329:38;19363:3;19355:6;19329:38;:::i;19726:415::-;19928:2;19910:21;;;19967:2;19947:18;;;19940:30;20006:34;20001:2;19986:18;;19979:62;-1:-1:-1;;;20072:2:1;20057:18;;20050:49;20131:3;20116:19;;19726:415::o;20146:465::-;20403:2;20392:9;20385:21;20366:4;20429:56;20481:2;20470:9;20466:18;20458:6;20429:56;:::i;:::-;20533:9;20525:6;20521:22;20516:2;20505:9;20501:18;20494:50;20561:44;20598:6;20590;20561:44;:::i;:::-;20553:52;20146:465;-1:-1:-1;;;;;20146:465:1:o;20895:245::-;20962:6;21015:2;21003:9;20994:7;20990:23;20986:32;20983:52;;;21031:1;21028;21021:12;20983:52;21063:9;21057:16;21082:28;21104:5;21082:28;:::i;21145:184::-;21215:6;21268:2;21256:9;21247:7;21243:23;21239:32;21236:52;;;21284:1;21281;21274:12;21236:52;-1:-1:-1;21307:16:1;;21145:184;-1:-1:-1;21145:184:1:o;21334:125::-;21374:4;21402:1;21399;21396:8;21393:34;;;21407:18;;:::i;:::-;-1:-1:-1;21444:9:1;;21334:125::o;23091:276::-;23222:3;23260:6;23254:13;23276:53;23322:6;23317:3;23310:4;23302:6;23298:17;23276:53;:::i;:::-;23345:16;;;;;23091:276;-1:-1:-1;;23091:276:1:o;25163:793::-;-1:-1:-1;;;25569:3:1;25562:37;25544:3;25628:6;25622:13;25644:62;25699:6;25694:2;25689:3;25685:12;25678:4;25670:6;25666:17;25644:62;:::i;:::-;25770:27;25765:2;25725:16;;;25757:11;;;25750:48;25823:13;;25845:63;25823:13;25894:2;25886:11;;25879:4;25867:17;;25845:63;:::i;:::-;25928:17;25947:2;25924:26;;25163:793;-1:-1:-1;;;;25163:793:1:o;25961:204::-;25999:3;26035:4;26032:1;26028:12;26067:4;26064:1;26060:12;26102:3;26096:4;26092:14;26087:3;26084:23;26081:49;;;26110:18;;:::i;:::-;26146:13;;25961:204;-1:-1:-1;;;25961:204:1:o

Swarm Source

ipfs://35c5e8f3553979e1813663e7cc74e13ddf5806e704cbbd11a72f3fd977376b3a

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.