ETH Price: $2,843.39 (+3.57%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buy New Level114104002020-12-08 6:07:251521 days ago1607407645IN
0x88596E70...293041542
0.8 ETH0.0034867433
Buy New Level114103972020-12-08 6:06:501521 days ago1607407610IN
0x88596E70...293041542
0.4 ETH0.006663435
Buy New Level114103942020-12-08 6:06:301521 days ago1607407590IN
0x88596E70...293041542
0.2 ETH0.0040150438
Registration Ext114103892020-12-08 6:05:221521 days ago1607407522IN
0x88596E70...293041542
0.1 ETH0.0112624241.80000023
Buy New Level114103162020-12-08 5:48:431521 days ago1607406523IN
0x88596E70...293041542
0.8 ETH0.007593441
Buy New Level114103012020-12-08 5:45:071521 days ago1607406307IN
0x88596E70...293041542
0.4 ETH0.006447835
Buy New Level114102952020-12-08 5:43:461521 days ago1607406226IN
0x88596E70...293041542
0.2 ETH0.0064821735
Registration Ext114102862020-12-08 5:40:361521 days ago1607406036IN
0x88596E70...293041542
0.1 ETH0.0074493435.35
Buy New Level113717392020-12-02 7:38:261526 days ago1606894706IN
0x88596E70...293041542
0.8 ETH0.0041359824.3
Buy New Level113717282020-12-02 7:36:231526 days ago1606894583IN
0x88596E70...293041542
0.4 ETH0.0044213524
Buy New Level113717162020-12-02 7:33:561526 days ago1606894436IN
0x88596E70...293041542
0.2 ETH0.0040849224
Registration Ext113717092020-12-02 7:32:431526 days ago1606894363IN
0x88596E70...293041542
0.1 ETH0.0058708324
Buy New Level113595732020-11-30 10:19:091528 days ago1606731549IN
0x88596E70...293041542
0.4 ETH0.0048408742
Buy New Level113593582020-11-30 9:36:381528 days ago1606728998IN
0x88596E70...293041542
0.4 ETH0.0076362346
Registration Ext113514272020-11-29 4:23:491530 days ago1606623829IN
0x88596E70...293041542
0.1 ETH0.0033750313.00000145
Registration Ext113466852020-11-28 11:17:291530 days ago1606562249IN
0x88596E70...293041542
0.1 ETH0.0050239316
Registration Ext113407362020-11-27 13:10:521531 days ago1606482652IN
0x88596E70...293041542
0.1 ETH0.0064407324.8
Buy New Level113346722020-11-26 14:54:481532 days ago1606402488IN
0x88596E70...293041542
0.8 ETH0.0126478965
Buy New Level113346202020-11-26 14:43:401532 days ago1606401820IN
0x88596E70...293041542
0.4 ETH0.0141270183
Buy New Level113339382020-11-26 12:13:491532 days ago1606392829IN
0x88596E70...293041542
0.2 ETH0.0172692488.75
Registration Ext113339302020-11-26 12:11:381532 days ago1606392698IN
0x88596E70...293041542
0.1 ETH0.0251745192
Buy New Level113321722020-11-26 5:37:391533 days ago1606369059IN
0x88596E70...293041542
0.4 ETH0.03059911146
Buy New Level113321652020-11-26 5:36:531533 days ago1606369013IN
0x88596E70...293041542
0.2 ETH0.0169254891.87500006
Registration Ext113321282020-11-26 5:26:261533 days ago1606368386IN
0x88596E70...293041542
0.1 ETH0.012831971
Buy New Level113195752020-11-24 7:09:411534 days ago1606201781IN
0x88596E70...293041542
1.6 ETH0.0201199696.00000145
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
114104002020-12-08 6:07:251521 days ago1607407645
0x88596E70...293041542
0.24 ETH
114104002020-12-08 6:07:251521 days ago1607407645
0x88596E70...293041542
0.16 ETH
114104002020-12-08 6:07:251521 days ago1607407645
0x88596E70...293041542
0.4 ETH
114103972020-12-08 6:06:501521 days ago1607407610
0x88596E70...293041542
0.12 ETH
114103972020-12-08 6:06:501521 days ago1607407610
0x88596E70...293041542
0.08 ETH
114103972020-12-08 6:06:501521 days ago1607407610
0x88596E70...293041542
0.2 ETH
114103942020-12-08 6:06:301521 days ago1607407590
0x88596E70...293041542
0.06 ETH
114103942020-12-08 6:06:301521 days ago1607407590
0x88596E70...293041542
0.04 ETH
114103942020-12-08 6:06:301521 days ago1607407590
0x88596E70...293041542
0.1 ETH
114103892020-12-08 6:05:221521 days ago1607407522
0x88596E70...293041542
0.05 ETH
114103892020-12-08 6:05:221521 days ago1607407522
0x88596E70...293041542
0.03 ETH
114103892020-12-08 6:05:221521 days ago1607407522
0x88596E70...293041542
0.02 ETH
114103162020-12-08 5:48:431521 days ago1607406523
0x88596E70...293041542
0.24 ETH
114103162020-12-08 5:48:431521 days ago1607406523
0x88596E70...293041542
0.16 ETH
114103162020-12-08 5:48:431521 days ago1607406523
0x88596E70...293041542
0.4 ETH
114103012020-12-08 5:45:071521 days ago1607406307
0x88596E70...293041542
0.2 ETH
114103012020-12-08 5:45:071521 days ago1607406307
0x88596E70...293041542
0.12 ETH
114103012020-12-08 5:45:071521 days ago1607406307
0x88596E70...293041542
0.08 ETH
114102952020-12-08 5:43:461521 days ago1607406226
0x88596E70...293041542
0.06 ETH
114102952020-12-08 5:43:461521 days ago1607406226
0x88596E70...293041542
0.04 ETH
114102952020-12-08 5:43:461521 days ago1607406226
0x88596E70...293041542
0.1 ETH
114102862020-12-08 5:40:361521 days ago1607406036
0x88596E70...293041542
0.03 ETH
114102862020-12-08 5:40:361521 days ago1607406036
0x88596E70...293041542
0.02 ETH
114102862020-12-08 5:40:361521 days ago1607406036
0x88596E70...293041542
0.05 ETH
113717392020-12-02 7:38:261526 days ago1606894706
0x88596E70...293041542
0.24 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ETPlanV3

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-10-20
*/

pragma solidity >=0.4.23 <0.6.0;

/**
* eplans.vip
**/
contract ETPlanV3 {

    struct User {
        uint id;
        address referrer;
        uint partnersCount;

        mapping(uint8 => bool) activeQ8Levels;
        mapping(uint8 => bool) blocked;
        mapping(uint8 => uint) income;
    }

    struct Q8 {
        address currentReferrer;
        address[] firstLevelReferrals;
        address[] secondLevelReferrals;
        uint reinvestCount;
    }

    uint8 public constant LAST_LEVEL = 12;

    uint public lastUserId = 2;
    address public owner;
    address public pool;
    address public manager;
    address public eTPlanToken;

    mapping(uint8 => uint) public levelPrice;
    mapping(uint8 => Q8) public q8Matrix;
    mapping(address => User) public users;
    mapping(uint => address) public idToAddress;

    event NewUserPlace(address indexed user, address indexed referrer, uint8 level, uint8 place);
    event Registration(address indexed user, address indexed referrer, uint indexed userId, uint referrerId);
    event MissedEthReceive(address indexed receiver, address indexed from, uint8 level);
    event SentExtraEthDividends(address indexed from, address indexed receiver, uint8 level);
    event NewRound(address indexed user, address indexed referrer, uint8 level);

    address public super;

    address public _this;

    modifier OnlySuper {
        require(msg.sender == super);
        _;
    }

    constructor() public {
        levelPrice[1] = 0.1 ether;
        for (uint8 i = 2; i <= LAST_LEVEL; i++) {
            levelPrice[i] = levelPrice[i - 1] * 2;
        }
        _this = address(this);
        super = msg.sender;
    }

    function initQ8(address _etplan) OnlySuper external {
        ETPlanV2 etplan = ETPlanV2(address(uint160(_etplan)));
        owner = etplan.owner();
        manager = etplan.manager();
        pool = etplan.pool();
        eTPlanToken = etplan.eTPlanToken();

        for (uint8 j = 1; j <= 12; j++) {
            (address currentReferrer, address[] memory firstLevelReferrals
            , address[] memory secondLevelReferrals,
            uint reinvestCount) = etplan.getq8Matrix(j);
            q8Matrix[j].currentReferrer = currentReferrer;
            q8Matrix[j].firstLevelReferrals = firstLevelReferrals;
            q8Matrix[j].secondLevelReferrals = secondLevelReferrals;
            q8Matrix[j].reinvestCount = reinvestCount;
        }
    }

    function initData(address _etplan, uint start, uint end) OnlySuper external {

        ETPlanV2 etplan = ETPlanV2(address(uint160(_etplan)));

        lastUserId = end + 1;

        for (uint i = start; i <= end; i++) {
            address currentUser = etplan.idToAddress(i);
            (uint id,address referrer,uint partnersCount) = etplan.users(currentUser);
            User memory user = User({
                id : id,
                referrer : referrer,
                partnersCount : partnersCount
                });
            users[currentUser] = user;

            for (uint8 j = 1; j <= 12; j++) {
                if (i == 3) {
                    users[currentUser].blocked[j] = true;
                    users[currentUser].activeQ8Levels[j] = false;
                } else {
                    bool active = etplan.activeQ8Levels(currentUser, j);
                    users[currentUser].activeQ8Levels[j] = active;
                    users[currentUser].income[j] = etplan.income(currentUser, j);
                }
            }

            idToAddress[i] = currentUser;
        }
    }

    function() external payable {
        if (msg.data.length == 0) {
            return registration(msg.sender, owner);
        }

        registration(msg.sender, bytesToAddress(msg.data));
    }

    function registrationExt(address referrerAddress) external payable {
        registration(msg.sender, referrerAddress);
    }

    function registration(address userAddress, address referrerAddress) private {
        require(msg.value == 0.1 ether, "registration cost 0.1");
        require(!isUserExists(userAddress), "user exists");
        require(isUserExists(referrerAddress), "referrer not exists");

        uint32 size;
        assembly {
            size := extcodesize(userAddress)
        }
        require(size == 0, "cannot be a contract");

        User memory user = User({
            id : lastUserId,
            referrer : referrerAddress,
            partnersCount : 0
            });

        users[userAddress] = user;
        idToAddress[lastUserId] = userAddress;

        users[userAddress].activeQ8Levels[1] = true;

        lastUserId++;

        users[referrerAddress].partnersCount++;

        emit Registration(userAddress, referrerAddress, users[userAddress].id, users[referrerAddress].id);

        updateQ8Referrer(userAddress, referrerAddress, uint8(1));
        if (ETPlanToken(eTPlanToken).balanceOf(_this) >= (levelPrice[uint8(1)] * 3 / 2)) {
            ETPlanToken(eTPlanToken).transfer(userAddress, levelPrice[uint8(1)]);
            ETPlanToken(eTPlanToken).transfer(referrerAddress, levelPrice[uint8(1)] / 2);
        }

    }

    function buyNewLevel(uint8 level) external payable {
        require(isUserExists(msg.sender), "user is not exists. Register first.");
        require(msg.value == levelPrice[level], "invalid price");
        require(level > 1 && level <= LAST_LEVEL, "invalid level");
        require(!users[msg.sender].activeQ8Levels[level], "level already activated");

        if (users[msg.sender].blocked[level - 1]) {
            users[msg.sender].blocked[level - 1] = false;
        }
        users[msg.sender].activeQ8Levels[level] = true;
        address freeReferrer = findFreeQ8Referrer(msg.sender, level);
        updateQ8Referrer(msg.sender, freeReferrer, level);
        emit NewRound(msg.sender, freeReferrer, level);
        if (ETPlanToken(eTPlanToken).balanceOf(_this) >= (levelPrice[level] * 3 / 2)) {
            ETPlanToken(eTPlanToken).transfer(msg.sender, levelPrice[level]);
            ETPlanToken(eTPlanToken).transfer(freeReferrer, levelPrice[level] / 2);
        }
    }

    function updateQ8Referrer(address userAddress, address referrerAddress, uint8 level) private {
        require(users[referrerAddress].activeQ8Levels[level], "500. Referrer level is inactive");

        if ((users[referrerAddress].income[level] / (levelPrice[level] / 2)) >= 6) {
            if (!users[referrerAddress].activeQ8Levels[level + 1] && level != LAST_LEVEL) {
                users[referrerAddress].blocked[level] = true;
            }
        }
        if (q8Matrix[level].firstLevelReferrals.length < 2) {
            q8Matrix[level].firstLevelReferrals.push(userAddress);
            emit NewUserPlace(userAddress, referrerAddress, level, uint8(q8Matrix[level].firstLevelReferrals.length));

            q8Matrix[level].currentReferrer = referrerAddress;
            if (referrerAddress == owner) {
                users[owner].income[level] += levelPrice[level];
                return sendETHDividends(referrerAddress, userAddress, level, levelPrice[level]);
            }

            uint poolAmount = levelPrice[level] * 20 / 100;
            if (!address(uint160(pool)).send(poolAmount)) {
                return address(uint160(pool)).transfer(address(this).balance);
            }
            uint managerAmount = levelPrice[level] * 30 / 100;
            if (!address(uint160(manager)).send(managerAmount)) {
                return address(uint160(manager)).transfer(address(this).balance);
            }
            address freeReferrer = findFreeQ8Referrer(userAddress, level);
            users[freeReferrer].income[level] += levelPrice[level] / 2;
            return sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2);
        }
        q8Matrix[level].secondLevelReferrals.push(userAddress);
        q8Matrix[level].currentReferrer = referrerAddress;
        emit NewUserPlace(userAddress, referrerAddress, level, uint8(q8Matrix[level].secondLevelReferrals.length + 2));

        if (q8Matrix[level].secondLevelReferrals.length == 1) {
            address freeReferrer = findFreeQ8Referrer(userAddress, level);
            users[freeReferrer].income[level] += levelPrice[level] / 2;
            sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2);
            uint poolAmount = levelPrice[level] * 20 / 100;
            if (!address(uint160(pool)).send(poolAmount)) {
                return address(uint160(pool)).transfer(address(this).balance);
            }
            address freeReferrerRe = findFreeQ8Referrer(freeReferrer, level);
            users[freeReferrerRe].income[level] += levelPrice[level] * 30 / 100;
            return sendETHDividends(freeReferrerRe, userAddress, level, levelPrice[level] * 30 / 100);
        }

        if (q8Matrix[level].secondLevelReferrals.length == 4) {//reinvest
            q8Matrix[level].reinvestCount++;

            q8Matrix[level].firstLevelReferrals = new address[](0);
            q8Matrix[level].secondLevelReferrals = new address[](0);
        }
        address freeReferrer = findFreeQ8Referrer(userAddress, level);
        users[freeReferrer].income[level] += levelPrice[level] / 2;
        sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2);
        uint poolAmount = levelPrice[level] * 20 / 100;
        if (!address(uint160(pool)).send(poolAmount)) {
            return address(uint160(pool)).transfer(address(this).balance);
        }
        uint managerAmount = levelPrice[level] * 30 / 100;
        if (!address(uint160(manager)).send(managerAmount)) {
            return address(uint160(manager)).transfer(address(this).balance);
        }
    }

    function findFreeQ8Referrer(address userAddress, uint8 level) public view returns (address) {
        while (true) {
            if (users[users[userAddress].referrer].activeQ8Levels[level]) {
                return users[userAddress].referrer;
            }

            userAddress = users[userAddress].referrer;
        }
    }

    function findEthReceiver(address userAddress, address _from, uint8 level) private returns (address, bool) {
        address receiver = userAddress;
        bool isExtraDividends;
        while (true) {
            if (users[receiver].blocked[level]) {
                emit MissedEthReceive(receiver, _from, level);
                isExtraDividends = true;
                receiver = users[receiver].referrer;
            } else {
                return (receiver, isExtraDividends);
            }
        }
    }

    function sendETHDividends(address userAddress, address _from, uint8 level, uint amount) private {
        (address receiver, bool isExtraDividends) = findEthReceiver(userAddress, _from, level);

        if (!address(uint160(receiver)).send(amount)) {
            return address(uint160(receiver)).transfer(address(this).balance);
        }

        if (isExtraDividends) {
            emit SentExtraEthDividends(_from, receiver, level);
        }
    }

    function isUserExists(address user) public view returns (bool) {
        return (users[user].id != 0);
    }

    function bytesToAddress(bytes memory bys) private pure returns (address addr) {
        assembly {
            addr := mload(add(bys, 20))
        }
    }

    function activeQ8Levels(address _user, uint8 level) public view returns (bool){
        return users[_user].activeQ8Levels[level];
    }

    function blocked(address _user, uint8 level) public view returns (bool){
        return users[_user].blocked[level];
    }

    function income(address _user, uint8 level) public view returns (uint){
        return users[_user].income[level];
    }

    function getUserInfo(address _user, uint8 level) public view returns (bool, bool, uint){
        return (users[_user].activeQ8Levels[level]
        , users[_user].blocked[level]
        , users[_user].income[level]);
    }

    function getq8Matrix(uint8 level) public view returns (address, address[] memory, address[] memory, uint){
        return (q8Matrix[level].currentReferrer,
        q8Matrix[level].firstLevelReferrals,
        q8Matrix[level].secondLevelReferrals,
        q8Matrix[level].reinvestCount);
    }

    function updatePool(address _pool) public OnlySuper {
        pool = _pool;
    }

    function updateManager(address _manager) public OnlySuper {
        manager = _manager;
    }

    function updateSuper(address _super) public OnlySuper {
        super = _super;
    }

    function update(address _user, uint8 _level) public OnlySuper {
        require(isUserExists(_user), "user not exists");
        users[_user].activeQ8Levels[_level] = !users[_user].activeQ8Levels[_level];
    }

    function updateBlocked(address _user, uint8 _level) public OnlySuper {
        require(isUserExists(_user), "user not exists");
        users[_user].blocked[_level] = !users[_user].blocked[_level];
    }

    function withdrawELS(address _user, uint _value) public OnlySuper {
        ETPlanToken(eTPlanToken).transfer(_user, _value);
    }
}


contract ETPlanV2 {

    struct User {
        uint id;
        address referrer;
        uint partnersCount;

        mapping(uint8 => bool) activeQ8Levels;
        mapping(uint8 => bool) blocked;
        mapping(uint8 => uint) income;
    }

    struct Q8 {
        address currentReferrer;
        address[] firstLevelReferrals;
        address[] secondLevelReferrals;
        uint reinvestCount;
    }

    uint8 public constant LAST_LEVEL = 12;

    uint public lastUserId = 2;
    address public owner;
    address public pool;
    address public manager;
    address public eTPlanToken;

    mapping(uint8 => uint) public levelPrice;
    mapping(uint8 => Q8) public q8Matrix;
    mapping(address => User) public users;
    mapping(uint => address) public idToAddress;

    event NewUserPlace(address indexed user, address indexed referrer, uint8 level, uint8 place);
    event Registration(address indexed user, address indexed referrer, uint indexed userId, uint referrerId);
    event MissedEthReceive(address indexed receiver, address indexed from, uint8 level);
    event SentExtraEthDividends(address indexed from, address indexed receiver, uint8 level);
    event NewRound(address indexed user, address indexed referrer, uint8 level);

    address public super;

    address public _this;

    modifier OnlySuper {
        require(msg.sender == super);
        _;
    }

    constructor() public {
        levelPrice[1] = 0.1 ether;
        for (uint8 i = 2; i <= LAST_LEVEL; i++) {
            levelPrice[i] = levelPrice[i - 1] * 2;
        }
        _this = address(this);
        super = msg.sender;
    }

    function initQ8(address _etplan) OnlySuper external {
        ETPlan etplan = ETPlan(address(uint160(_etplan)));
        for (uint8 j = 1; j <= 12; j++) {
            (address currentReferrer, address[] memory firstLevelReferrals
            , address[] memory secondLevelReferrals,
            uint reinvestCount) = etplan.getq8Matrix(j);
            q8Matrix[j].currentReferrer = currentReferrer;
            q8Matrix[j].firstLevelReferrals = firstLevelReferrals;
            q8Matrix[j].secondLevelReferrals = secondLevelReferrals;
            q8Matrix[j].reinvestCount = reinvestCount;
        }
    }

    function initData(address _etplan, uint start, uint end) OnlySuper external {

        ETPlan etplan = ETPlan(address(uint160(_etplan)));
        owner = etplan.owner();
        manager = etplan.manager();
        pool = etplan.pool();
        eTPlanToken = etplan.eTPlanToken();
        lastUserId = end + 1;

        for (uint i = start; i <= end; i++) {
            address currentUser = etplan.idToAddress(i);
            (uint id,address referrer,uint partnersCount) = etplan.users(currentUser);
            User memory user = User({
                id : id,
                referrer : referrer,
                partnersCount : partnersCount
                });
            users[currentUser] = user;

            for (uint8 j = 1; j <= 12; j++) {
                if (i == 3) {
                    users[currentUser].blocked[j] = true;
                    users[currentUser].activeQ8Levels[j] = false;
                } else {
                    bool active = etplan.activeQ8Levels(currentUser, j);
                    users[currentUser].activeQ8Levels[j] = active;
                    users[currentUser].income[j] = etplan.income(currentUser, j);
                }
            }

            idToAddress[i] = currentUser;
        }
    }

    function() external payable {
        if (msg.data.length == 0) {
            return registration(msg.sender, owner);
        }

        registration(msg.sender, bytesToAddress(msg.data));
    }

    function registrationExt(address referrerAddress) external payable {
        registration(msg.sender, referrerAddress);
    }

    function registration(address userAddress, address referrerAddress) private {
        require(msg.value == 0.1 ether, "registration cost 0.1");
        require(!isUserExists(userAddress), "user exists");
        require(isUserExists(referrerAddress), "referrer not exists");

        uint32 size;
        assembly {
            size := extcodesize(userAddress)
        }
        require(size == 0, "cannot be a contract");

        User memory user = User({
            id : lastUserId,
            referrer : referrerAddress,
            partnersCount : 0
            });

        users[userAddress] = user;
        idToAddress[lastUserId] = userAddress;

        users[userAddress].activeQ8Levels[1] = true;

        lastUserId++;

        users[referrerAddress].partnersCount++;

        emit Registration(userAddress, referrerAddress, users[userAddress].id, users[referrerAddress].id);

        updateQ8Referrer(userAddress, referrerAddress, uint8(1));
        if (ETPlanToken(eTPlanToken).balanceOf(_this) >= (levelPrice[uint8(1)] * 3 / 2)) {
            ETPlanToken(eTPlanToken).transfer(userAddress, levelPrice[uint8(1)]);
            ETPlanToken(eTPlanToken).transfer(referrerAddress, levelPrice[uint8(1)] / 2);
        }

    }

    function buyNewLevel(uint8 level) external payable {
        require(isUserExists(msg.sender), "user is not exists. Register first.");
        require(msg.value == levelPrice[level], "invalid price");
        require(level > 1 && level <= LAST_LEVEL, "invalid level");
        require(!users[msg.sender].activeQ8Levels[level], "level already activated");

        if (users[msg.sender].blocked[level - 1]) {
            users[msg.sender].blocked[level - 1] = false;
        }
        users[msg.sender].activeQ8Levels[level] = true;
        address freeReferrer = findFreeQ8Referrer(msg.sender, level);
        updateQ8Referrer(msg.sender, freeReferrer, level);
        emit NewRound(msg.sender, freeReferrer, level);
        if (ETPlanToken(eTPlanToken).balanceOf(_this) >= (levelPrice[level] * 3 / 2)) {
            ETPlanToken(eTPlanToken).transfer(msg.sender, levelPrice[level]);
            ETPlanToken(eTPlanToken).transfer(freeReferrer, levelPrice[level] / 2);
        }
    }

    function updateQ8Referrer(address userAddress, address referrerAddress, uint8 level) private {
        require(users[referrerAddress].activeQ8Levels[level], "500. Referrer level is inactive");

        if ((users[referrerAddress].income[level] % (levelPrice[level] / 2)) >= 6) {
            if (!users[referrerAddress].activeQ8Levels[level + 1] && level != LAST_LEVEL) {
                users[referrerAddress].blocked[level] = true;
            }
        }
        if (q8Matrix[level].firstLevelReferrals.length < 2) {
            q8Matrix[level].firstLevelReferrals.push(userAddress);
            emit NewUserPlace(userAddress, referrerAddress, level, uint8(q8Matrix[level].firstLevelReferrals.length));

            q8Matrix[level].currentReferrer = referrerAddress;
            if (referrerAddress == owner) {
                users[owner].income[level] += levelPrice[level];
                return sendETHDividends(referrerAddress, userAddress, level, levelPrice[level]);
            }

            uint poolAmount = levelPrice[level] * 20 / 100;
            if (!address(uint160(pool)).send(poolAmount)) {
                return address(uint160(pool)).transfer(address(this).balance);
            }
            uint managerAmount = levelPrice[level] * 30 / 100;
            if (!address(uint160(manager)).send(managerAmount)) {
                return address(uint160(manager)).transfer(address(this).balance);
            }
            address freeReferrer = findFreeQ8Referrer(userAddress, level);
            users[freeReferrer].income[level] += levelPrice[level] / 2;
            return sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2);
        }
        q8Matrix[level].secondLevelReferrals.push(userAddress);
        q8Matrix[level].currentReferrer = referrerAddress;
        emit NewUserPlace(userAddress, referrerAddress, level, uint8(q8Matrix[level].secondLevelReferrals.length + 2));

        if (q8Matrix[level].secondLevelReferrals.length == 1) {
            address freeReferrer = findFreeQ8Referrer(userAddress, level);
            users[freeReferrer].income[level] += levelPrice[level] / 2;
            sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2);
            uint poolAmount = levelPrice[level] * 20 / 100;
            if (!address(uint160(pool)).send(poolAmount)) {
                return address(uint160(pool)).transfer(address(this).balance);
            }
            address freeReferrerRe = findFreeQ8Referrer(freeReferrer, level);
            users[freeReferrerRe].income[level] += levelPrice[level] * 30 / 100;
            return sendETHDividends(freeReferrerRe, userAddress, level, levelPrice[level] * 30 / 100);
        }

        if (q8Matrix[level].secondLevelReferrals.length == 4) {//reinvest
            q8Matrix[level].reinvestCount++;

            q8Matrix[level].firstLevelReferrals = new address[](0);
            q8Matrix[level].secondLevelReferrals = new address[](0);
        }
        address freeReferrer = findFreeQ8Referrer(userAddress, level);
        users[freeReferrer].income[level] += levelPrice[level] / 2;
        sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2);
        uint poolAmount = levelPrice[level] * 20 / 100;
        if (!address(uint160(pool)).send(poolAmount)) {
            return address(uint160(pool)).transfer(address(this).balance);
        }
        uint managerAmount = levelPrice[level] * 30 / 100;
        if (!address(uint160(manager)).send(managerAmount)) {
            return address(uint160(manager)).transfer(address(this).balance);
        }
    }

    function findFreeQ8Referrer(address userAddress, uint8 level) public view returns (address) {
        while (true) {
            if (users[users[userAddress].referrer].activeQ8Levels[level]) {
                return users[userAddress].referrer;
            }

            userAddress = users[userAddress].referrer;
        }
    }

    function findEthReceiver(address userAddress, address _from, uint8 level) private returns (address, bool) {
        address receiver = userAddress;
        bool isExtraDividends;
        while (true) {
            if (users[receiver].blocked[level]) {
                emit MissedEthReceive(receiver, _from, level);
                isExtraDividends = true;
                receiver = users[receiver].referrer;
            } else {
                return (receiver, isExtraDividends);
            }
        }
    }

    function sendETHDividends(address userAddress, address _from, uint8 level, uint amount) private {
        (address receiver, bool isExtraDividends) = findEthReceiver(userAddress, _from, level);

        if (!address(uint160(receiver)).send(amount)) {
            return address(uint160(receiver)).transfer(address(this).balance);
        }

        if (isExtraDividends) {
            emit SentExtraEthDividends(_from, receiver, level);
        }
    }

    function isUserExists(address user) public view returns (bool) {
        return (users[user].id != 0);
    }

    function bytesToAddress(bytes memory bys) private pure returns (address addr) {
        assembly {
            addr := mload(add(bys, 20))
        }
    }

    function activeQ8Levels(address _user, uint8 level) public view returns (bool){
        return users[_user].activeQ8Levels[level];
    }

    function blocked(address _user, uint8 level) public view returns (bool){
        return users[_user].blocked[level];
    }

    function income(address _user, uint8 level) public view returns (uint){
        return users[_user].income[level];
    }
    function getq8Matrix(uint8 level) public view returns (address, address[] memory, address[] memory, uint){
        return (q8Matrix[level].currentReferrer,
        q8Matrix[level].firstLevelReferrals,
        q8Matrix[level].secondLevelReferrals,
        q8Matrix[level].reinvestCount);
    }

    function updatePool(address _pool) public OnlySuper {
        pool = _pool;
    }

    function updateManager(address _manager) public OnlySuper {
        manager = _manager;
    }

    function updateSuper(address _super) public OnlySuper {
        super = _super;
    }

    function update(address _user, uint8 _level) public OnlySuper {
        require(isUserExists(_user), "user not exists");
        users[_user].activeQ8Levels[_level] = !users[_user].activeQ8Levels[_level];
    }

    function updateBlocked(address _user, uint8 _level) public OnlySuper {
        require(isUserExists(_user), "user not exists");
        users[_user].blocked[_level] = !users[_user].blocked[_level];
    }

    function withdrawELS(address _user, uint _value) public OnlySuper {
        ETPlanToken(eTPlanToken).transfer(_user, _value);
    }
}


contract ETPlan {

    struct User {
        uint id;
        address referrer;
        uint partnersCount;

        mapping(uint8 => bool) activeQ8Levels;
        mapping(uint8 => bool) blocked;
        mapping(uint8 => uint) income;
    }

    struct Q8 {
        address currentReferrer;
        address[] firstLevelReferrals;
        address[] secondLevelReferrals;
        uint reinvestCount;
    }

    uint8 public constant LAST_LEVEL = 12;

    uint public lastUserId = 2;
    address public owner;
    address public pool;
    address public manager;
    address public eTPlanToken;

    mapping(uint8 => uint) public levelPrice;
    mapping(uint8 => Q8) public q8Matrix;
    mapping(address => User) public users;
    mapping(uint => address) public idToAddress;

    event NewUserPlace(address indexed user, address indexed referrer, uint8 level, uint8 place);
    event Registration(address indexed user, address indexed referrer, uint indexed userId, uint referrerId);
    event MissedEthReceive(address indexed receiver, address indexed from, uint8 level);
    event SentExtraEthDividends(address indexed from, address indexed receiver, uint8 level);
    event NewRound(address indexed user, address indexed referrer, uint8 level);

    address public super;

    address public _this;

    modifier OnlySuper {
        require(msg.sender == super);
        _;
    }

    constructor(address _token) public {
        levelPrice[1] = 0.1 ether;
        for (uint8 i = 2; i <= LAST_LEVEL; i++) {
            levelPrice[i] = levelPrice[i - 1] * 2;
        }
        owner = msg.sender;
        super = msg.sender;
        manager = msg.sender;
        pool = msg.sender;
        eTPlanToken = _token;
        _this = address(this);
    }

    function initEnd(address _endless, uint start, uint end) OnlySuper external {

        Endless endless = Endless(address(uint160(_endless)));
        owner = endless.owner();
        lastUserId = end + 1;

        for (uint i = start; i <= end; i++) {
            address currentUser = endless.userIds(i);
            (uint id,address referrer,uint partnersCount) = endless.users(currentUser);
            User memory user = User({
                id : id,
                referrer : referrer,
                partnersCount : partnersCount
                });
            users[currentUser] = user;

            for (uint8 j = 1; j <= 12; j++) {
                if (i == 3) {
                    users[currentUser].blocked[j] = true;
                    users[currentUser].activeQ8Levels[j] = false;
                } else {
                    bool active = endless.usersActiveX6Levels(currentUser, j);
                    users[currentUser].activeQ8Levels[j] = active;
                }
            }

            idToAddress[i] = currentUser;
        }
    }

    function() external payable {
        if (msg.data.length == 0) {
            return registration(msg.sender, owner);
        }

        registration(msg.sender, bytesToAddress(msg.data));
    }

    function registrationExt(address referrerAddress) external payable {
        registration(msg.sender, referrerAddress);
    }

    function registration(address userAddress, address referrerAddress) private {
        require(msg.value == 0.1 ether, "registration cost 0.1");
        require(!isUserExists(userAddress), "user exists");
        require(isUserExists(referrerAddress), "referrer not exists");

        uint32 size;
        assembly {
            size := extcodesize(userAddress)
        }
        require(size == 0, "cannot be a contract");

        User memory user = User({
            id : lastUserId,
            referrer : referrerAddress,
            partnersCount : 0
            });

        users[userAddress] = user;
        idToAddress[lastUserId] = userAddress;

        users[userAddress].activeQ8Levels[1] = true;

        lastUserId++;

        users[referrerAddress].partnersCount++;

        emit Registration(userAddress, referrerAddress, users[userAddress].id, users[referrerAddress].id);

        updateQ8Referrer(userAddress, referrerAddress, uint8(1));
        if (ETPlanToken(eTPlanToken).balanceOf(_this) > levelPrice[uint8(1)]) {
            ETPlanToken(eTPlanToken).transfer(userAddress, levelPrice[uint8(1)]);
            ETPlanToken(eTPlanToken).transfer(referrerAddress, levelPrice[uint8(1)] / 2);
        }

    }

    function buyNewLevel(uint8 level) external payable {
        require(isUserExists(msg.sender), "user is not exists. Register first.");
        require(msg.value == levelPrice[level], "invalid price");
        require(level > 1 && level <= LAST_LEVEL, "invalid level");
        require(!users[msg.sender].activeQ8Levels[level], "level already activated");

        if (users[msg.sender].blocked[level - 1]) {
            users[msg.sender].blocked[level - 1] = false;
        }
        users[msg.sender].activeQ8Levels[level] = true;
        address freeReferrer = findFreeQ8Referrer(msg.sender, level);
        updateQ8Referrer(msg.sender, freeReferrer, level);
        emit NewRound(msg.sender, freeReferrer, level);
        if (ETPlanToken(eTPlanToken).balanceOf(_this) > levelPrice[level]) {
            ETPlanToken(eTPlanToken).transfer(msg.sender, levelPrice[level]);
            ETPlanToken(eTPlanToken).transfer(freeReferrer, levelPrice[level]/2);
        }
    }

    function updateQ8Referrer(address userAddress, address referrerAddress, uint8 level) private {
        require(users[referrerAddress].activeQ8Levels[level], "500. Referrer level is inactive");

        if ((users[referrerAddress].income[level] % (levelPrice[level] / 2)) >= 6) {
            if (!users[referrerAddress].activeQ8Levels[level + 1] && level != LAST_LEVEL) {
                users[referrerAddress].blocked[level] = true;
            }
        }
        if (q8Matrix[level].firstLevelReferrals.length < 2) {
            q8Matrix[level].firstLevelReferrals.push(userAddress);
            emit NewUserPlace(userAddress, referrerAddress, level, uint8(q8Matrix[level].firstLevelReferrals.length));

            q8Matrix[level].currentReferrer = referrerAddress;
            if (referrerAddress == owner) {
                users[owner].income[level] += levelPrice[level];
                return sendETHDividends(referrerAddress, userAddress, level, levelPrice[level]);
            }

            uint poolAmount = levelPrice[level] * 20 / 100;
            if (!address(uint160(pool)).send(poolAmount)) {
                return address(uint160(pool)).transfer(address(this).balance);
            }
            uint managerAmount = levelPrice[level] * 30 / 100;
            if (!address(uint160(manager)).send(managerAmount)) {
                return address(uint160(manager)).transfer(address(this).balance);
            }
            address freeReferrer = findFreeQ8Referrer(userAddress, level);
            users[freeReferrer].income[level] += levelPrice[level] / 2;
            return sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2);
        }
        q8Matrix[level].secondLevelReferrals.push(userAddress);
        q8Matrix[level].currentReferrer = referrerAddress;
        emit NewUserPlace(userAddress, referrerAddress, level, uint8(q8Matrix[level].secondLevelReferrals.length + 2));

        if (q8Matrix[level].secondLevelReferrals.length == 1) {
            address freeReferrer = findFreeQ8Referrer(userAddress, level);
            users[freeReferrer].income[level] += levelPrice[level] / 2;
            sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2);
            uint poolAmount = levelPrice[level] * 20 / 100;
            if (!address(uint160(pool)).send(poolAmount)) {
                return address(uint160(pool)).transfer(address(this).balance);
            }
            address freeReferrerRe = findFreeQ8Referrer(freeReferrer, level);
            users[freeReferrerRe].income[level] += levelPrice[level] * 30 / 100;
            return sendETHDividends(freeReferrerRe, userAddress, level, levelPrice[level] * 30 / 100);
        }

        if (q8Matrix[level].secondLevelReferrals.length == 4) {//reinvest
            q8Matrix[level].reinvestCount++;

            q8Matrix[level].firstLevelReferrals = new address[](0);
            q8Matrix[level].secondLevelReferrals = new address[](0);
        }
        address freeReferrer = findFreeQ8Referrer(userAddress, level);
        users[freeReferrer].income[level] += levelPrice[level] / 2;
        sendETHDividends(freeReferrer, userAddress, level, levelPrice[level] / 2);
        uint poolAmount = levelPrice[level] * 20 / 100;
        if (!address(uint160(pool)).send(poolAmount)) {
            return address(uint160(pool)).transfer(address(this).balance);
        }
        uint managerAmount = levelPrice[level] * 30 / 100;
        if (!address(uint160(manager)).send(managerAmount)) {
            return address(uint160(manager)).transfer(address(this).balance);
        }
    }

    function findFreeQ8Referrer(address userAddress, uint8 level) public view returns (address) {
        while (true) {
            if (users[users[userAddress].referrer].activeQ8Levels[level]) {
                return users[userAddress].referrer;
            }

            userAddress = users[userAddress].referrer;
        }
    }

    function findEthReceiver(address userAddress, address _from, uint8 level) private returns (address, bool) {
        address receiver = userAddress;
        bool isExtraDividends;
        while (true) {
            if (users[receiver].blocked[level]) {
                emit MissedEthReceive(receiver, _from, level);
                isExtraDividends = true;
                receiver = users[receiver].referrer;
            } else {
                return (receiver, isExtraDividends);
            }
        }
    }

    function sendETHDividends(address userAddress, address _from, uint8 level, uint amount) private {
        (address receiver, bool isExtraDividends) = findEthReceiver(userAddress, _from, level);

        if (!address(uint160(receiver)).send(amount)) {
            return address(uint160(receiver)).transfer(address(this).balance);
        }

        if (isExtraDividends) {
            emit SentExtraEthDividends(_from, receiver, level);
        }
    }

    function isUserExists(address user) public view returns (bool) {
        return (users[user].id != 0);
    }

    function bytesToAddress(bytes memory bys) private pure returns (address addr) {
        assembly {
            addr := mload(add(bys, 20))
        }
    }

    function activeQ8Levels(address _user, uint8 level) public view returns (bool){
        return users[_user].activeQ8Levels[level];
    }

    function blocked(address _user, uint8 level) public view returns (bool){
        return users[_user].blocked[level];
    }

    function income(address _user, uint8 level) public view returns (uint){
        return users[_user].income[level];
    }

    function getq8Matrix(uint8 level) public view returns (address, address[] memory, address[] memory, uint){
        return (q8Matrix[level].currentReferrer,
        q8Matrix[level].firstLevelReferrals,
        q8Matrix[level].secondLevelReferrals,
        q8Matrix[level].reinvestCount);
    }

    function updatePool(address _pool) public OnlySuper {
        pool = _pool;
    }

    function updateManager(address _manager) public OnlySuper {
        manager = _manager;
    }

    function updateSuper(address _super) public OnlySuper {
        super = _super;
    }

    function update(address _user, uint8 _level) public OnlySuper {
        require(isUserExists(_user), "user not exists");
        users[_user].activeQ8Levels[_level] = !users[_user].activeQ8Levels[_level];
    }

    function withdrawELS(address _user, uint _value) public OnlySuper {
        ETPlanToken(eTPlanToken).transfer(_user, _value);
    }
}


contract Endless {

    struct User {
        uint id;
        address referrer;
        uint partnersCount;

        mapping(uint8 => bool) activeX3Levels;
        mapping(uint8 => bool) activeX6Levels;

        mapping(uint8 => X3) x3Matrix;
        mapping(uint8 => X6) x6Matrix;
    }

    struct X3 {
        address currentReferrer;
        address[] referrals;
        bool blocked;
        uint reinvestCount;
    }

    struct X6 {
        address currentReferrer;
        address[] firstLevelReferrals;
        address[] secondLevelReferrals;
        bool blocked;
        uint reinvestCount;

        address closedPart;
    }

    uint8 public constant LAST_LEVEL = 12;

    mapping(address => User) public users;
    mapping(uint => address) public idToAddress;
    mapping(uint => address) public userIds;
    mapping(address => uint) public balances;

    uint public lastUserId = 2;
    address public owner;

    mapping(uint8 => uint) public levelPrice;

    event Registration(address indexed user, address indexed referrer, uint indexed userId, uint referrerId);
    event Reinvest(address indexed user, address indexed currentReferrer, address indexed caller, uint8 matrix, uint8 level);
    event Upgrade(address indexed user, address indexed referrer, uint8 matrix, uint8 level);
    event NewUserPlace(address indexed user, address indexed referrer, uint8 matrix, uint8 level, uint8 place);
    event MissedEthReceive(address indexed receiver, address indexed from, uint8 matrix, uint8 level);
    event SentExtraEthDividends(address indexed from, address indexed receiver, uint8 matrix, uint8 level);


    constructor(address ownerAddress) public {
        levelPrice[1] = 0.025 ether;
        for (uint8 i = 2; i <= LAST_LEVEL; i++) {
            levelPrice[i] = levelPrice[i-1] * 2;
        }
        owner = ownerAddress;

        User memory user = User({
            id: 1,
            referrer: address(0),
            partnersCount: uint(0)
            });

        users[ownerAddress] = user;
        idToAddress[1] = ownerAddress;

        for (uint8 i = 1; i <= LAST_LEVEL; i++) {
            users[ownerAddress].activeX3Levels[i] = true;
            users[ownerAddress].activeX6Levels[i] = true;
        }

        userIds[1] = ownerAddress;
    }

    function() external payable {
        if(msg.data.length == 0) {
            return registration(msg.sender, owner);
        }

        registration(msg.sender, bytesToAddress(msg.data));
    }

    function registrationExt(address referrerAddress) external payable {
        registration(msg.sender, referrerAddress);
    }

    function buyNewLevel(uint8 matrix, uint8 level) external payable {
        require(isUserExists(msg.sender), "user is not exists. Register first.");
        require(matrix == 1 || matrix == 2, "invalid matrix");
        require(msg.value == levelPrice[level], "invalid price");
        require(level > 1 && level <= LAST_LEVEL, "invalid level");

        if (matrix == 1) {
            require(!users[msg.sender].activeX3Levels[level], "level already activated");

            if (users[msg.sender].x3Matrix[level-1].blocked) {
                users[msg.sender].x3Matrix[level-1].blocked = false;
            }

            address freeX3Referrer = findFreeX3Referrer(msg.sender, level);
            users[msg.sender].x3Matrix[level].currentReferrer = freeX3Referrer;
            users[msg.sender].activeX3Levels[level] = true;
            updateX3Referrer(msg.sender, freeX3Referrer, level);

            emit Upgrade(msg.sender, freeX3Referrer, 1, level);

        } else {
            require(!users[msg.sender].activeX6Levels[level], "level already activated");

            if (users[msg.sender].x6Matrix[level-1].blocked) {
                users[msg.sender].x6Matrix[level-1].blocked = false;
            }

            address freeX6Referrer = findFreeX6Referrer(msg.sender, level);

            users[msg.sender].activeX6Levels[level] = true;
            updateX6Referrer(msg.sender, freeX6Referrer, level);

            emit Upgrade(msg.sender, freeX6Referrer, 2, level);
        }
    }

    function registration(address userAddress, address referrerAddress) private {
        require(msg.value == 0.05 ether, "registration cost 0.05");
        require(!isUserExists(userAddress), "user exists");
        require(isUserExists(referrerAddress), "referrer not exists");

        uint32 size;
        assembly {
            size := extcodesize(userAddress)
        }
        require(size == 0, "cannot be a contract");

        User memory user = User({
            id: lastUserId,
            referrer: referrerAddress,
            partnersCount: 0
            });

        users[userAddress] = user;
        idToAddress[lastUserId] = userAddress;

        users[userAddress].referrer = referrerAddress;

        users[userAddress].activeX3Levels[1] = true;
        users[userAddress].activeX6Levels[1] = true;


        userIds[lastUserId] = userAddress;
        lastUserId++;

        users[referrerAddress].partnersCount++;

        address freeX3Referrer = findFreeX3Referrer(userAddress, 1);
        users[userAddress].x3Matrix[1].currentReferrer = freeX3Referrer;
        updateX3Referrer(userAddress, freeX3Referrer, 1);

        updateX6Referrer(userAddress, findFreeX6Referrer(userAddress, 1), 1);

        emit Registration(userAddress, referrerAddress, users[userAddress].id, users[referrerAddress].id);
    }

    function updateX3Referrer(address userAddress, address referrerAddress, uint8 level) private {
        users[referrerAddress].x3Matrix[level].referrals.push(userAddress);

        if (users[referrerAddress].x3Matrix[level].referrals.length < 3) {
            emit NewUserPlace(userAddress, referrerAddress, 1, level, uint8(users[referrerAddress].x3Matrix[level].referrals.length));
            return sendETHDividends(referrerAddress, userAddress, 1, level);
        }

        emit NewUserPlace(userAddress, referrerAddress, 1, level, 3);
        //close matrix
        users[referrerAddress].x3Matrix[level].referrals = new address[](0);
        if (!users[referrerAddress].activeX3Levels[level+1] && level != LAST_LEVEL) {
            users[referrerAddress].x3Matrix[level].blocked = true;
        }

        //create new one by recursion
        if (referrerAddress != owner) {
            //check referrer active level
            address freeReferrerAddress = findFreeX3Referrer(referrerAddress, level);
            if (users[referrerAddress].x3Matrix[level].currentReferrer != freeReferrerAddress) {
                users[referrerAddress].x3Matrix[level].currentReferrer = freeReferrerAddress;
            }

            users[referrerAddress].x3Matrix[level].reinvestCount++;
            emit Reinvest(referrerAddress, freeReferrerAddress, userAddress, 1, level);
            updateX3Referrer(referrerAddress, freeReferrerAddress, level);
        } else {
            sendETHDividends(owner, userAddress, 1, level);
            users[owner].x3Matrix[level].reinvestCount++;
            emit Reinvest(owner, address(0), userAddress, 1, level);
        }
    }

    function updateX6Referrer(address userAddress, address referrerAddress, uint8 level) private {
        require(users[referrerAddress].activeX6Levels[level], "500. Referrer level is inactive");

        if (users[referrerAddress].x6Matrix[level].firstLevelReferrals.length < 2) {
            users[referrerAddress].x6Matrix[level].firstLevelReferrals.push(userAddress);
            emit NewUserPlace(userAddress, referrerAddress, 2, level, uint8(users[referrerAddress].x6Matrix[level].firstLevelReferrals.length));

            //set current level
            users[userAddress].x6Matrix[level].currentReferrer = referrerAddress;

            if (referrerAddress == owner) {
                return sendETHDividends(referrerAddress, userAddress, 2, level);
            }

            address ref = users[referrerAddress].x6Matrix[level].currentReferrer;
            users[ref].x6Matrix[level].secondLevelReferrals.push(userAddress);

            uint len = users[ref].x6Matrix[level].firstLevelReferrals.length;

            if ((len == 2) &&
            (users[ref].x6Matrix[level].firstLevelReferrals[0] == referrerAddress) &&
                (users[ref].x6Matrix[level].firstLevelReferrals[1] == referrerAddress)) {
                if (users[referrerAddress].x6Matrix[level].firstLevelReferrals.length == 1) {
                    emit NewUserPlace(userAddress, ref, 2, level, 5);
                } else {
                    emit NewUserPlace(userAddress, ref, 2, level, 6);
                }
            }  else if ((len == 1 || len == 2) &&
            users[ref].x6Matrix[level].firstLevelReferrals[0] == referrerAddress) {
                if (users[referrerAddress].x6Matrix[level].firstLevelReferrals.length == 1) {
                    emit NewUserPlace(userAddress, ref, 2, level, 3);
                } else {
                    emit NewUserPlace(userAddress, ref, 2, level, 4);
                }
            } else if (len == 2 && users[ref].x6Matrix[level].firstLevelReferrals[1] == referrerAddress) {
                if (users[referrerAddress].x6Matrix[level].firstLevelReferrals.length == 1) {
                    emit NewUserPlace(userAddress, ref, 2, level, 5);
                } else {
                    emit NewUserPlace(userAddress, ref, 2, level, 6);
                }
            }

            return updateX6ReferrerSecondLevel(userAddress, ref, level);
        }

        users[referrerAddress].x6Matrix[level].secondLevelReferrals.push(userAddress);

        if (users[referrerAddress].x6Matrix[level].closedPart != address(0)) {
            if ((users[referrerAddress].x6Matrix[level].firstLevelReferrals[0] ==
            users[referrerAddress].x6Matrix[level].firstLevelReferrals[1]) &&
                (users[referrerAddress].x6Matrix[level].firstLevelReferrals[0] ==
                users[referrerAddress].x6Matrix[level].closedPart)) {

                updateX6(userAddress, referrerAddress, level, true);
                return updateX6ReferrerSecondLevel(userAddress, referrerAddress, level);
            } else if (users[referrerAddress].x6Matrix[level].firstLevelReferrals[0] ==
                users[referrerAddress].x6Matrix[level].closedPart) {
                updateX6(userAddress, referrerAddress, level, true);
                return updateX6ReferrerSecondLevel(userAddress, referrerAddress, level);
            } else {
                updateX6(userAddress, referrerAddress, level, false);
                return updateX6ReferrerSecondLevel(userAddress, referrerAddress, level);
            }
        }

        if (users[referrerAddress].x6Matrix[level].firstLevelReferrals[1] == userAddress) {
            updateX6(userAddress, referrerAddress, level, false);
            return updateX6ReferrerSecondLevel(userAddress, referrerAddress, level);
        } else if (users[referrerAddress].x6Matrix[level].firstLevelReferrals[0] == userAddress) {
            updateX6(userAddress, referrerAddress, level, true);
            return updateX6ReferrerSecondLevel(userAddress, referrerAddress, level);
        }

        if (users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[0]].x6Matrix[level].firstLevelReferrals.length <=
            users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[1]].x6Matrix[level].firstLevelReferrals.length) {
            updateX6(userAddress, referrerAddress, level, false);
        } else {
            updateX6(userAddress, referrerAddress, level, true);
        }

        updateX6ReferrerSecondLevel(userAddress, referrerAddress, level);
    }

    function updateX6(address userAddress, address referrerAddress, uint8 level, bool x2) private {
        if (!x2) {
            users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[0]].x6Matrix[level].firstLevelReferrals.push(userAddress);
            emit NewUserPlace(userAddress, users[referrerAddress].x6Matrix[level].firstLevelReferrals[0], 2, level, uint8(users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[0]].x6Matrix[level].firstLevelReferrals.length));
            emit NewUserPlace(userAddress, referrerAddress, 2, level, 2 + uint8(users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[0]].x6Matrix[level].firstLevelReferrals.length));
            //set current level
            users[userAddress].x6Matrix[level].currentReferrer = users[referrerAddress].x6Matrix[level].firstLevelReferrals[0];
        } else {
            users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[1]].x6Matrix[level].firstLevelReferrals.push(userAddress);
            emit NewUserPlace(userAddress, users[referrerAddress].x6Matrix[level].firstLevelReferrals[1], 2, level, uint8(users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[1]].x6Matrix[level].firstLevelReferrals.length));
            emit NewUserPlace(userAddress, referrerAddress, 2, level, 4 + uint8(users[users[referrerAddress].x6Matrix[level].firstLevelReferrals[1]].x6Matrix[level].firstLevelReferrals.length));
            //set current level
            users[userAddress].x6Matrix[level].currentReferrer = users[referrerAddress].x6Matrix[level].firstLevelReferrals[1];
        }
    }

    function updateX6ReferrerSecondLevel(address userAddress, address referrerAddress, uint8 level) private {
        if (users[referrerAddress].x6Matrix[level].secondLevelReferrals.length < 4) {
            return sendETHDividends(referrerAddress, userAddress, 2, level);
        }

        address[] memory x6 = users[users[referrerAddress].x6Matrix[level].currentReferrer].x6Matrix[level].firstLevelReferrals;

        if (x6.length == 2) {
            if (x6[0] == referrerAddress ||
            x6[1] == referrerAddress) {
                users[users[referrerAddress].x6Matrix[level].currentReferrer].x6Matrix[level].closedPart = referrerAddress;
            } else if (x6.length == 1) {
                if (x6[0] == referrerAddress) {
                    users[users[referrerAddress].x6Matrix[level].currentReferrer].x6Matrix[level].closedPart = referrerAddress;
                }
            }
        }

        users[referrerAddress].x6Matrix[level].firstLevelReferrals = new address[](0);
        users[referrerAddress].x6Matrix[level].secondLevelReferrals = new address[](0);
        users[referrerAddress].x6Matrix[level].closedPart = address(0);

        if (!users[referrerAddress].activeX6Levels[level+1] && level != LAST_LEVEL) {
            users[referrerAddress].x6Matrix[level].blocked = true;
        }

        users[referrerAddress].x6Matrix[level].reinvestCount++;

        if (referrerAddress != owner) {
            address freeReferrerAddress = findFreeX6Referrer(referrerAddress, level);

            emit Reinvest(referrerAddress, freeReferrerAddress, userAddress, 2, level);
            updateX6Referrer(referrerAddress, freeReferrerAddress, level);
        } else {
            emit Reinvest(owner, address(0), userAddress, 2, level);
            sendETHDividends(owner, userAddress, 2, level);
        }
    }

    function findFreeX3Referrer(address userAddress, uint8 level) public view returns(address) {
        while (true) {
            if (users[users[userAddress].referrer].activeX3Levels[level]) {
                return users[userAddress].referrer;
            }

            userAddress = users[userAddress].referrer;
        }
    }

    function findFreeX6Referrer(address userAddress, uint8 level) public view returns(address) {
        while (true) {
            if (users[users[userAddress].referrer].activeX6Levels[level]) {
                return users[userAddress].referrer;
            }

            userAddress = users[userAddress].referrer;
        }
    }

    function usersActiveX3Levels(address userAddress, uint8 level) public view returns(bool) {
        return users[userAddress].activeX3Levels[level];
    }

    function usersActiveX6Levels(address userAddress, uint8 level) public view returns(bool) {
        return users[userAddress].activeX6Levels[level];
    }

    function usersX3Matrix(address userAddress, uint8 level) public view returns(address, address[] memory, bool ,uint) {
        return (users[userAddress].x3Matrix[level].currentReferrer,
        users[userAddress].x3Matrix[level].referrals,
        users[userAddress].x3Matrix[level].blocked,
        users[userAddress].x3Matrix[level].reinvestCount);
    }

    function usersX6Matrix(address userAddress, uint8 level) public view returns(address, address[] memory, address[] memory, bool, address,uint) {
        return (users[userAddress].x6Matrix[level].currentReferrer,
        users[userAddress].x6Matrix[level].firstLevelReferrals,
        users[userAddress].x6Matrix[level].secondLevelReferrals,
        users[userAddress].x6Matrix[level].blocked,
        users[userAddress].x6Matrix[level].closedPart,
        users[userAddress].x6Matrix[level].reinvestCount);
    }

    function isUserExists(address user) public view returns (bool) {
        return (users[user].id != 0);
    }

    function findEthReceiver(address userAddress, address _from, uint8 matrix, uint8 level) private returns(address, bool) {
        address receiver = userAddress;
        bool isExtraDividends;
        if (matrix == 1) {
            while (true) {
                if (users[receiver].x3Matrix[level].blocked) {
                    emit MissedEthReceive(receiver, _from, 1, level);
                    isExtraDividends = true;
                    receiver = users[receiver].x3Matrix[level].currentReferrer;
                } else {
                    return (receiver, isExtraDividends);
                }
            }
        } else {
            while (true) {
                if (users[receiver].x6Matrix[level].blocked) {
                    emit MissedEthReceive(receiver, _from, 2, level);
                    isExtraDividends = true;
                    receiver = users[receiver].x6Matrix[level].currentReferrer;
                } else {
                    return (receiver, isExtraDividends);
                }
            }
        }
    }

    function sendETHDividends(address userAddress, address _from, uint8 matrix, uint8 level) private {
        (address receiver, bool isExtraDividends) = findEthReceiver(userAddress, _from, matrix, level);

        if (!address(uint160(receiver)).send(levelPrice[level])) {
            return address(uint160(receiver)).transfer(address(this).balance);
        }

        if (isExtraDividends) {
            emit SentExtraEthDividends(_from, receiver, matrix, level);
        }
    }

    function bytesToAddress(bytes memory bys) private pure returns (address addr) {
        assembly {
            addr := mload(add(bys, 20))
        }
    }
}


library SafeMath {
    /**
    * @dev Multiplies two numbers, throws on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin- solidity/pull/522
        if (a == 0) {
            return 0;
        }
        c = a * b;
        assert(c / a == b);
        return c;
    }
    /**
    * @dev Integer division of two numbers, truncating the quotient. 
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b > 0);
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return a / b;
    }
    /**
    * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        assert(b <= a);
        return a - b;
    }
    /**
    * @dev Adds two numbers, throws on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        c = a + b;
        assert(c >= a);
        return c;
    }
}

contract Token {

    /// @return total amount of tokens
    //function totalSupply() public view returns (uint supply);

    /// @param _owner The address from which the balance will be retrieved
    /// @return The balance
    function balanceOf(address _owner) public view returns (uint balance);

    /// @notice send `_value` token to `_to` from `msg.sender`
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transfer(address _to, uint _value) public returns (bool success);

    /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
    /// @param _from The address of the sender
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transferFrom(address _from, address _to, uint _value) public returns (bool success);

    /// @notice `msg.sender` approves `_addr` to spend `_value` tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @param _value The amount of wei to be approved for transfer
    /// @return Whether the approval was successful or not
    function approve(address _spender, uint _value) public returns (bool success);

    /// @param _owner The address of the account owning tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @return Amount of remaining tokens allowed to spent
    function allowance(address _owner, address _spender) public view returns (uint remaining);

    event Transfer(address indexed _from, address indexed _to, uint _value);
    event Approval(address indexed _owner, address indexed _spender, uint _value);
}

contract RegularToken is Token {

    using SafeMath for uint256;

    function transfer(address _to, uint _value) public returns (bool) {
        require(_to != address(0));
        //Default assumes totalSupply can't be over max (2^256 - 1).
        require(balances[msg.sender] >= _value);
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(msg.sender, _to, _value);
        return true;
    }

    function transferFrom(address _from, address _to, uint _value) public returns (bool) {
        require(_to != address(0));
        require(balances[_from] >= _value);
        require(allowed[_from][msg.sender] >= _value);

        balances[_to] = balances[_to].add(_value);
        balances[_from] = balances[_from].sub(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        emit Transfer(_from, _to, _value);
        return true;
    }

    function balanceOf(address _owner) public view returns (uint) {
        return balances[_owner];
    }

    function approve(address _spender, uint _value) public returns (bool) {
        require(_spender != address(0));
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

    function allowance(address _owner, address _spender) public view returns (uint) {
        return allowed[_owner][_spender];
    }

    mapping(address => uint) balances;
    mapping(address => mapping(address => uint)) allowed;
    uint public totalSupply;
}

contract UnboundedRegularToken is RegularToken {

    uint constant MAX_UINT = 2 ** 256 - 1;

    /// @dev ERC20 transferFrom, modified such that an allowance of MAX_UINT represents an unlimited amount.
    /// @param _from Address to transfer from.
    /// @param _to Address to transfer to.
    /// @param _value Amount to transfer.
    /// @return Success of transfer.
    function transferFrom(address _from, address _to, uint _value)
    public
    returns (bool)
    {
        require(_to != address(0));
        uint allowance = allowed[_from][msg.sender];

        require(balances[_from] >= _value);
        require(allowance >= _value);

        balances[_to] = balances[_to].add(_value);
        balances[_from] = balances[_from].sub(_value);
        if (allowance < MAX_UINT) {
            allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        }
        emit Transfer(_from, _to, _value);
        return true;
    }
}

contract ETPlanToken is UnboundedRegularToken {

    uint8 constant public decimals = 18;
    string constant public name = "ETPlanToken";
    string constant public symbol = "ELS";

    constructor() public {
        totalSupply = 33 * 10 ** 25;
        balances[msg.sender] = totalSupply;
        emit Transfer(address(0), msg.sender, totalSupply);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_etplan","type":"address"}],"name":"initQ8","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pool","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LAST_LEVEL","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"idToAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_this","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastUserId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_level","type":"uint8"}],"name":"update","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"manager","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"level","type":"uint8"}],"name":"income","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"user","type":"address"}],"name":"isUserExists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_manager","type":"address"}],"name":"updateManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_value","type":"uint256"}],"name":"withdrawELS","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"referrerAddress","type":"address"}],"name":"registrationExt","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"q8Matrix","outputs":[{"name":"currentReferrer","type":"address"},{"name":"reinvestCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_pool","type":"address"}],"name":"updatePool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"userAddress","type":"address"},{"name":"level","type":"uint8"}],"name":"findFreeQ8Referrer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"level","type":"uint8"}],"name":"buyNewLevel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"level","type":"uint8"}],"name":"activeQ8Levels","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"super","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"users","outputs":[{"name":"id","type":"uint256"},{"name":"referrer","type":"address"},{"name":"partnersCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"level","type":"uint8"}],"name":"getUserInfo","outputs":[{"name":"","type":"bool"},{"name":"","type":"bool"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_super","type":"address"}],"name":"updateSuper","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"eTPlanToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_user","type":"address"},{"name":"_level","type":"uint8"}],"name":"updateBlocked","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"level","type":"uint8"}],"name":"getq8Matrix","outputs":[{"name":"","type":"address"},{"name":"","type":"address[]"},{"name":"","type":"address[]"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_user","type":"address"},{"name":"level","type":"uint8"}],"name":"blocked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"levelPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_etplan","type":"address"},{"name":"start","type":"uint256"},{"name":"end","type":"uint256"}],"name":"initData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":true,"name":"referrer","type":"address"},{"indexed":false,"name":"level","type":"uint8"},{"indexed":false,"name":"place","type":"uint8"}],"name":"NewUserPlace","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":true,"name":"referrer","type":"address"},{"indexed":true,"name":"userId","type":"uint256"},{"indexed":false,"name":"referrerId","type":"uint256"}],"name":"Registration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"receiver","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"level","type":"uint8"}],"name":"MissedEthReceive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"receiver","type":"address"},{"indexed":false,"name":"level","type":"uint8"}],"name":"SentExtraEthDividends","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"},{"indexed":true,"name":"referrer","type":"address"},{"indexed":false,"name":"level","type":"uint8"}],"name":"NewRound","type":"event"}]

608060405260026000553480156200001657600080fd5b5067016345785d8a000060056000600160ff168152602001908152602001600020819055506000600290505b600c60ff168160ff16116200009c576002600560006001840360ff1660ff1681526020019081526020016000205402600560008360ff1660ff16815260200190815260200160002081905550808060010191505062000042565b5030600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614c9f806200012f6000396000f3fe6080604052600436106101c25760003560e01c80637b46c54f116100f7578063b325d14e11610095578063ccf19b3111610064578063ccf19b3114610ba5578063d845e63014610cba578063ecabdf7914610d30578063faa9f04b14610d82576101c2565b8063b325d14e14610a17578063bd47341014610a9f578063bf3c41f814610af0578063bf77b45914610b47576101c2565b806387d84e9f116100d157806387d84e9f146108545780638da5cb5b146108ca578063910d13e814610921578063a87430ba14610978576101c2565b80637b46c54f146107345780637ce36ec014610785578063876cb21714610823576101c2565b8063481c6a751161016457806358aba00f1161013e57806358aba00f146105bf5780637337088d14610610578063797eee241461066b5780637b3f6926146106af576101c2565b8063481c6a751461048d5780634a6e1870146104e4578063509222cd14610556576101c2565b80632a2d0c47116101a05780632a2d0c47146103325780632b5ab84a146103ad578063348d448714610404578063356ac86e1461042f576101c2565b80631411a5411461025957806316f0115b146102aa57806329c7040014610301575b60008036905014156101ff576101fa33600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610de7565b610257565b610256336102516000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061160d565b610de7565b5b005b34801561026557600080fd5b506102a86004803603602081101561027c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061161b565b005b3480156102b657600080fd5b506102bf611be1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561030d57600080fd5b50610316611c07565b604051808260ff1660ff16815260200191505060405180910390f35b34801561033e57600080fd5b5061036b6004803603602081101561035557600080fd5b8101908080359060200190929190505050611c0c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103b957600080fd5b506103c2611c3f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561041057600080fd5b50610419611c65565b6040518082815260200191505060405180910390f35b34801561043b57600080fd5b5061048b6004803603604081101561045257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611c6b565b005b34801561049957600080fd5b506104a2611e1c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104f057600080fd5b506105406004803603604081101561050757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611e42565b6040518082815260200191505060405180910390f35b34801561056257600080fd5b506105a56004803603602081101561057957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ea6565b604051808215151515815260200191505060405180910390f35b3480156105cb57600080fd5b5061060e600480360360208110156105e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ef5565b005b34801561061c57600080fd5b506106696004803603604081101561063357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f93565b005b6106ad6004803603602081101561068157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120d6565b005b3480156106bb57600080fd5b506106eb600480360360208110156106d257600080fd5b81019080803560ff1690602001909291905050506120e3565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b34801561074057600080fd5b506107836004803603602081101561075757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612127565b005b34801561079157600080fd5b506107e1600480360360408110156107a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291905050506121c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108526004803603602081101561083957600080fd5b81019080803560ff169060200190929190505050612378565b005b34801561086057600080fd5b506108b06004803603604081101561087757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612ad8565b604051808215151515815260200191505060405180910390f35b3480156108d657600080fd5b506108df612b49565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561092d57600080fd5b50610936612b6f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561098457600080fd5b506109c76004803603602081101561099b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b95565b604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390f35b348015610a2357600080fd5b50610a7360048036036040811015610a3a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612bdf565b604051808415151515815260200183151515158152602001828152602001935050505060405180910390f35b348015610aab57600080fd5b50610aee60048036036020811015610ac257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d19565b005b348015610afc57600080fd5b50610b05612db7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b5357600080fd5b50610ba360048036036040811015610b6a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612ddd565b005b348015610bb157600080fd5b50610be160048036036020811015610bc857600080fd5b81019080803560ff169060200190929190505050612f8e565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b83811015610c60578082015181840152602081019050610c45565b50505050905001838103825285818151815260200191508051906020019060200280838360005b83811015610ca2578082015181840152602081019050610c87565b50505050905001965050505050505060405180910390f35b348015610cc657600080fd5b50610d1660048036036040811015610cdd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050613146565b604051808215151515815260200191505060405180910390f35b348015610d3c57600080fd5b50610d6c60048036036020811015610d5357600080fd5b81019080803560ff1690602001909291905050506131b7565b6040518082815260200191505060405180910390f35b348015610d8e57600080fd5b50610de560048036036060811015610da557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506131cf565b005b67016345785d8a00003414610e64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f726567697374726174696f6e20636f737420302e31000000000000000000000081525060200191505060405180910390fd5b610e6d82611ea6565b15610ee0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f757365722065786973747300000000000000000000000000000000000000000081525060200191505060405180910390fd5b610ee981611ea6565b610f5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7265666572726572206e6f74206578697374730000000000000000000000000081525060200191505060405180910390fd5b6000823b905060008163ffffffff1614610fdd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f63616e6e6f74206265206120636f6e747261637400000000000000000000000081525060200191505060405180910390fd5b610fe5614b4c565b604051806060016040528060005481526020018473ffffffffffffffffffffffffffffffffffffffff1681526020016000815250905080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015590505083600860008054815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003016000600160ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000808154809291906001019190505550600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008154809291906001019190505550600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f309bb360e8b69c23937ccc5fb01f9aeeead1c95a99604e175113ff82f2b1723a600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546040518082815260200191505060405180910390a46112d584846001613862565b6002600360056000600160ff1660ff1681526020019081526020016000205402816112fc57fe5b04600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156113be57600080fd5b505afa1580156113d2573d6000803e3d6000fd5b505050506040513d60208110156113e857600080fd5b81019080805190602001909291905050501061160757600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8560056000600160ff1660ff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156114c157600080fd5b505af11580156114d5573d6000803e3d6000fd5b505050506040513d60208110156114eb57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84600260056000600160ff1660ff168152602001908152602001600020548161156057fe5b046040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156115ca57600080fd5b505af11580156115de573d6000803e3d6000fd5b505050506040513d60208110156115f457600080fd5b8101908080519060200190929190505050505b50505050565b600060148201519050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461167557600080fd5b60008190508073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116c057600080fd5b505afa1580156116d4573d6000803e3d6000fd5b505050506040513d60208110156116ea57600080fd5b8101908080519060200190929190505050600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561178157600080fd5b505afa158015611795573d6000803e3d6000fd5b505050506040513d60208110156117ab57600080fd5b8101908080519060200190929190505050600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561184257600080fd5b505afa158015611856573d6000803e3d6000fd5b505050506040513d602081101561186c57600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663bf3c41f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561190357600080fd5b505afa158015611917573d6000803e3d6000fd5b505050506040513d602081101561192d57600080fd5b8101908080519060200190929190505050600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600190505b600c8160ff1611611bdc57600060608060008573ffffffffffffffffffffffffffffffffffffffff1663ccf19b31866040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506080811015611a2c57600080fd5b81019080805190602001909291908051640100000000811115611a4e57600080fd5b82810190506020810184811115611a6457600080fd5b8151856020820283011164010000000082111715611a8157600080fd5b50509291906020018051640100000000811115611a9d57600080fd5b82810190506020810184811115611ab357600080fd5b8151856020820283011164010000000082111715611ad057600080fd5b505092919060200180519060200190929190505050935093509350935083600660008760ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660008760ff1660ff1681526020019081526020016000206001019080519060200190611b78929190614b83565b5081600660008760ff1660ff1681526020019081526020016000206002019080519060200190611ba9929190614b83565b5080600660008760ff1660ff16815260200190815260200160002060030181905550505050508080600101915050611985565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c81565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cc557600080fd5b611cce82611ea6565b611d40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f75736572206e6f7420657869737473000000000000000000000000000000000081525060200191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1615600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008360ff1660ff16815260200190815260200160002054905092915050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414159050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4f57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fed57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561209657600080fd5b505af11580156120aa573d6000803e3d6000fd5b505050506040513d60208110156120c057600080fd5b8101908080519060200190929190505050505050565b6120e03382610de7565b50565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905082565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461218157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60005b6001156123715760076000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff161561230757600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612372565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506121c8565b5b92915050565b61238133611ea6565b6123d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614c516023913960400191505060405180910390fd5b600560008260ff1660ff168152602001908152602001600020543414612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642070726963650000000000000000000000000000000000000081525060200191505060405180910390fd5b60018160ff1611801561247e5750600c60ff168160ff1611155b6124f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c6964206c6576656c0000000000000000000000000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff16156125ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6c6576656c20616c72656164792061637469766174656400000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006001830360ff1660ff16815260200190815260200160002060009054906101000a900460ff16156126af576000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006001840360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600061272d33836121c5565b905061273a338284613862565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff32f53b11fbb7739b01829cd03cb1b237493aaa124e00423aeaf599841f91a7584604051808260ff1660ff16815260200191505060405180910390a360026003600560008560ff1660ff1681526020019081526020016000205402816127cb57fe5b04600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d60208110156128b757600080fd5b810190808051906020019092919050505010612ad457600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600560008660ff1660ff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561298f57600080fd5b505af11580156129a3573d6000803e3d6000fd5b505050506040513d60208110156129b957600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb826002600560008760ff1660ff1681526020019081526020016000205481612a2d57fe5b046040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a9757600080fd5b505af1158015612aab573d6000803e3d6000fd5b505050506040513d6020811015612ac157600080fd5b8101908080519060200190929190505050505b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154905083565b6000806000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008560ff1660ff16815260200190815260200160002060009054906101000a900460ff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008660ff1660ff16815260200190815260200160002060009054906101000a900460ff16600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008760ff1660ff168152602001908152602001600020549250925092509250925092565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d7357600080fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e3757600080fd5b612e4082611ea6565b612eb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f75736572206e6f7420657869737473000000000000000000000000000000000081525060200191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1615600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006060806000600660008660ff1660ff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008760ff1660ff168152602001908152602001600020600101600660008860ff1660ff168152602001908152602001600020600201600660008960ff1660ff16815260200190815260200160002060030154828054806020026020016040519081016040528092919081815260200182805480156130a857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161305e575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561313057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116130e6575b5050505050915093509350935093509193509193565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60056020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461322957600080fd5b60008390506001820160008190555060008390505b82811161385b5760008273ffffffffffffffffffffffffffffffffffffffff16632a2d0c47836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561329857600080fd5b505afa1580156132ac573d6000803e3d6000fd5b505050506040513d60208110156132c257600080fd5b8101908080519060200190929190505050905060008060008573ffffffffffffffffffffffffffffffffffffffff1663a87430ba856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060606040518083038186803b15801561335757600080fd5b505afa15801561336b573d6000803e3d6000fd5b505050506040513d606081101561338157600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050509250925092506133b4614b4c565b60405180606001604052808581526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815250905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050506000600190505b600c8160ff16116137f6576003871415613589576001600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506137e9565b60008873ffffffffffffffffffffffffffffffffffffffff166387d84e9f88846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff1681526020019250505060206040518083038186803b15801561361657600080fd5b505afa15801561362a573d6000803e3d6000fd5b505050506040513d602081101561364057600080fd5b8101908080519060200190929190505050905080600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008460ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508873ffffffffffffffffffffffffffffffffffffffff16634a6e187088846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff1681526020019250505060206040518083038186803b15801561374f57600080fd5b505afa158015613763573d6000803e3d6000fd5b505050506040513d602081101561377957600080fd5b8101908080519060200190929190505050600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002081905550505b808060010191505061348c565b50846008600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050808060010191505061323e565b5050505050565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1661393b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f3530302e205265666572726572206c6576656c20697320696e6163746976650081525060200191505060405180910390fd5b60066002600560008460ff1660ff168152602001908152602001600020548161396057fe5b04600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002054816139c257fe5b0410613abf57600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006001830160ff1660ff16815260200190815260200160002060009054906101000a900460ff16158015613a465750600c60ff168160ff1614155b15613abe576001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b6002600660008360ff1660ff16815260200190815260200160002060010180549050101561406457600660008260ff1660ff1681526020019081526020016000206001018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc33ed40cea88a5a8a40cc428a4c5a17a2b6174dc640a90269fe3dcc60d7735dd83600660008660ff1660ff16815260200190815260200160002060010180549050604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a381600660008360ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d7c57600560008260ff1660ff1681526020019081526020016000205460076000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008360ff1660ff16815260200190815260200160002060008282540192505081905550613d77828483600560008660ff1660ff168152602001908152602001600020546148ad565b6148a8565b600060646014600560008560ff1660ff168152602001908152602001600020540281613da457fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613e8857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613e81573d6000803e3d6000fd5b50506148a8565b60006064601e600560008660ff1660ff168152602001908152602001600020540281613eb057fe5b049050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613f9557600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613f8d573d6000803e3d6000fd5b5050506148a8565b6000613fa186856121c5565b90506002600560008660ff1660ff1681526020019081526020016000205481613fc657fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008660ff1660ff1681526020019081526020016000206000828254019250508190555061405c8187866002600560008a60ff1660ff168152602001908152602001600020548161405657fe5b046148ad565b5050506148a8565b600660008260ff1660ff1681526020019081526020016000206002018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505081600660008360ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc33ed40cea88a5a8a40cc428a4c5a17a2b6174dc640a90269fe3dcc60d7735dd836002600660008760ff1660ff1681526020019081526020016000206002018054905001604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a36001600660008360ff1660ff1681526020019081526020016000206002018054905014156144ab57600061420e84836121c5565b90506002600560008460ff1660ff168152602001908152602001600020548161423357fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff168152602001908152602001600020600082825401925050819055506142c98185846002600560008860ff1660ff16815260200190815260200160002054816142c357fe5b046148ad565b600060646014600560008660ff1660ff1681526020019081526020016000205402816142f157fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506143d657600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156143ce573d6000803e3d6000fd5b5050506148a8565b60006143e283856121c5565b90506064601e600560008760ff1660ff16815260200190815260200160002054028161440a57fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008660ff1660ff168152602001908152602001600020600082825401925050819055506144a38187866064601e600560008b60ff1660ff16815260200190815260200160002054028161449d57fe5b046148ad565b5050506148a8565b6004600660008360ff1660ff1681526020019081526020016000206002018054905014156145c257600660008260ff1660ff16815260200190815260200160002060030160008154809291906001019190505550600060405190808252806020026020018201604052801561452f5781602001602082028038833980820191505090505b50600660008360ff1660ff168152602001908152602001600020600101908051906020019061455f929190614b83565b5060006040519080825280602002602001820160405280156145905781602001602082028038833980820191505090505b50600660008360ff1660ff16815260200190815260200160002060020190805190602001906145c0929190614b83565b505b60006145ce84836121c5565b90506002600560008460ff1660ff16815260200190815260200160002054816145f357fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff168152602001908152602001600020600082825401925050819055506146898185846002600560008860ff1660ff168152602001908152602001600020548161468357fe5b046148ad565b600060646014600560008660ff1660ff1681526020019081526020016000205402816146b157fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061479657600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561478e573d6000803e3d6000fd5b5050506148a8565b60006064601e600560008760ff1660ff1681526020019081526020016000205402816147be57fe5b049050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506148a457600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561489b573d6000803e3d6000fd5b505050506148a8565b5050505b505050565b6000806148bb8686866149d8565b915091508173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505061495d578173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015614955573d6000803e3d6000fd5b5050506149d2565b80156149cf578173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f396aba16adb88a08463b257ff8c234fb4b91a9f6f0d0b1a6e842c8239b10c0a586604051808260ff1660ff16815260200191505060405180910390a35b50505b50505050565b600080600085905060005b600115614b4157600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008660ff1660ff16815260200190815260200160002060009054906101000a900460ff1615614b2f578573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fe4c390745de94e576db58e5b18db9b14f1185dd2fe6204671461ca8bd05c520187604051808260ff1660ff16815260200191505060405180910390a360019050600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150614b3c565b8181935093505050614b44565b6149e3565b50505b935093915050565b604051806060016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b828054828255906000526020600020908101928215614bfc579160200282015b82811115614bfb5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190614ba3565b5b509050614c099190614c0d565b5090565b614c4d91905b80821115614c4957600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101614c13565b5090565b9056fe75736572206973206e6f74206578697374732e2052656769737465722066697273742ea165627a7a723058207c42000cc0fa32e0927bf18699fa0b8085308db651e6f463a633993de635b7600029

Deployed Bytecode

0x6080604052600436106101c25760003560e01c80637b46c54f116100f7578063b325d14e11610095578063ccf19b3111610064578063ccf19b3114610ba5578063d845e63014610cba578063ecabdf7914610d30578063faa9f04b14610d82576101c2565b8063b325d14e14610a17578063bd47341014610a9f578063bf3c41f814610af0578063bf77b45914610b47576101c2565b806387d84e9f116100d157806387d84e9f146108545780638da5cb5b146108ca578063910d13e814610921578063a87430ba14610978576101c2565b80637b46c54f146107345780637ce36ec014610785578063876cb21714610823576101c2565b8063481c6a751161016457806358aba00f1161013e57806358aba00f146105bf5780637337088d14610610578063797eee241461066b5780637b3f6926146106af576101c2565b8063481c6a751461048d5780634a6e1870146104e4578063509222cd14610556576101c2565b80632a2d0c47116101a05780632a2d0c47146103325780632b5ab84a146103ad578063348d448714610404578063356ac86e1461042f576101c2565b80631411a5411461025957806316f0115b146102aa57806329c7040014610301575b60008036905014156101ff576101fa33600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610de7565b610257565b610256336102516000368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061160d565b610de7565b5b005b34801561026557600080fd5b506102a86004803603602081101561027c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061161b565b005b3480156102b657600080fd5b506102bf611be1565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561030d57600080fd5b50610316611c07565b604051808260ff1660ff16815260200191505060405180910390f35b34801561033e57600080fd5b5061036b6004803603602081101561035557600080fd5b8101908080359060200190929190505050611c0c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103b957600080fd5b506103c2611c3f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561041057600080fd5b50610419611c65565b6040518082815260200191505060405180910390f35b34801561043b57600080fd5b5061048b6004803603604081101561045257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611c6b565b005b34801561049957600080fd5b506104a2611e1c565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156104f057600080fd5b506105406004803603604081101561050757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050611e42565b6040518082815260200191505060405180910390f35b34801561056257600080fd5b506105a56004803603602081101561057957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ea6565b604051808215151515815260200191505060405180910390f35b3480156105cb57600080fd5b5061060e600480360360208110156105e257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ef5565b005b34801561061c57600080fd5b506106696004803603604081101561063357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611f93565b005b6106ad6004803603602081101561068157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120d6565b005b3480156106bb57600080fd5b506106eb600480360360208110156106d257600080fd5b81019080803560ff1690602001909291905050506120e3565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b34801561074057600080fd5b506107836004803603602081101561075757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612127565b005b34801561079157600080fd5b506107e1600480360360408110156107a857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff1690602001909291905050506121c5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108526004803603602081101561083957600080fd5b81019080803560ff169060200190929190505050612378565b005b34801561086057600080fd5b506108b06004803603604081101561087757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612ad8565b604051808215151515815260200191505060405180910390f35b3480156108d657600080fd5b506108df612b49565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561092d57600080fd5b50610936612b6f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561098457600080fd5b506109c76004803603602081101561099b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b95565b604051808481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405180910390f35b348015610a2357600080fd5b50610a7360048036036040811015610a3a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612bdf565b604051808415151515815260200183151515158152602001828152602001935050505060405180910390f35b348015610aab57600080fd5b50610aee60048036036020811015610ac257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d19565b005b348015610afc57600080fd5b50610b05612db7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b5357600080fd5b50610ba360048036036040811015610b6a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050612ddd565b005b348015610bb157600080fd5b50610be160048036036020811015610bc857600080fd5b81019080803560ff169060200190929190505050612f8e565b604051808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b83811015610c60578082015181840152602081019050610c45565b50505050905001838103825285818151815260200191508051906020019060200280838360005b83811015610ca2578082015181840152602081019050610c87565b50505050905001965050505050505060405180910390f35b348015610cc657600080fd5b50610d1660048036036040811015610cdd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803560ff169060200190929190505050613146565b604051808215151515815260200191505060405180910390f35b348015610d3c57600080fd5b50610d6c60048036036020811015610d5357600080fd5b81019080803560ff1690602001909291905050506131b7565b6040518082815260200191505060405180910390f35b348015610d8e57600080fd5b50610de560048036036060811015610da557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001909291905050506131cf565b005b67016345785d8a00003414610e64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f726567697374726174696f6e20636f737420302e31000000000000000000000081525060200191505060405180910390fd5b610e6d82611ea6565b15610ee0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600b8152602001807f757365722065786973747300000000000000000000000000000000000000000081525060200191505060405180910390fd5b610ee981611ea6565b610f5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f7265666572726572206e6f74206578697374730000000000000000000000000081525060200191505060405180910390fd5b6000823b905060008163ffffffff1614610fdd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f63616e6e6f74206265206120636f6e747261637400000000000000000000000081525060200191505060405180910390fd5b610fe5614b4c565b604051806060016040528060005481526020018473ffffffffffffffffffffffffffffffffffffffff1681526020016000815250905080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015590505083600860008054815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003016000600160ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000808154809291906001019190505550600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160008154809291906001019190505550600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001548373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f309bb360e8b69c23937ccc5fb01f9aeeead1c95a99604e175113ff82f2b1723a600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546040518082815260200191505060405180910390a46112d584846001613862565b6002600360056000600160ff1660ff1681526020019081526020016000205402816112fc57fe5b04600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156113be57600080fd5b505afa1580156113d2573d6000803e3d6000fd5b505050506040513d60208110156113e857600080fd5b81019080805190602001909291905050501061160757600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8560056000600160ff1660ff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156114c157600080fd5b505af11580156114d5573d6000803e3d6000fd5b505050506040513d60208110156114eb57600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84600260056000600160ff1660ff168152602001908152602001600020548161156057fe5b046040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156115ca57600080fd5b505af11580156115de573d6000803e3d6000fd5b505050506040513d60208110156115f457600080fd5b8101908080519060200190929190505050505b50505050565b600060148201519050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461167557600080fd5b60008190508073ffffffffffffffffffffffffffffffffffffffff16638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116c057600080fd5b505afa1580156116d4573d6000803e3d6000fd5b505050506040513d60208110156116ea57600080fd5b8101908080519060200190929190505050600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663481c6a756040518163ffffffff1660e01b815260040160206040518083038186803b15801561178157600080fd5b505afa158015611795573d6000803e3d6000fd5b505050506040513d60208110156117ab57600080fd5b8101908080519060200190929190505050600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561184257600080fd5b505afa158015611856573d6000803e3d6000fd5b505050506040513d602081101561186c57600080fd5b8101908080519060200190929190505050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff1663bf3c41f86040518163ffffffff1660e01b815260040160206040518083038186803b15801561190357600080fd5b505afa158015611917573d6000803e3d6000fd5b505050506040513d602081101561192d57600080fd5b8101908080519060200190929190505050600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600190505b600c8160ff1611611bdc57600060608060008573ffffffffffffffffffffffffffffffffffffffff1663ccf19b31866040518263ffffffff1660e01b8152600401808260ff1660ff16815260200191505060006040518083038186803b1580156119ee57600080fd5b505afa158015611a02573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506080811015611a2c57600080fd5b81019080805190602001909291908051640100000000811115611a4e57600080fd5b82810190506020810184811115611a6457600080fd5b8151856020820283011164010000000082111715611a8157600080fd5b50509291906020018051640100000000811115611a9d57600080fd5b82810190506020810184811115611ab357600080fd5b8151856020820283011164010000000082111715611ad057600080fd5b505092919060200180519060200190929190505050935093509350935083600660008760ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660008760ff1660ff1681526020019081526020016000206001019080519060200190611b78929190614b83565b5081600660008760ff1660ff1681526020019081526020016000206002019080519060200190611ba9929190614b83565b5080600660008760ff1660ff16815260200190815260200160002060030181905550505050508080600101915050611985565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c81565b60086020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60005481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611cc557600080fd5b611cce82611ea6565b611d40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f75736572206e6f7420657869737473000000000000000000000000000000000081525060200191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1615600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008360ff1660ff16815260200190815260200160002054905092915050565b600080600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414159050919050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f4f57600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611fed57600080fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561209657600080fd5b505af11580156120aa573d6000803e3d6000fd5b505050506040513d60208110156120c057600080fd5b8101908080519060200190929190505050505050565b6120e03382610de7565b50565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154905082565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461218157600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60005b6001156123715760076000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff161561230757600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050612372565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506121c8565b5b92915050565b61238133611ea6565b6123d6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614c516023913960400191505060405180910390fd5b600560008260ff1660ff168152602001908152602001600020543414612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c69642070726963650000000000000000000000000000000000000081525060200191505060405180910390fd5b60018160ff1611801561247e5750600c60ff168160ff1611155b6124f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600d8152602001807f696e76616c6964206c6576656c0000000000000000000000000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff16156125ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f6c6576656c20616c72656164792061637469766174656400000000000000000081525060200191505060405180910390fd5b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006001830360ff1660ff16815260200190815260200160002060009054906101000a900460ff16156126af576000600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160006001840360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b6001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600061272d33836121c5565b905061273a338284613862565b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167ff32f53b11fbb7739b01829cd03cb1b237493aaa124e00423aeaf599841f91a7584604051808260ff1660ff16815260200191505060405180910390a360026003600560008560ff1660ff1681526020019081526020016000205402816127cb57fe5b04600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561288d57600080fd5b505afa1580156128a1573d6000803e3d6000fd5b505050506040513d60208110156128b757600080fd5b810190808051906020019092919050505010612ad457600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600560008660ff1660ff168152602001908152602001600020546040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561298f57600080fd5b505af11580156129a3573d6000803e3d6000fd5b505050506040513d60208110156129b957600080fd5b810190808051906020019092919050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb826002600560008760ff1660ff1681526020019081526020016000205481612a2d57fe5b046040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612a9757600080fd5b505af1158015612aab573d6000803e3d6000fd5b505050506040513d6020811015612ac157600080fd5b8101908080519060200190929190505050505b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60076020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154905083565b6000806000600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008560ff1660ff16815260200190815260200160002060009054906101000a900460ff16600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008660ff1660ff16815260200190815260200160002060009054906101000a900460ff16600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008760ff1660ff168152602001908152602001600020549250925092509250925092565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612d7357600080fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612e3757600080fd5b612e4082611ea6565b612eb2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f75736572206e6f7420657869737473000000000000000000000000000000000081525060200191505060405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1615600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60006060806000600660008660ff1660ff16815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600660008760ff1660ff168152602001908152602001600020600101600660008860ff1660ff168152602001908152602001600020600201600660008960ff1660ff16815260200190815260200160002060030154828054806020026020016040519081016040528092919081815260200182805480156130a857602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161305e575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561313057602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116130e6575b5050505050915093509350935093509193509193565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60056020528060005260406000206000915090505481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461322957600080fd5b60008390506001820160008190555060008390505b82811161385b5760008273ffffffffffffffffffffffffffffffffffffffff16632a2d0c47836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561329857600080fd5b505afa1580156132ac573d6000803e3d6000fd5b505050506040513d60208110156132c257600080fd5b8101908080519060200190929190505050905060008060008573ffffffffffffffffffffffffffffffffffffffff1663a87430ba856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060606040518083038186803b15801561335757600080fd5b505afa15801561336b573d6000803e3d6000fd5b505050506040513d606081101561338157600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050509250925092506133b4614b4c565b60405180606001604052808581526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815250905080600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201559050506000600190505b600c8160ff16116137f6576003871415613589576001600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600760008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506137e9565b60008873ffffffffffffffffffffffffffffffffffffffff166387d84e9f88846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff1681526020019250505060206040518083038186803b15801561361657600080fd5b505afa15801561362a573d6000803e3d6000fd5b505050506040513d602081101561364057600080fd5b8101908080519060200190929190505050905080600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008460ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508873ffffffffffffffffffffffffffffffffffffffff16634a6e187088846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff1681526020019250505060206040518083038186803b15801561374f57600080fd5b505afa158015613763573d6000803e3d6000fd5b505050506040513d602081101561377957600080fd5b8101908080519060200190929190505050600760008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002081905550505b808060010191505061348c565b50846008600088815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050808060010191505061323e565b5050505050565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008260ff1660ff16815260200190815260200160002060009054906101000a900460ff1661393b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f3530302e205265666572726572206c6576656c20697320696e6163746976650081525060200191505060405180910390fd5b60066002600560008460ff1660ff168152602001908152602001600020548161396057fe5b04600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff16815260200190815260200160002054816139c257fe5b0410613abf57600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006001830160ff1660ff16815260200190815260200160002060009054906101000a900460ff16158015613a465750600c60ff168160ff1614155b15613abe576001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008360ff1660ff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505b5b6002600660008360ff1660ff16815260200190815260200160002060010180549050101561406457600660008260ff1660ff1681526020019081526020016000206001018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc33ed40cea88a5a8a40cc428a4c5a17a2b6174dc640a90269fe3dcc60d7735dd83600660008660ff1660ff16815260200190815260200160002060010180549050604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a381600660008360ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613d7c57600560008260ff1660ff1681526020019081526020016000205460076000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008360ff1660ff16815260200190815260200160002060008282540192505081905550613d77828483600560008660ff1660ff168152602001908152602001600020546148ad565b6148a8565b600060646014600560008560ff1660ff168152602001908152602001600020540281613da457fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613e8857600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613e81573d6000803e3d6000fd5b50506148a8565b60006064601e600560008660ff1660ff168152602001908152602001600020540281613eb057fe5b049050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050613f9557600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613f8d573d6000803e3d6000fd5b5050506148a8565b6000613fa186856121c5565b90506002600560008660ff1660ff1681526020019081526020016000205481613fc657fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008660ff1660ff1681526020019081526020016000206000828254019250508190555061405c8187866002600560008a60ff1660ff168152602001908152602001600020548161405657fe5b046148ad565b5050506148a8565b600660008260ff1660ff1681526020019081526020016000206002018390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505081600660008360ff1660ff16815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc33ed40cea88a5a8a40cc428a4c5a17a2b6174dc640a90269fe3dcc60d7735dd836002600660008760ff1660ff1681526020019081526020016000206002018054905001604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a36001600660008360ff1660ff1681526020019081526020016000206002018054905014156144ab57600061420e84836121c5565b90506002600560008460ff1660ff168152602001908152602001600020548161423357fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff168152602001908152602001600020600082825401925050819055506142c98185846002600560008860ff1660ff16815260200190815260200160002054816142c357fe5b046148ad565b600060646014600560008660ff1660ff1681526020019081526020016000205402816142f157fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506143d657600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f193505050501580156143ce573d6000803e3d6000fd5b5050506148a8565b60006143e283856121c5565b90506064601e600560008760ff1660ff16815260200190815260200160002054028161440a57fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008660ff1660ff168152602001908152602001600020600082825401925050819055506144a38187866064601e600560008b60ff1660ff16815260200190815260200160002054028161449d57fe5b046148ad565b5050506148a8565b6004600660008360ff1660ff1681526020019081526020016000206002018054905014156145c257600660008260ff1660ff16815260200190815260200160002060030160008154809291906001019190505550600060405190808252806020026020018201604052801561452f5781602001602082028038833980820191505090505b50600660008360ff1660ff168152602001908152602001600020600101908051906020019061455f929190614b83565b5060006040519080825280602002602001820160405280156145905781602001602082028038833980820191505090505b50600660008360ff1660ff16815260200190815260200160002060020190805190602001906145c0929190614b83565b505b60006145ce84836121c5565b90506002600560008460ff1660ff16815260200190815260200160002054816145f357fe5b04600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160008460ff1660ff168152602001908152602001600020600082825401925050819055506146898185846002600560008860ff1660ff168152602001908152602001600020548161468357fe5b046148ad565b600060646014600560008660ff1660ff1681526020019081526020016000205402816146b157fe5b049050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505061479657600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561478e573d6000803e3d6000fd5b5050506148a8565b60006064601e600560008760ff1660ff1681526020019081526020016000205402816147be57fe5b049050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506148a457600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f1935050505015801561489b573d6000803e3d6000fd5b505050506148a8565b5050505b505050565b6000806148bb8686866149d8565b915091508173ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505061495d578173ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015614955573d6000803e3d6000fd5b5050506149d2565b80156149cf578173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f396aba16adb88a08463b257ff8c234fb4b91a9f6f0d0b1a6e842c8239b10c0a586604051808260ff1660ff16815260200191505060405180910390a35b50505b50505050565b600080600085905060005b600115614b4157600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060040160008660ff1660ff16815260200190815260200160002060009054906101000a900460ff1615614b2f578573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fe4c390745de94e576db58e5b18db9b14f1185dd2fe6204671461ca8bd05c520187604051808260ff1660ff16815260200191505060405180910390a360019050600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169150614b3c565b8181935093505050614b44565b6149e3565b50505b935093915050565b604051806060016040528060008152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b828054828255906000526020600020908101928215614bfc579160200282015b82811115614bfb5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190614ba3565b5b509050614c099190614c0d565b5090565b614c4d91905b80821115614c4957600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101614c13565b5090565b9056fe75736572206973206e6f74206578697374732e2052656769737465722066697273742ea165627a7a723058207c42000cc0fa32e0927bf18699fa0b8085308db651e6f463a633993de635b7600029

Deployed Bytecode Sourcemap

60:13349:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3725:1;3706:8;;:15;;:20;3702:91;;;3750:31;3763:10;3775:5;;;;;;;;;;;3750:12;:31::i;:::-;3743:38;;3702:91;3805:50;3818:10;3830:24;3845:8;;3830:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3830:24:0;;;;;;:14;:24::i;:::-;3805:12;:50::i;:::-;3663:200;60:13349;1743:768;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1743:768:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1743:768:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;596:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;596:19:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;490:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;490:37:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;820:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;820:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;820:43:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1380:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1380:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;536:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;536:26:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12838:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12838:213:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12838:213:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;622:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;622:22:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;11880:122;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11880:122:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11880:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11318:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11318:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11318:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;12640:95;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12640:95:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12640:95:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;13273:133;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13273:133:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13273:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3871:127;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3871:127:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;733:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;733:36:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;733:36:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12549:83;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12549:83:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12549:83:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;9970:338;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9970:338:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9970:338:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5284:999;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5284:999:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;11602:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11602:138:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11602:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;569:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;569:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1351;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1351:20:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;776:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;776:37:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;776:37:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12010:226;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12010:226:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12010:226:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12743:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12743:87:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12743:87:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;651:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;651:26:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13059:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13059:206:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13059:206:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12244:297;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12244:297:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12244:297:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12244:297:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;12244:297:0;;;;;;;;;;;;;;;;;;;;;11748:124;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11748:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11748:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;686:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;686:40:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;686:40:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2519:1136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2519:1136:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2519:1136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;4006:1270;4114:9;4101;:22;4093:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4169:25;4182:11;4169:12;:25::i;:::-;4168:26;4160:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4229:29;4242:15;4229:12;:29::i;:::-;4221:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4295:11;4361;4349:24;4341:32;;4410:1;4402:4;:9;;;4394:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4449:16;;:::i;:::-;4468:124;;;;;;;;4493:10;;4468:124;;;;4529:15;4468:124;;;;;;4575:1;4468:124;;;4449:143;;4626:4;4605:5;:18;4611:11;4605:18;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4667:11;4641;:23;4653:10;;4641:23;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;4730:4;4691:5;:18;4697:11;4691:18;;;;;;;;;;;;;;;:33;;:36;4725:1;4691:36;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;4747:10;;:12;;;;;;;;;;;;;4772:5;:22;4778:15;4772:22;;;;;;;;;;;;;;;:36;;;:38;;;;;;;;;;;;;4871:5;:18;4877:11;4871:18;;;;;;;;;;;;;;;:21;;;4854:15;4828:92;;4841:11;4828:92;;;4894:5;:22;4900:15;4894:22;;;;;;;;;;;;;;;:25;;;4828:92;;;;;;;;;;;;;;;;;;4933:56;4950:11;4963:15;4986:1;4933:16;:56::i;:::-;5077:1;5073;5050:10;:20;5067:1;5050:20;;;;;;;;;;;;;;;;:24;:28;;;;;;5016:11;;;;;;;;;;;5004:34;;;5039:5;;;;;;;;;;;5004:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5004:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5004:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5004:41:0;;;;;;;;;;;;;;;;:75;5000:267;;5108:11;;;;;;;;;;;5096:33;;;5130:11;5143:10;:20;5160:1;5143:20;;;;;;;;;;;;;;;;5096:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5096:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5096:68:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5096:68:0;;;;;;;;;;;;;;;;;5191:11;;;;;;;;;;;5179:33;;;5213:15;5253:1;5230:10;:20;5247:1;5230:20;;;;;;;;;;;;;;;;:24;;;;;;5179:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5179:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5179:76:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5179:76:0;;;;;;;;;;;;;;;;;5000:267;4006:1270;;;;:::o;11436:158::-;11500:12;11572:2;11567:3;11563:12;11557:19;11549:27;;11534:53;;;:::o;1743:768::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;1806:15;1849:7;1806:53;;1878:6;:12;;;:14;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1878:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1878:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1878:14:0;;;;;;;;;;;;;;;;1870:5;;:22;;;;;;;;;;;;;;;;;;1913:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1913:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1913:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1913:16:0;;;;;;;;;;;;;;;;1903:7;;:26;;;;;;;;;;;;;;;;;;1947:6;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1947:13:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1947:13:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1947:13:0;;;;;;;;;;;;;;;;1940:4;;:20;;;;;;;;;;;;;;;;;;1985:6;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1985:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1985:20:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1985:20:0;;;;;;;;;;;;;;;;1971:11;;:34;;;;;;;;;;;;;;;;;;2023:7;2033:1;2023:11;;2018:486;2041:2;2036:1;:7;;;2018:486;;2066:23;2091:36;2143:37;2195:18;2217:6;:18;;;2236:1;2217:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2217:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2217:21:0;;;;;;39:16:-1;36:1;17:17;2:54;2217:21:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:3;8;5:12;2:2;;;30:1;27;20:12;2:2;2217:21:0;;;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;0:373;;2217:21:0;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;71:11;66:3;62:21;55:28;;123:4;118:3;114:14;159:9;141:16;138:31;135:2;;;182:1;179;172:12;135:2;219:3;213:10;331:9;325:2;311:12;307:21;289:16;285:44;282:59;261:11;247:12;244:29;233:116;230:2;;;362:1;359;352:12;230:2;0:373;;2217:21:0;;;;;;;;;;;;;;;;;2065:173;;;;;;;;2283:15;2253:8;:11;2262:1;2253:11;;;;;;;;;;;;;;;:27;;;:45;;;;;;;;;;;;;;;;;;2347:19;2313:8;:11;2322:1;2313:11;;;;;;;;;;;;;;;:31;;:53;;;;;;;;;;;;:::i;:::-;;2416:20;2381:8;:11;2390:1;2381:11;;;;;;;;;;;;;;;:32;;:55;;;;;;;;;;;;:::i;:::-;;2479:13;2451:8;:11;2460:1;2451:11;;;;;;;;;;;;;;;:25;;:41;;;;2018:486;;;;2045:3;;;;;;;2018:486;;;;1478:1;1743:768;:::o;596:19::-;;;;;;;;;;;;;:::o;490:37::-;525:2;490:37;:::o;820:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;1380:20::-;;;;;;;;;;;;;:::o;536:26::-;;;;:::o;12838:213::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12919:19;12932:5;12919:12;:19::i;:::-;12911:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13008:5;:12;13014:5;13008:12;;;;;;;;;;;;;;;:27;;:35;13036:6;13008:35;;;;;;;;;;;;;;;;;;;;;;;;;13007:36;12969:5;:12;12975:5;12969:12;;;;;;;;;;;;;;;:27;;:35;12997:6;12969:35;;;;;;;;;;;;;;;;:74;;;;;;;;;;;;;;;;;;12838:213;;:::o;622:22::-;;;;;;;;;;;;;:::o;11880:122::-;11945:4;11968:5;:12;11974:5;11968:12;;;;;;;;;;;;;;;:19;;:26;11988:5;11968:26;;;;;;;;;;;;;;;;11961:33;;11880:122;;;;:::o;11318:110::-;11375:4;11418:1;11400:5;:11;11406:4;11400:11;;;;;;;;;;;;;;;:14;;;:19;;11392:28;;11318:110;;;:::o;12640:95::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12719:8;12709:7;;:18;;;;;;;;;;;;;;;;;;12640:95;:::o;13273:133::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;13362:11;;;;;;;;;;;13350:33;;;13384:5;13391:6;13350:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13350:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13350:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13350:48:0;;;;;;;;;;;;;;;;;13273:133;;:::o;3871:127::-;3949:41;3962:10;3974:15;3949:12;:41::i;:::-;3871:127;:::o;733:36::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12549:83::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12619:5;12612:4;;:12;;;;;;;;;;;;;;;;;;12549:83;:::o;9970:338::-;10053:7;10073:228;10080:4;10073:228;;;10105:5;:34;10111:5;:18;10117:11;10111:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;10105:34;;;;;;;;;;;;;;;:49;;:56;10155:5;10105:56;;;;;;;;;;;;;;;;;;;;;;;;;10101:131;;;10189:5;:18;10195:11;10189:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;10182:34;;;;10101:131;10262:5;:18;10268:11;10262:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;10248:41;;10073:228;;;9970:338;;;;;:::o;5284:999::-;5354:24;5367:10;5354:12;:24::i;:::-;5346:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5450:10;:17;5461:5;5450:17;;;;;;;;;;;;;;;;5437:9;:30;5429:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5512:1;5504:5;:9;;;:32;;;;;525:2;5517:19;;:5;:19;;;;5504:32;5496:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5574:5;:17;5580:10;5574:17;;;;;;;;;;;;;;;:32;;:39;5607:5;5574:39;;;;;;;;;;;;;;;;;;;;;;;;;5573:40;5565:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5658:5;:17;5664:10;5658:17;;;;;;;;;;;;;;;:25;;:36;5692:1;5684:5;:9;5658:36;;;;;;;;;;;;;;;;;;;;;;;;;5654:113;;;5750:5;5711;:17;5717:10;5711:17;;;;;;;;;;;;;;;:25;;:36;5745:1;5737:5;:9;5711:36;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;5654:113;5819:4;5777:5;:17;5783:10;5777:17;;;;;;;;;;;;;;;:32;;:39;5810:5;5777:39;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;5834:20;5857:37;5876:10;5888:5;5857:18;:37::i;:::-;5834:60;;5905:49;5922:10;5934:12;5948:5;5905:16;:49::i;:::-;5991:12;5970:41;;5979:10;5970:41;;;6005:5;5970:41;;;;;;;;;;;;;;;;;;;;;;6096:1;6092;6072:10;:17;6083:5;6072:17;;;;;;;;;;;;;;;;:21;:25;;;;;;6038:11;;;;;;;;;;;6026:34;;;6061:5;;;;;;;;;;;6026:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6026:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6026:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6026:41:0;;;;;;;;;;;;;;;;:72;6022:254;;6127:11;;;;;;;;;;;6115:33;;;6149:10;6161;:17;6172:5;6161:17;;;;;;;;;;;;;;;;6115:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6115:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6115:64:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6115:64:0;;;;;;;;;;;;;;;;;6206:11;;;;;;;;;;;6194:33;;;6228:12;6262:1;6242:10;:17;6253:5;6242:17;;;;;;;;;;;;;;;;:21;;;;;;6194:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6194:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6194:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;6194:70:0;;;;;;;;;;;;;;;;;6022:254;5284:999;;:::o;11602:138::-;11675:4;11698:5;:12;11704:5;11698:12;;;;;;;;;;;;;;;:27;;:34;11726:5;11698:34;;;;;;;;;;;;;;;;;;;;;;;;;11691:41;;11602:138;;;;:::o;569:20::-;;;;;;;;;;;;;:::o;1351:::-;;;;;;;;;;;;;:::o;776:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12010:226::-;12080:4;12086;12092;12116:5;:12;12122:5;12116:12;;;;;;;;;;;;;;;:27;;:34;12144:5;12116:34;;;;;;;;;;;;;;;;;;;;;;;;;12162:5;:12;12168:5;12162:12;;;;;;;;;;;;;;;:20;;:27;12183:5;12162:27;;;;;;;;;;;;;;;;;;;;;;;;;12201:5;:12;12207:5;12201:12;;;;;;;;;;;;;;;:19;;:26;12221:5;12201:26;;;;;;;;;;;;;;;;12108:120;;;;;;12010:226;;;;;:::o;12743:87::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;12816:6;12808:5;;:14;;;;;;;;;;;;;;;;;;12743:87;:::o;651:26::-;;;;;;;;;;;;;:::o;13059:206::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;13147:19;13160:5;13147:12;:19::i;:::-;13139:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13229:5;:12;13235:5;13229:12;;;;;;;;;;;;;;;:20;;:28;13250:6;13229:28;;;;;;;;;;;;;;;;;;;;;;;;;13228:29;13197:5;:12;13203:5;13197:12;;;;;;;;;;;;;;;:20;;:28;13218:6;13197:28;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;13059:206;;:::o;12244:297::-;12299:7;12308:16;12326;12344:4;12368:8;:15;12377:5;12368:15;;;;;;;;;;;;;;;:31;;;;;;;;;;;;12410:8;:15;12419:5;12410:15;;;;;;;;;;;;;;;:35;;12456:8;:15;12465:5;12456:15;;;;;;;;;;;;;;;:36;;12503:8;:15;12512:5;12503:15;;;;;;;;;;;;;;;:29;;;12360:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12244:297;;;;;:::o;11748:124::-;11814:4;11837:5;:12;11843:5;11837:12;;;;;;;;;;;;;;;:20;;:27;11858:5;11837:27;;;;;;;;;;;;;;;;;;;;;;;;;11830:34;;11748:124;;;;:::o;686:40::-;;;;;;;;;;;;;;;;;:::o;2519:1136::-;1461:5;;;;;;;;;;;1447:19;;:10;:19;;;1439:28;;;;;;2608:15;2651:7;2608:53;;2693:1;2687:3;:7;2674:10;:20;;;;2712:6;2721:5;2712:14;;2707:941;2733:3;2728:1;:8;2707:941;;2758:19;2780:6;:18;;;2799:1;2780:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2780:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2780:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2780:21:0;;;;;;;;;;;;;;;;2758:43;;2817:7;2825:16;2842:18;2864:6;:12;;;2877:11;2864:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2864:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2864:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2864:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2816:73;;;;;;2904:16;;:::i;:::-;2923:137;;;;;;;;2952:2;2923:137;;;;2984:8;2923:137;;;;;;3027:13;2923:137;;;2904:156;;3096:4;3075:5;:18;3081:11;3075:18;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3122:7;3132:1;3122:11;;3117:475;3140:2;3135:1;:7;;;3117:475;;3177:1;3172;:6;3168:409;;;3235:4;3203:5;:18;3209:11;3203:18;;;;;;;;;;;;;;;:26;;:29;3230:1;3203:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;3301:5;3262;:18;3268:11;3262:18;;;;;;;;;;;;;;;:33;;:36;3296:1;3262:36;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;3168:409;;;3355:11;3369:6;:21;;;3391:11;3404:1;3369:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3369:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3369:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3369:37:0;;;;;;;;;;;;;;;;3355:51;;3468:6;3429:5;:18;3435:11;3429:18;;;;;;;;;;;;;;;:33;;:36;3463:1;3429:36;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;3528:6;:13;;;3542:11;3555:1;3528:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3528:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3528:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3528:29:0;;;;;;;;;;;;;;;;3497:5;:18;3503:11;3497:18;;;;;;;;;;;;;;;:25;;:28;3523:1;3497:28;;;;;;;;;;;;;;;:60;;;;3168:409;;3144:3;;;;;;;3117:475;;;;3625:11;3608;:14;3620:1;3608:14;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;2707:941;;;;;2738:3;;;;;;;2707:941;;;;1478:1;2519:1136;;;:::o;6291:3671::-;6403:5;:22;6409:15;6403:22;;;;;;;;;;;;;;;:37;;:44;6441:5;6403:44;;;;;;;;;;;;;;;;;;;;;;;;;6395:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6568:1;6561;6541:10;:17;6552:5;6541:17;;;;;;;;;;;;;;;;:21;;;;;;6501:5;:22;6507:15;6501:22;;;;;;;;;;;;;;;:29;;:36;6531:5;6501:36;;;;;;;;;;;;;;;;:62;;;;;;6500:69;6496:258;;6591:5;:22;6597:15;6591:22;;;;;;;;;;;;;;;:37;;:48;6637:1;6629:5;:9;6591:48;;;;;;;;;;;;;;;;;;;;;;;;;6590:49;:72;;;;;525:2;6643:19;;:5;:19;;;;6590:72;6586:157;;;6723:4;6683:5;:22;6689:15;6683:22;;;;;;;;;;;;;;;:30;;:37;6714:5;6683:37;;;;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;6586:157;6496:258;6813:1;6768:8;:15;6777:5;6768:15;;;;;;;;;;;;;;;:35;;:42;;;;:46;6764:1234;;;6831:8;:15;6840:5;6831:15;;;;;;;;;;;;;;;:35;;6872:11;6831:53;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;6831:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6930:15;6904:100;;6917:11;6904:100;;;6947:5;6960:8;:15;6969:5;6960:15;;;;;;;;;;;;;;;:35;;:42;;;;6904:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7055:15;7021:8;:15;7030:5;7021:15;;;;;;;;;;;;;;;:31;;;:49;;;;;;;;;;;;;;;;;;7108:5;;;;;;;;;;;7089:24;;:15;:24;;;7085:210;;;7164:10;:17;7175:5;7164:17;;;;;;;;;;;;;;;;7134:5;:12;7140:5;;;;;;;;;;;7134:12;;;;;;;;;;;;;;;:19;;:26;7154:5;7134:26;;;;;;;;;;;;;;;;:47;;;;;;;;;;;7207:72;7224:15;7241:11;7254:5;7261:10;:17;7272:5;7261:17;;;;;;;;;;;;;;;;7207:16;:72::i;:::-;7200:79;;7085:210;7311:15;7354:3;7349:2;7329:10;:17;7340:5;7329:17;;;;;;;;;;;;;;;;:22;:28;;;;;;7311:46;;7393:4;;;;;;;;;;;7377:27;;:39;7405:10;7377:39;;;;;;;;;;;;;;;;;;;;;;;7372:142;;7460:4;;;;;;;;;;;7444:31;;:54;7484:4;7476:21;;;7444:54;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7444:54:0;7437:61;;;7372:142;7528:18;7574:3;7569:2;7549:10;:17;7560:5;7549:17;;;;;;;;;;;;;;;;:22;:28;;;;;;7528:49;;7613:7;;;;;;;;;;;7597:30;;:45;7628:13;7597:45;;;;;;;;;;;;;;;;;;;;;;;7592:151;;7686:7;;;;;;;;;;;7670:34;;:57;7713:4;7705:21;;;7670:57;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7670:57:0;7663:64;;;;7592:151;7757:20;7780:38;7799:11;7812:5;7780:18;:38::i;:::-;7757:61;;7890:1;7870:10;:17;7881:5;7870:17;;;;;;;;;;;;;;;;:21;;;;;;7833:5;:19;7839:12;7833:19;;;;;;;;;;;;;;;:26;;:33;7860:5;7833:33;;;;;;;;;;;;;;;;:58;;;;;;;;;;;7913:73;7930:12;7944:11;7957:5;7984:1;7964:10;:17;7975:5;7964:17;;;;;;;;;;;;;;;;:21;;;;;;7913:16;:73::i;:::-;7906:80;;;;;6764:1234;8008:8;:15;8017:5;8008:15;;;;;;;;;;;;;;;:36;;8050:11;8008:54;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;8008:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8107:15;8073:8;:15;8082:5;8073:15;;;;;;;;;;;;;;;:31;;;:49;;;;;;;;;;;;;;;;;;8164:15;8138:105;;8151:11;8138:105;;;8181:5;8240:1;8194:8;:15;8203:5;8194:15;;;;;;;;;;;;;;;:36;;:43;;;;:47;8138:105;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8307:1;8260:8;:15;8269:5;8260:15;;;;;;;;;;;;;;;:36;;:43;;;;:48;8256:785;;;8325:20;8348:38;8367:11;8380:5;8348:18;:38::i;:::-;8325:61;;8458:1;8438:10;:17;8449:5;8438:17;;;;;;;;;;;;;;;;:21;;;;;;8401:5;:19;8407:12;8401:19;;;;;;;;;;;;;;;:26;;:33;8428:5;8401:33;;;;;;;;;;;;;;;;:58;;;;;;;;;;;8474:73;8491:12;8505:11;8518:5;8545:1;8525:10;:17;8536:5;8525:17;;;;;;;;;;;;;;;;:21;;;;;;8474:16;:73::i;:::-;8562:15;8605:3;8600:2;8580:10;:17;8591:5;8580:17;;;;;;;;;;;;;;;;:22;:28;;;;;;8562:46;;8644:4;;;;;;;;;;;8628:27;;:39;8656:10;8628:39;;;;;;;;;;;;;;;;;;;;;;;8623:142;;8711:4;;;;;;;;;;;8695:31;;:54;8735:4;8727:21;;;8695:54;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8695:54:0;8688:61;;;;8623:142;8779:22;8804:39;8823:12;8837:5;8804:18;:39::i;:::-;8779:64;;8922:3;8917:2;8897:10;:17;8908:5;8897:17;;;;;;;;;;;;;;;;:22;:28;;;;;;8858:5;:21;8864:14;8858:21;;;;;;;;;;;;;;;:28;;:35;8887:5;8858:35;;;;;;;;;;;;;;;;:67;;;;;;;;;;;8947:82;8964:14;8980:11;8993:5;9025:3;9020:2;9000:10;:17;9011:5;9000:17;;;;;;;;;;;;;;;;:22;:28;;;;;;8947:16;:82::i;:::-;8940:89;;;;;8256:785;9104:1;9057:8;:15;9066:5;9057:15;;;;;;;;;;;;;;;:36;;:43;;;;:48;9053:263;;;9132:8;:15;9141:5;9132:15;;;;;;;;;;;;;;;:29;;;:31;;;;;;;;;;;;;9232:1;9218:16;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;9218:16:0;;;;9180:8;:15;9189:5;9180:15;;;;;;;;;;;;;;;:35;;:54;;;;;;;;;;;;:::i;:::-;;9302:1;9288:16;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;9288:16:0;;;;9249:8;:15;9258:5;9249:15;;;;;;;;;;;;;;;:36;;:55;;;;;;;;;;;;:::i;:::-;;9053:263;9326:20;9349:38;9368:11;9381:5;9349:18;:38::i;:::-;9326:61;;9455:1;9435:10;:17;9446:5;9435:17;;;;;;;;;;;;;;;;:21;;;;;;9398:5;:19;9404:12;9398:19;;;;;;;;;;;;;;;:26;;:33;9425:5;9398:33;;;;;;;;;;;;;;;;:58;;;;;;;;;;;9467:73;9484:12;9498:11;9511:5;9538:1;9518:10;:17;9529:5;9518:17;;;;;;;;;;;;;;;;:21;;;;;;9467:16;:73::i;:::-;9551:15;9594:3;9589:2;9569:10;:17;9580:5;9569:17;;;;;;;;;;;;;;;;:22;:28;;;;;;9551:46;;9629:4;;;;;;;;;;;9613:27;;:39;9641:10;9613:39;;;;;;;;;;;;;;;;;;;;;;;9608:134;;9692:4;;;;;;;;;;;9676:31;;:54;9716:4;9708:21;;;9676:54;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9676:54:0;9669:61;;;;9608:134;9752:18;9798:3;9793:2;9773:10;:17;9784:5;9773:17;;;;;;;;;;;;;;;;:22;:28;;;;;;9752:49;;9833:7;;;;;;;;;;;9817:30;;:45;9848:13;9817:45;;;;;;;;;;;;;;;;;;;;;;;9812:143;;9902:7;;;;;;;;;;;9886:34;;:57;9929:4;9921:21;;;9886:57;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9886:57:0;9879:64;;;;;9812:143;6291:3671;;;;;;;:::o;10848:462::-;10956:16;10974:21;10999:42;11015:11;11028:5;11035;10999:15;:42::i;:::-;10955:86;;;;11075:8;11059:31;;:39;11091:6;11059:39;;;;;;;;;;;;;;;;;;;;;;;11054:138;;11138:8;11122:35;;:58;11166:4;11158:21;;;11122:58;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11122:58:0;11115:65;;;;11054:138;11208:16;11204:99;;;11275:8;11246:45;;11268:5;11246:45;;;11285:5;11246:45;;;;;;;;;;;;;;;;;;;;;;11204:99;10848:462;;;;;;;:::o;10316:524::-;10407:7;10416:4;10433:16;10452:11;10433:30;;10474:21;10506:327;10513:4;10506:327;;;10538:5;:15;10544:8;10538:15;;;;;;;;;;;;;;;:23;;:30;10562:5;10538:30;;;;;;;;;;;;;;;;;;;;;;;;;10534:288;;;10621:5;10594:40;;10611:8;10594:40;;;10628:5;10594:40;;;;;;;;;;;;;;;;;;;;;;10672:4;10653:23;;10706:5;:15;10712:8;10706:15;;;;;;;;;;;;;;;:24;;;;;;;;;;;;10695:35;;10534:288;;;10779:8;10789:16;10771:35;;;;;;;;10534:288;10506:327;;;10316:524;;;;;;;;;:::o;60:13349::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://7c42000cc0fa32e0927bf18699fa0b8085308db651e6f463a633993de635b760

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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