Contract 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b7 1

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc684236973558902edc03a896ca2886f9fbcece1276d3cf009aba7961c3d6688Airdrop Native C...301181482022-06-29 1:11:271 day 9 hrs ago0x112bd86924166d8eb30fbf7b3bf580aa4834208e IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b71.1 MATIC0.013474033336 31.020000037
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7bAirdrop Native C...301140772022-06-28 22:42:471 day 12 hrs ago0x112bd86924166d8eb30fbf7b3bf580aa4834208e IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b72 MATIC0.02287923876 30.380000001
0xa4db519010b984177bc06899cf6b732d24d726cc1b0792031c8fbe75922367e6Airdrop Native C...300956982022-06-28 11:27:121 day 23 hrs ago0x112bd86924166d8eb30fbf7b3bf580aa4834208e IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70.7 MATIC0.009369871175 32.010000018
0xcd4a115c45842151981b4f8ec0da1bfc82b96ff44d9581646be1872c56c2d399Airdrop Native C...300881102022-06-28 6:41:002 days 4 hrs ago0x112bd86924166d8eb30fbf7b3bf580aa4834208e IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70.6 MATIC0.003230123348 30.095531946
0x48fe2c6cc1bffb5e3b4bb4d2918b84619aa6467806fcc80d0ed7cf6a777d5ad3Airdrop Native C...300879662022-06-28 6:34:582 days 4 hrs ago0x112bd86924166d8eb30fbf7b3bf580aa4834208e IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70.3 MATIC0.004925087122 42.777000042
0x7fac1be86c1b93fd7f60ca827abecf0127727a7d8a4a85459b2467a6f98e8452Airdrop Native C...300864852022-06-28 5:40:542 days 5 hrs ago0xda15a089ce396c50fdc1c01afdb97c90ca9b0e68 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b71.1 MATIC0.003035940001 30.000000012
0x9e3cd7df8716b64c64fab98ef1c539a76b0319aa2ab7da3b5e7e298221ddb6c1Erc20Airdrop300425482022-06-27 2:19:213 days 8 hrs agoDark Spirit DAO: Deployer IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.009781493015 35.85354711
0x0944cb4176a918ac630f5cc0b81108cf230ea7b905e3b526cb8f910bad6d863cAirdrop Native C...300154092022-06-26 10:09:084 days 46 mins ago0x09f525006e09daf11082ea2beb0a185c4c81bda6 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b77.8 MATIC0.007719870004 30.000000017
0x2103628499d416bb02bba764fdc908cf27235d3591a1f31373265a6defa5e864Airdrop Native C...299783732022-06-25 10:58:094 days 23 hrs ago0x09f525006e09daf11082ea2beb0a185c4c81bda6 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b715 MATIC0.013140210012 30.000000028
0xad2f409499c9255e2412ba1827349cc9b80b953cd4f9dfdf8bfc156a896abdd7Airdrop Native C...299738542022-06-25 7:44:215 days 3 hrs ago0x165322c2d07a06ea61a737cc8339418034b2c280 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70.1 MATIC0.016691580902 90.030587559
0x470f3020662043438d6fa4de429236b5ea1d53975aa27244c9fb40725d7e495dErc20Airdrop299185492022-06-23 20:11:206 days 14 hrs ago0xf5a651eeee38ddc35aa8db88e4d44079ec1f36b7 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.00833451552 48.085500359
0xd501d47da6b571ce81a2d39bec285c213238d9b1be1fee8c1994d94b69fa9c7bErc20Airdrop298270052022-06-21 11:44:248 days 23 hrs ago0x5118639e30f555cc30a266971c08b83ef2ed66a3 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.16707974033 30.118208986
0x19365f4ae9198b2c2146f319acf0eaeb25ccb8869a2e7f89a158b6be209eb497Erc20Airdrop298167802022-06-21 5:28:499 days 5 hrs ago0x210efca155797119a5b0f1cfde64ca1fe55ec544 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.244547790904 30.000000111
0x366e677433b53601b4c0df9620ef082cab6ccfe0a1913bdcd508a384ad5fc35aErc20Airdrop298156402022-06-21 4:45:219 days 6 hrs ago0x210efca155797119a5b0f1cfde64ca1fe55ec544 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.004225380001 30.000000014
0x00ac7eb2cf696ff8b34ffcc286f62c50fa76ad7659693dcdad8a2e4850b0889aErc20Airdrop298147712022-06-21 4:13:199 days 6 hrs ago0x8c9e7ee24b97d118f4b0f28e4da89d349db2f28b IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.025101460507 30.900000009
0x548c75c4815adea4e7d691152ce6cc1cae5082d1aaa4dd47b03ab6a7237b5196Erc20Airdrop297833002022-06-20 7:27:1610 days 3 hrs ago0x5a3d82773ddf8c31c4ff5f893acfe74db08ee0dc IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.220557390205 30.000000028
0xf079e9a29e2539b10eb0723c960ff7042e3a5742a4d2cc74ec4b2b5f76a5e02bErc20Airdrop297652452022-06-19 19:58:5110 days 14 hrs ago0x3ae21ca67258d1a24b49a186493f4fbb7808fe1d IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.025497158568 30.999999475
0x907b0214ba4d4099e24b2adc3772330b3cc76a59608f5eb6f4a3dc98501a6187Erc20Airdrop297652372022-06-19 19:58:3510 days 14 hrs ago0x3ae21ca67258d1a24b49a186493f4fbb7808fe1d IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.291532241062 30.999999475
0x34c37327a2d5d520669d525cefd462e50cc10fca15a48546e42865dbb3c366f2Erc20Airdrop297652242022-06-19 19:58:0910 days 14 hrs ago0x3ae21ca67258d1a24b49a186493f4fbb7808fe1d IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.293273015033 30.999999475
0x774850e72138ea5e4b3108bc37142aea2777003f80cecb22f23412400cc69e2bErc20Airdrop297158782022-06-18 13:16:3311 days 21 hrs ago0x04d96907b4e227a426ccfb261cf6713c449c0529 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.033115680016 30.000000015
0x9d180ab8dcbd7ae6dea556258903d75d7eb83229c90ecfe0249f6e6bbe631631Add Affiliate297143912022-06-18 12:23:1311 days 22 hrs ago0x210efca155797119a5b0f1cfde64ca1fe55ec544 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.004199550002 30.00000002
0xbde4bb6f52b83d7a93c7153c09369df1c6d106369a52985f88d5a2779ced903aErc20Airdrop295796182022-06-15 1:43:5015 days 9 hrs agoDark Spirit DAO: Deployer IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70 MATIC0.027972603738 34.185721962
0xc9bd888880569dc1f3d073bbe2e3ccd270417820576a9b4ecb5e654f03ff9cc2Erc20Airdrop295771562022-06-15 0:12:5015 days 10 hrs ago0x55e0a3cd856cf14e289ba924e740e50d0201b5e5 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70.4 MATIC0.005782686986 31.999994391
0x0df0ba8122e826646ffdd9f62f5ace71be798f79034f89534dff9c84773c0954Erc20Airdrop295742032022-06-14 22:26:5815 days 12 hrs ago0x55e0a3cd856cf14e289ba924e740e50d0201b5e5 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70.8 MATIC0.007435872383 30.000413073
0xccf301fa44dcee71a7cea662fae096bb682a3693f6d3f5750a42a56add4a46c4Erc20Airdrop295712422022-06-14 20:43:0315 days 14 hrs ago0x55e0a3cd856cf14e289ba924e740e50d0201b5e5 IN  0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70.7 MATIC0.007845524203 33.947583601
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0xc684236973558902edc03a896ca2886f9fbcece1276d3cf009aba7961c3d6688301181482022-06-29 1:11:271 day 9 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x8cc4b6ed7f6193e244aadf63d391f1bede5bd2680.1 MATIC
0xc684236973558902edc03a896ca2886f9fbcece1276d3cf009aba7961c3d6688301181482022-06-29 1:11:271 day 9 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x8034b821029aaf2128f949379bbe32448decd3c20.1 MATIC
0xc684236973558902edc03a896ca2886f9fbcece1276d3cf009aba7961c3d6688301181482022-06-29 1:11:271 day 9 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x9c339df743d2e38a575e701192ce1dbf5457053e0.1 MATIC
0xc684236973558902edc03a896ca2886f9fbcece1276d3cf009aba7961c3d6688301181482022-06-29 1:11:271 day 9 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x01e415c7d44e58941ded4103af191a20df8106990.1 MATIC
0xc684236973558902edc03a896ca2886f9fbcece1276d3cf009aba7961c3d6688301181482022-06-29 1:11:271 day 9 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70xc7039ab87fb147766fcb13f98011a57216ca8b780.1 MATIC
0xc684236973558902edc03a896ca2886f9fbcece1276d3cf009aba7961c3d6688301181482022-06-29 1:11:271 day 9 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70xac6c738d2f6039ecbce17f4dc6a4580d513a3a4e0.1 MATIC
0xc684236973558902edc03a896ca2886f9fbcece1276d3cf009aba7961c3d6688301181482022-06-29 1:11:271 day 9 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x75ae3070691d040c7412535e20f69c88386dabe50.1 MATIC
0xc684236973558902edc03a896ca2886f9fbcece1276d3cf009aba7961c3d6688301181482022-06-29 1:11:271 day 9 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x340238d999776164b248b64d20f964f1c08d1dee0.1 MATIC
0xc684236973558902edc03a896ca2886f9fbcece1276d3cf009aba7961c3d6688301181482022-06-29 1:11:271 day 9 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x1df5f5c526251a2c0cb41a0f0a7c1ecdb387d49e0.1 MATIC
0xc684236973558902edc03a896ca2886f9fbcece1276d3cf009aba7961c3d6688301181482022-06-29 1:11:271 day 9 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x88e37076ea7428c261985c9cc9700e9b13023ced0.1 MATIC
0xc684236973558902edc03a896ca2886f9fbcece1276d3cf009aba7961c3d6688301181482022-06-29 1:11:271 day 9 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x8db74a535457aacc7aef40cd8e00c16a493991640.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70xbd4576e814596b5387f39aebc419f8e0fcf276e10.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70xf536f69c6c0e3ed1097fafc8672d17149c6287880.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70xd3c6c5ebf5ab75b835fafd667e8e5dd15b9bc99d0.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x95f1f45f0fe2b6554bedde06efaacb7301ccea9b0.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70xbc15e2fac6bcfc7594b92b72419376b0770c173f0.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70xd147070ba06bd3c89dcb379fc80dcb3a421d241b0.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x373ae8ecd0f0b68a2b3ecdfc281119526510ed0d0.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70xa3e367e35bec47f8237a31605690c794391342270.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x5e5174ef4d69ba23f9bc813253839b97acad1cfe0.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x3cfec5c8e11734a9c7d59d12f0e67718f392cf600.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70xfba67d5d1cffc169656a7f54bf4c1df04e78fcbc0.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x32d2433197b103c5ffb561f180a750bda32cd6120.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70x0bad4cb771f36650ad99b3cffb6ccca4a4c5b3ff0.1 MATIC
0x77e715652bd3c742e378f485592abac5ce3698a1b7881e138170794b1b143f7b301140772022-06-28 22:42:471 day 12 hrs ago 0xb8615ad742c604e2920a82fdfcdd6cd93c56b4b70xbe049dbdb2c8926311f680b5d51f7b207f06b0590.1 MATIC
[ Download CSV Export 
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 polygonscan.com on 2022-05-18
*/

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(0x8DcCba703e3CA40D3D50435A06637c577D36AAFb);
    }

    /**
     * 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"}]

608060405234801561001057600080fd5b50600080546001600160a01b03199081163317909155610bb860145566012f2a36ecd555601555670c7d713b49da0000600f55671158e460913d0000601055671bc16d674ec800006011556722b1c8c1227a0000601255674563918244f4000060135560168054909116738dccba703e3ca40d3d50435a06637c577d36aafb179055614287806100a16000396000f3fe60806040526004361061039b5760003560e01c80636dd77649116101dc578063ac5b2bbc11610102578063df3b0ad1116100a0578063f2fde38b1161006f578063f2fde38b14610af6578063f519983514610b16578063f86af85114610b43578063fec5c0c614610b5657600080fd5b8063df3b0ad114610a8a578063e24f6a9714610aa0578063e5a8ec5b14610ac0578063ea7ee01014610ad657600080fd5b8063bcdd1e13116100dc578063bcdd1e13146109fa578063be6630c814610a1a578063ceb10f0b14610a4a578063d34937db14610a6a57600080fd5b8063ac5b2bbc146109a4578063b1867685146109c4578063bb12db5c146109e457600080fd5b80638ad95cf11161017a57806398adf5771161014957806398adf57714610939578063a39a2b761461095b578063a7296ee914610971578063a7ced8e21461098457600080fd5b80638ad95cf1146108b95780638da5cb5b146108d95780638faea9a7146108f95780638ffd58ad1461091957600080fd5b806386a9a599116101b657806386a9a5991461082e578063893d20e81461084e578063896bac231461086c5780638a53a1301461088c57600080fd5b80636dd77649146107e657806375f1a95a146107f957806385fc0de71461081957600080fd5b806339cb9ba8116102c15780634a4a2feb1161025f578063590925e21161022e578063590925e214610728578063593d98b114610769578063638c5da9146107895780636cca7d3c146107b957600080fd5b80634a4a2feb146106a55780634a4df559146106d25780634fa85186146106e5578063583a23901461071557600080fd5b80633d2375f91161029b5780633d2375f91461060a578063428b52f81461064557806343a92b41146106725780634930df8f1461069257600080fd5b806339cb9ba8146105c15780633aaff47f146105d45780633b9ff843146105ea57600080fd5b80631e93a9f2116103395780632c4e722e116103085780632c4e722e146105405780632f5f1a341461055657806334fcf4371461058e5780633671caa0146105ae57600080fd5b80631e93a9f2146104d557806323a0fb02146104eb57806324600fc31461050b5780632a769eb41461052057600080fd5b80630e160255116103755780630e1602551461042d57806317077fb71461046557806319acc3671461048557806319d30a40146104b557600080fd5b806306d7d80f146103aa578063088ea102146103d25780630ad92c311461040d57600080fd5b366103a557600080fd5b600080fd5b6103bd6103b83660046136f3565b610b76565b60405190151581526020015b60405180910390f35b3480156103de57600080fd5b506103ff6103ed36600461373f565b60076020526000908152604090205481565b6040519081526020016103c9565b34801561041957600080fd5b506103bd61042836600461373f565b610b8f565b34801561043957600080fd5b506103ff6104483660046136f3565b8051602081830181018051600e8252928201919093012091525481565b34801561047157600080fd5b506103ff61048036600461373f565b610c40565b34801561049157600080fd5b506103bd6104a036600461373f565b60056020526000908152604090205460ff1681565b3480156104c157600080fd5b506103bd6104d036600461373f565b610c9e565b3480156104e157600080fd5b506103ff60135481565b3480156104f757600080fd5b506103bd61050636600461373f565b610cdf565b34801561051757600080fd5b506103bd610cfd565b34801561052c57600080fd5b506103ff61053b36600461375a565b610d6a565b34801561054c57600080fd5b506103ff60145481565b34801561056257600080fd5b50601654610576906001600160a01b031681565b6040516001600160a01b0390911681526020016103c9565b34801561059a57600080fd5b506103bd6105a9366004613784565b610dc5565b6103bd6105bc3660046138a7565b610e6b565b6103bd6105cf366004613974565b611272565b3480156105e057600080fd5b506103ff60125481565b3480156105f657600080fd5b506103bd61060536600461373f565b6115a2565b34801561061657600080fd5b506103bd6106253660046136f3565b8051602081830181018051600b8252928201919093012091525460ff1681565b34801561065157600080fd5b506103ff61066036600461373f565b60036020526000908152604090205481565b34801561067e57600080fd5b506103bd61068d36600461373f565b611703565b6103bd6106a03660046136f3565b61179e565b3480156106b157600080fd5b506106c56106c036600461373f565b6117ae565b6040516103c99190613a52565b6103bd6106e0366004613a85565b611848565b3480156106f157600080fd5b506103bd61070036600461373f565b60096020526000908152604090205460ff1681565b6103bd610723366004613b51565b611e8a565b34801561073457600080fd5b506105766107433660046136f3565b8051602081830181018051600a825292820191909301209152546001600160a01b031681565b34801561077557600080fd5b506103bd61078436600461373f565b6120b1565b34801561079557600080fd5b506103bd6107a436600461373f565b60066020526000908152604090205460ff1681565b3480156107c557600080fd5b506103ff6107d436600461373f565b60016020526000908152604090205481565b6103bd6107f43660046136f3565b6120cf565b34801561080557600080fd5b506103bd61081436600461375a565b6120df565b34801561082557600080fd5b506103bd612176565b34801561083a57600080fd5b506103bd61084936600461373f565b6121f1565b34801561085a57600080fd5b506000546001600160a01b0316610576565b34801561087857600080fd5b506103bd610887366004613be3565b612269565b34801561089857600080fd5b506103ff6108a736600461373f565b60026020526000908152604090205481565b3480156108c557600080fd5b506103bd6108d4366004613784565b6122da565b3480156108e557600080fd5b50600054610576906001600160a01b031681565b34801561090557600080fd5b506103bd61091436600461373f565b61230e565b34801561092557600080fd5b506103ff61093436600461373f565b61234f565b34801561094557600080fd5b5061095961095436600461373f565b61238d565b005b34801561096757600080fd5b506103ff60155481565b6103bd61097f3660046136f3565b6123d9565b34801561099057600080fd5b506103bd61099f36600461375a565b6123ea565b3480156109b057600080fd5b506103ff6109bf36600461373f565b612436565b3480156109d057600080fd5b506106c56109df36600461373f565b61246c565b3480156109f057600080fd5b506103ff60105481565b348015610a0657600080fd5b506103bd610a15366004613c15565b612485565b348015610a2657600080fd5b506103bd610a3536600461373f565b60086020526000908152604090205460ff1681565b348015610a5657600080fd5b506103bd610a6536600461375a565b61256c565b348015610a7657600080fd5b506103bd610a8536600461373f565b6125b8565b348015610a9657600080fd5b506103ff60115481565b348015610aac57600080fd5b506103bd610abb366004613c51565b612670565b348015610acc57600080fd5b506103ff600f5481565b348015610ae257600080fd5b506103ff610af1366004613ca8565b612947565b348015610b0257600080fd5b50610959610b1136600461373f565b6129c4565b348015610b2257600080fd5b506103ff610b3136600461373f565b60046020526000908152604090205481565b6103bd610b51366004613cdb565b612a78565b348015610b6257600080fd5b506103bd610b7136600461373f565b612b7c565b6000610b86601f60115484612c52565b50600192915050565b600080546001600160a01b03163314610bc35760405162461bcd60e51b8152600401610bba90613d29565b60405180910390fd5b610bcc8261230e565b15610c135760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b506001600160a01b0381166000908152600860205260409020805460ff191660019081179091555b919050565b6001600160a01b03811660009081526007602052604081205415610c96576001600160a01b038216600090815260076020526040902054601354606491610c8691613d87565b610c909190613da6565b92915050565b505060135490565b6001600160a01b03811660009081526004602052604081205442111580610c905750506001600160a01b031660009081526005602052604090205460ff1690565b6001600160a01b031660009081526001602052604090205460641190565b600080546001600160a01b03163314610d285760405162461bcd60e51b8152600401610bba90613d29565b600080546040516001600160a01b03909116914780156108fc02929091818181858888f19350505050158015610d62573d6000803e3d6000fd5b506001905090565b6001600160a01b03821660009081526003602052604081205415610dbf576001600160a01b038316600090815260036020526040902054606490610dae9084613d87565b610db89190613da6565b9050610c90565b50919050565b600080546001600160a01b03163314610df05760405162461bcd60e51b8152600401610bba90613d29565b6014548214158015610e025750600082115b610e0b57600080fd5b60145460408051918252602082018490527f4ac9052a820bf4f8c02d7588587cae835573b5b99ea7ad4ca002f17f319f7186910160405180910390a16014829055670de0b6b3a7640000610e5f8382613da6565b60155550600192915050565b60008451865114610e8e5760405162461bcd60e51b8152600401610bba90613dc8565b8351865114610f155760405162461bcd60e51b815260206004820152604760248201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460448201527f6f74616c206e756d626572206f6620616d6f756e747320617265206e6f74207460648201526668652073616d6560c81b608482015260a401610bba565b6000610f2083612d8c565b60155488519192508991600091610f3691613d87565b90506000610f4333610c9e565b80610f525750610f528b61230e565b90506000610f5f8c610cdf565b8015610f6f5750610f6f336120b1565b90508234101580610f7d5750805b80610f855750815b610fa15760405162461bcd60e51b8152600401610bba90613e35565b8080610faa5750815b8015610fb65750600034115b15610fed5760405133903480156108fc02916000818181858888f19350505050158015610fe7573d6000803e3d6000fd5b50610ff6565b610ff6836131f8565b8715611065576040516322e31d0560e11b81526001600160a01b038516906345c63a0a9061102e9033908f908f908f90600401613ef0565b600060405180830381600087803b15801561104857600080fd5b505af115801561105c573d6000803e3d6000fd5b50505050611161565b60005b8b5181101561115f57846001600160a01b031663f242432a338e848151811061109357611093613f45565b60200260200101518e85815181106110ad576110ad613f45565b60200260200101518e86815181106110c7576110c7613f45565b60209081029190910101516040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260a06084820152600060a482015260c401600060405180830381600087803b15801561113457600080fd5b505af1158015611148573d6000803e3d6000fd5b50505050808061115790613f5b565b915050611068565b505b61116a8c610cdf565b156111ae578a516001600160a01b038d166000908152600160205260409020546111949190613f74565b6001600160a01b038d166000908152600160205260409020555b6111b7336120b1565b156111e9578a51336000908152600260205260409020546111d89190613f74565b336000908152600260205260409020555b801580156111f5575081155b15611212576112126015548c5161120c9190613d87565b86613242565b8b6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768d5160405161125891815260200190565b60405180910390a35060019b9a5050505050505050505050565b600083518551146112955760405162461bcd60e51b8152600401610bba90613dc8565b60006112a083612d8c565b601554875191925088916000916112b691613d87565b905060006112c333610c9e565b806112d257506112d28a61230e565b905060006112df8b610cdf565b80156112ef57506112ef336120b1565b905082341015806112fd5750805b806113055750815b6113215760405162461bcd60e51b8152600401610bba90613e35565b808061132a5750815b80156113365750600034115b1561136d5760405133903480156108fc02916000818181858888f19350505050158015611367573d6000803e3d6000fd5b50611376565b611376836131f8565b87156113e3576040516304b1cddf60e31b81526001600160a01b0385169063258e6ef8906113ac9033908e908e90600401613f8c565b600060405180830381600087803b1580156113c657600080fd5b505af11580156113da573d6000803e3d6000fd5b50505050611498565b60005b8a5181101561149657846001600160a01b03166323b872dd338d848151811061141157611411613f45565b60200260200101518d858151811061142b5761142b613f45565b60200260200101516040518463ffffffff1660e01b815260040161145193929190613fcc565b600060405180830381600087803b15801561146b57600080fd5b505af115801561147f573d6000803e3d6000fd5b50505050808061148e90613f5b565b9150506113e6565b505b6114a18b610cdf565b156114e55789516001600160a01b038c166000908152600160205260409020546114cb9190613f74565b6001600160a01b038c166000908152600160205260409020555b6114ee336120b1565b156115205789513360009081526002602052604090205461150f9190613f74565b336000908152600260205260409020555b8015801561152c575081155b15611543576115436015548b5161120c9190613d87565b8a6001600160a01b0316336001600160a01b03167f1063145c965d286a343f0a3e8139199e3c86cab6ac1adb1d604a135295f43c768c5160405161158991815260200190565b60405180910390a35060019a9950505050505050505050565b600080546001600160a01b031633146115cd5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526009602052604090205460ff166115f257600080fd5b6001600160a01b0382166000908152600960209081526040808320805460ff19169055600c9091528082209051600a9161162b916140bc565b908152604080516020928190038301812080546001600160a01b0319166001600160a01b039586161790559285166000908152600c909252902061166e916140bc565b604051908190038120906001600160a01b038416907f4ddc7b8659a2faf8698c810ab0219aa981bfccb47c036d3cc7ae8a32c15dc4ec90600090a3604080518082018252601e81527f4e6f206c6f6e67657220616e20616666696c6961746520706172746e6572000060208083019182526001600160a01b0386166000908152600c909152929092209051610b8692906135ac565b600080546001600160a01b0316331461172e5760405162461bcd60e51b8152600401610bba90613d29565b6117378261230e565b6117795760405162461bcd60e51b815260206004820152601360248201527224b9903737ba103634b9ba32b2103a37b5b2b760691b6044820152606401610bba565b506001600160a01b03166000908152600860205260409020805460ff19169055600190565b6000610b86600760105484612c52565b600c60205260009081526040902080546117c790613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546117f390613ff0565b80156118405780601f1061181557610100808354040283529160200191611840565b820191906000526020600020905b81548152906001019060200180831161182357829003601f168201915b505050505081565b60008061185483612d8c565b875189519192508a911461187a5760405162461bcd60e51b8152600401610bba906140c8565b60006015548a5161188b9190613d87565b9050600061189833610c9e565b806118a757506118a78c61230e565b905060006118b48d610cdf565b80156118c457506118c4336120b1565b905082341015806118d957506118d98d610cdf565b806118e857506118e8336120b1565b806118f05750815b61190c5760405162461bcd60e51b8152600401610bba90613e35565b80806119155750815b80156119215750600034115b156119585760405133903480156108fc02916000818181858888f19350505050158015611952573d6000803e3d6000fd5b50611961565b611961836131f8565b8715611a2e576040516323b872dd60e01b81526001600160a01b038516906323b872dd9061199790339030908f90600401613fcc565b600060405180830381600087803b1580156119b157600080fd5b505af11580156119c5573d6000803e3d6000fd5b5050604051633ae4b60360e21b81526001600160a01b038716925063eb92d80c91506119f7908f908f9060040161411b565b600060405180830381600087803b158015611a1157600080fd5b505af1158015611a25573d6000803e3d6000fd5b50505050611d7e565b88611cc9576040516323b872dd60e01b81526001600160a01b038516906323b872dd90611a6390339030908f90600401613fcc565b600060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b5050505060005b8c51811015611b6b57846001600160a01b031663a9059cbb8e8381518110611ac257611ac2613f45565b60200260200101518e8481518110611adc57611adc613f45565b60200260200101516040518363ffffffff1660e01b8152600401611b159291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af1158015611b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b589190614149565b5080611b6381613f5b565b915050611a98565b506040516370a0823160e01b81523060048201526000906001600160a01b038616906370a08231906024016020604051808303816000875af1158015611bb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd99190614166565b1115611cc4576040516370a0823160e01b81523060048201526001600160a01b0385169063a9059cbb90339083906370a08231906024016020604051808303816000875af1158015611c2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c539190614166565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc29190614149565b505b611d7e565b60005b8c51811015611d7c57846001600160a01b03166323b872dd338f8481518110611cf757611cf7613f45565b60200260200101518f8581518110611d1157611d11613f45565b60200260200101516040518463ffffffff1660e01b8152600401611d3793929190613fcc565b600060405180830381600087803b158015611d5157600080fd5b505af1158015611d65573d6000803e3d6000fd5b505050508080611d7490613f5b565b915050611ccc565b505b611d878d610cdf565b15611dcb578b516001600160a01b038e16600090815260016020526040902054611db19190613f74565b6001600160a01b038e166000908152600160205260409020555b611dd4336120b1565b15611e06578b5133600090815260026020526040902054611df59190613f74565b336000908152600260205260409020555b80158015611e12575081155b15611e2957611e296015548d5161120c9190613d87565b8c6001600160a01b0316336001600160a01b03167f39015fe519110ce3ccad418b153817407dc5312684839c8700af7436a80a07af8e51604051611e6f91815260200190565b60405180910390a35060019c9b505050505050505050505050565b60008351855114611ead5760405162461bcd60e51b8152600401610bba906140c8565b60155485518491600091611ec19190613d87565b90506000611ecf8284613f74565b90506000611edc336120b1565b90506000611ee933610c9e565b1515600115151490508234101580611efe5750805b80611f065750815b611f225760405162461bcd60e51b8152600401610bba90613e35565b611f2b87612d8c565b965080158015611f39575081155b15611f4857611f488488613242565b8080611f515750815b8015611f5c57508734115b15611f9d57336108fc611f6f8a3461417f565b6040518115909202916000818181858888f19350505050158015611f97573d6000803e3d6000fd5b50611fa6565b611fa6836131f8565b60005b8a51811015612030578a8181518110611fc457611fc4613f45565b60200260200101516001600160a01b03166108fc8b8381518110611fea57611fea613f45565b60200260200101519081150290604051600060405180830381858888f1935050505015801561201d573d6000803e3d6000fd5b508061202881613f5b565b915050611fa9565b508115612064578951336000908152600260205260409020546120539190613f74565b336000908152600260205260409020555b8951604080519182526020820187905233917f96280f1b9a54271a5ff3d2bc027d857d9386da43de7540d42b8b73180a15864a910160405180910390a25060019998505050505050505050565b6001600160a01b031660009081526002602052604090205460641190565b6000610b866001600f5484612c52565b600080546001600160a01b0316331461210a5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03831660009081526009602052604090205460ff1661212f57600080fd5b6001600160a01b0383166000908152600c60205260409081902090518390600e9061215b9084906140bc565b90815260405190819003602001902055506001905092915050565b6000612181336121f1565b6121cd5760405162461bcd60e51b815260206004820152601960248201527f4e6f206d656d6265727368697020746f207472616e73666572000000000000006044820152606401610bba565b6121db4263bbf81e00613f74565b3360009081526004602052604090205550600190565b601654604051633a28175360e21b81526001600160a01b0383811660048301526000921690819063e8a05d4c90602401602060405180830381865afa15801561223e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122629190614149565b9392505050565b600080546001600160a01b031633146122945760405162461bcd60e51b8152600401610bba90613d29565b6000851180156122a357508385105b80156122ae57508284105b80156122b957508183105b6122c257600080fd5b50600f93909355601091909155601155601255600190565b600080546001600160a01b031633146123055760405162461bcd60e51b8152600401610bba90613d29565b50601355600190565b6001600160a01b03811660009081526006602052604081205460ff1680610c905750506001600160a01b031660009081526008602052604090205460ff1690565b600061235a82610cdf565b15612385576001600160a01b038216600090815260016020526040902054606490612262908261417f565b506000919050565b6000546001600160a01b031633146123b75760405162461bcd60e51b8152600401610bba90613d29565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000610b86618e9460125484612c52565b600080546001600160a01b031633146124155760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260076020526040902055600190565b6000612441826120b1565b15612385576001600160a01b038216600090815260026020526040902054606490612262908261417f565b600d60205260009081526040902080546117c790613ff0565b600080546001600160a01b031633146124b05760405162461bcd60e51b8152600401610bba90613d29565b60405163a9059cbb60e01b81526001600160a01b0384811660048301526024820184905285919082169063a9059cbb906044016020604051808303816000875af1158015612502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125269190614149565b507ee763f7778b8ceef7270c89b7d1df1008b0e482da39c43831417733af96fb0d85858560405161255993929190613fcc565b60405180910390a1506001949350505050565b600080546001600160a01b031633146125975760405162461bcd60e51b8152600401610bba90613d29565b506001600160a01b0391909116600090815260036020526040902055600190565b600080546001600160a01b031633146125e35760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03821660009081526005602052604090205460ff1661264b5760405162461bcd60e51b815260206004820152601860248201527f4e6f742061206772616e746564206d656d6265727368697000000000000000006044820152606401610bba565b506001600160a01b03166000908152600560205260409020805460ff19169055600190565b600080546001600160a01b0316331461269b5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03841660009081526009602052604090205460ff16156127045760405162461bcd60e51b815260206004820181905260248201527f4164647265737320697320616c726561647920616e20616666696c696174652e6044820152606401610bba565b6001600160a01b03841661275a5760405162461bcd60e51b815260206004820152601860248201527f307830302061646472657373206e6f7420616c6c6f77656400000000000000006044820152606401610bba565b600b8360405161276a9190614196565b9081526040519081900360200190205460ff16156127ca5760405162461bcd60e51b815260206004820152601e60248201527f416666696c6961746520636f646520616c7265616479206578697374732100006044820152606401610bba565b606482111580156127db5750600082115b6128275760405162461bcd60e51b815260206004820181905260248201527f50657263656e74616765206d757374206265203e2030202626203c3d203130306044820152606401610bba565b6001600b846040516128399190614196565b908152604080519182900360209081018320805494151560ff199586161790556001600160a01b038816600090815260099091522080549092166001179091558490600a90612889908690614196565b908152604080516020928190038301902080546001600160a01b0319166001600160a01b039485161790559186166000908152600c82529190912084516128d2928601906135ac565b5081600e846040516128e49190614196565b90815260405190819003602001812091909155612902908490614196565b604051908190038120906001600160a01b038616907ff30f92c3d1eddb3772622c3b7d6a3985a8de818f7eebd5cef6650ee86d5ddbce90600090a35060019392505050565b604051636eb1769f60e11b81526001600160a01b038381166004830152306024830152600091839182169063dd62ed3e90604401602060405180830381865afa158015612998573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129bc9190614166565b949350505050565b6000546001600160a01b031633146129ee5760405162461bcd60e51b8152600401610bba90613d29565b6001600160a01b03811615801590612a1457506000546001600160a01b03828116911614155b612a1d57600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000612a838361230e565b15612aca5760405162461bcd60e51b8152602060048201526017602482015276151bdad95b881a5cc8185b1c9958591e481b1a5cdd1959604a1b6044820152606401610bba565b612ad382612d8c565b91506000612ae084610c40565b905080341015612b3c5760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f7567682066756e64732073656e7420666f72206c697374696e6044820152606760f81b6064820152608401610bba565b6001600160a01b0384166000908152600660205260409020805460ff19166001179055612b68816131f8565b612b728184613242565b5060019392505050565b600080546001600160a01b03163314612ba75760405162461bcd60e51b8152600401610bba90613d29565b612bb082610c9e565b1515600103612c015760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6001600160a01b038216600081815260056020526040808220805460ff19166001179055517fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb0095159190a2506001919050565b6000612c5d33610c9e565b1515600103612cae5760405162461bcd60e51b815260206004820152601f60248201527f497320616c7265616479207072656d69756d4d656d626572206d656d626572006044820152606401610bba565b6000612cba3385610d6a565b905080341015612cc98261341d565b612cd23461341d565b604051602001612ce39291906141b2565b60405160208183030381529060405290612d105760405162461bcd60e51b8152600401610bba9190613a52565b50612d1e8562015180613d87565b612d289042613f74565b33600090815260046020526040902055612d4183612d8c565b9250612d4c816131f8565b612d568184613242565b60405133907fc6b9fca7b2e1cbd5b69b197ea298ab7dc0c58d469fc42acebdd4d38acb00951590600090a2506001949350505050565b336000908152600d602052604090208054606091612e4d91612dad90613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd990613ff0565b8015612e265780601f10612dfb57610100808354040283529160200191612e26565b820191906000526020600020905b815481529060010190602001808311612e0957829003601f168201915b5050505050604051806040016040528060048152602001631d9bda5960e21b815250613549565b80612e95575060096000600a84604051612e679190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff16155b15612ef45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d909152929092209051612ed292906135ac565b50506040805180820190915260048152631d9bda5960e21b6020820152919050565b612f0d8260405180602001604052806000815250613549565b158015612fc75750336000908152600d602052604090208054612fc79190612f3490613ff0565b80601f0160208091040260200160405190810160405280929190818152602001828054612f6090613ff0565b8015612fad5780601f10612f8257610100808354040283529160200191612fad565b820191906000526020600020905b815481529060010190602001808311612f9057829003601f168201915b505050505060405180602001604052806000815250613549565b8015612ff25750600b82604051612fde9190614196565b9081526040519081900360200190205460ff165b1561307157336001600160a01b0316600a836040516130119190614196565b908152604051908190036020019020546001600160a01b03160361304f5750506040805180820190915260048152631d9bda5960e21b602082015290565b336000908152600d60209081526040909120835161306f928501906135ac565b505b61308a8260405180602001604052806000815250613549565b80156130b25750336000908152600d6020526040902080546130b09190612f3490613ff0565b155b1561315257336000908152600d6020526040902080546130d190613ff0565b80601f01602080910402602001604051908101604052809291908181526020018280546130fd90613ff0565b801561314a5780601f1061311f5761010080835404028352916020019161314a565b820191906000526020600020905b81548152906001019060200180831161312d57829003601f168201915b505050505091505b61316b8260405180602001604052806000815250613549565b806131965750600b826040516131819190614196565b9081526040519081900360200190205460ff16155b156131f45760408051808201825260048152631d9bda5960e21b6020808301918252336000908152600d9091529290922090516131d392906135ac565b50604051806040016040528060048152602001631d9bda5960e21b81525091505b5090565b8034111561323f57600061320c823461417f565b604051909150339082156108fc029083906000818181858888f1935050505015801561323c573d6000803e3d6000fd5b50505b50565b61326881604051806040016040528060048152602001631d9bda5960e21b815250613549565b1580156132b1575060096000600a836040516132849190614196565b9081526040805160209281900383019020546001600160a01b0316835290820192909252016000205460ff165b156133e45760006064600e836040516132ca9190614196565b908152602001604051809103902054846132e49190613d87565b6132ee9190613da6565b6000549091506001600160a01b03166108fc61330a838661417f565b6040518115909202916000818181858888f19350505050158015613332573d6000803e3d6000fd5b50600a826040516133439190614196565b908152604051908190036020018120546001600160a01b03169082156108fc029083906000818181858888f19350505050158015613385573d6000803e3d6000fd5b50600a826040516133969190614196565b90815260405160209181900382018120548382526001600160a01b0316917f885e6f6235626292940f78c947a331f4c7c1d7f50a48b38092cf546bc9c7907a910160405180910390a2505050565b600080546040516001600160a01b039091169184156108fc02918591818181858888f1935050505015801561323c573d6000803e3d6000fd5b6060816000036134445750506040805180820190915260018152600360fc1b602082015290565b8160005b811561346e578061345881613f5b565b91506134679050600a83613da6565b9150613448565b60008167ffffffffffffffff8111156134895761348961363c565b6040519080825280601f01601f1916602001820160405280156134b3576020820181803683370190505b509050815b8515613540576134c960018261417f565b905060006134d8600a88613da6565b6134e390600a613d87565b6134ed908861417f565b6134f890603061422c565b905060008160f81b90508084848151811061351557613515613f45565b60200101906001600160f81b031916908160001a905350613537600a89613da6565b975050506134b8565b50949350505050565b6000808360405160200161355d9190614196565b6040516020818303038152906040528051906020012090506000836040516020016135889190614196565b60408051601f19818403018152919052805160209091012091909114949350505050565b8280546135b890613ff0565b90600052602060002090601f0160209004810192826135da5760008555613620565b82601f106135f357805160ff1916838001178555613620565b82800160010185558215613620579182015b82811115613620578251825591602001919060010190613605565b506131f49291505b808211156131f45760008155600101613628565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561367b5761367b61363c565b604052919050565b600082601f83011261369457600080fd5b813567ffffffffffffffff8111156136ae576136ae61363c565b6136c1601f8201601f1916602001613652565b8181528460208386010111156136d657600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561370557600080fd5b813567ffffffffffffffff81111561371c57600080fd5b6129bc84828501613683565b80356001600160a01b0381168114610c3b57600080fd5b60006020828403121561375157600080fd5b61226282613728565b6000806040838503121561376d57600080fd5b61377683613728565b946020939093013593505050565b60006020828403121561379657600080fd5b5035919050565b600067ffffffffffffffff8211156137b7576137b761363c565b5060051b60200190565b600082601f8301126137d257600080fd5b813560206137e76137e28361379d565b613652565b82815260059290921b8401810191818101908684111561380657600080fd5b8286015b848110156138285761381b81613728565b835291830191830161380a565b509695505050505050565b600082601f83011261384457600080fd5b813560206138546137e28361379d565b82815260059290921b8401810191818101908684111561387357600080fd5b8286015b848110156138285780358352918301918301613877565b801515811461323f57600080fd5b8035610c3b8161388e565b60008060008060008060c087890312156138c057600080fd5b6138c987613728565b9550602087013567ffffffffffffffff808211156138e657600080fd5b6138f28a838b016137c1565b9650604089013591508082111561390857600080fd5b6139148a838b01613833565b9550606089013591508082111561392a57600080fd5b6139368a838b01613833565b945061394460808a0161389c565b935060a089013591508082111561395a57600080fd5b5061396789828a01613683565b9150509295509295509295565b600080600080600060a0868803121561398c57600080fd5b61399586613728565b9450602086013567ffffffffffffffff808211156139b257600080fd5b6139be89838a016137c1565b955060408801359150808211156139d457600080fd5b6139e089838a01613833565b9450606088013591506139f28261388e565b90925060808701359080821115613a0857600080fd5b50613a1588828901613683565b9150509295509295909350565b60005b83811015613a3d578181015183820152602001613a25565b83811115613a4c576000848401525b50505050565b6020815260008251806020840152613a71816040850160208701613a22565b601f01601f19169190910160400192915050565b600080600080600080600060e0888a031215613aa057600080fd5b613aa988613728565b9650602088013567ffffffffffffffff80821115613ac657600080fd5b613ad28b838c016137c1565b975060408a0135915080821115613ae857600080fd5b613af48b838c01613833565b965060608a0135955060808a01359150613b0d8261388e565b90935060a089013590613b1f8261388e565b90925060c08901359080821115613b3557600080fd5b50613b428a828b01613683565b91505092959891949750929550565b60008060008060808587031215613b6757600080fd5b843567ffffffffffffffff80821115613b7f57600080fd5b613b8b888389016137c1565b95506020870135915080821115613ba157600080fd5b613bad88838901613833565b9450604087013593506060870135915080821115613bca57600080fd5b50613bd787828801613683565b91505092959194509250565b60008060008060808587031215613bf957600080fd5b5050823594602084013594506040840135936060013592509050565b600080600060608486031215613c2a57600080fd5b613c3384613728565b9250613c4160208501613728565b9150604084013590509250925092565b600080600060608486031215613c6657600080fd5b613c6f84613728565b9250602084013567ffffffffffffffff811115613c8b57600080fd5b613c9786828701613683565b925050604084013590509250925092565b60008060408385031215613cbb57600080fd5b613cc483613728565b9150613cd260208401613728565b90509250929050565b60008060408385031215613cee57600080fd5b613cf783613728565b9150602083013567ffffffffffffffff811115613d1357600080fd5b613d1f85828601613683565b9150509250929050565b60208082526028908201527f46756e6374696f6e207265737472696374656420746f206f776e6572206f662060408201526718dbdb9d1c9858dd60c21b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613da157613da1613d71565b500290565b600082613dc357634e487b7160e01b600052601260045260246000fd5b500490565b60208082526047908201527f546f74616c206e756d626572206f6620726563697069656e747320616e64207460408201527f6f74616c206e756d626572206f66204e46542049447320617265206e6f74207460608201526668652073616d6560c81b608082015260a00190565b60208082526027908201527f4e6f7420656e6f7567682066756e64732073656e742077697468207472616e73604082015266616374696f6e2160c81b606082015260800190565b600081518084526020808501945080840160005b83811015613eb55781516001600160a01b031687529582019590820190600101613e90565b509495945050505050565b600081518084526020808501945080840160005b83811015613eb557815187529582019590820190600101613ed4565b6001600160a01b0385168152608060208201819052600090613f1490830186613e7c565b8281036040840152613f268186613ec0565b90508281036060840152613f3a8185613ec0565b979650505050505050565b634e487b7160e01b600052603260045260246000fd5b600060018201613f6d57613f6d613d71565b5060010190565b60008219821115613f8757613f87613d71565b500190565b6001600160a01b0384168152606060208201819052600090613fb090830185613e7c565b8281036040840152613fc28185613ec0565b9695505050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600181811c9082168061400457607f821691505b602082108103610dbf57634e487b7160e01b600052602260045260246000fd5b8054600090600181811c908083168061403e57607f831692505b6020808410820361405f57634e487b7160e01b600052602260045260246000fd5b8180156140735760018114614084576140b0565b60ff198616895284890196506140b0565b876000528160002060005b868110156140a85781548b82015290850190830161408f565b505084890196505b50505050505092915050565b60006122628284614024565b60208082526033908201527f546f74616c206e756d626572206f6620726563697069656e747320616e642076604082015272185b1d595cc8185c99481b9bdd08195c5d585b606a1b606082015260800190565b60408152600061412e6040830185613e7c565b82810360208401526141408185613ec0565b95945050505050565b60006020828403121561415b57600080fd5b81516122628161388e565b60006020828403121561417857600080fd5b5051919050565b60008282101561419157614191613d71565b500390565b600082516141a8818460208701613a22565b9190910192915050565b750383932b6b4bab6a6b2b6b132b9103332b29034b99d160551b8152600083516141e3816016850160208801613a22565b7f2e204e6f7420656e6f7567682066756e64732073656e742e2000000000000000601691840191820152835161422081602f840160208801613a22565b01602f01949350505050565b600060ff821660ff84168060ff0382111561424957614249613d71565b01939250505056fea264697066735822122060411a68509cf85fa8948f9f7b1a66adc6c56160a38c8d3ac5a7c95cade1a48164736f6c634300080d0033

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://60411a68509cf85fa8948f9f7b1a66adc6c56160a38c8d3ac5a7c95cade1a481
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.