ETH Price: $2,865.30 (-2.65%)

Contract

0x5361ee2f443B61E60F19Dbe73a324f342619161D
 

Overview

ETH Balance

0.19202320151510394 ETH

ETH Value

$550.20 (@ $2,865.30/ETH)

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Fund Goo Researc...302928642026-01-26 2:45:432 hrs ago1769395543IN
0x5361ee2f...42619161D
0 ETH0.000000050.00000025
Buy Unit302850472026-01-25 22:25:097 hrs ago1769379909IN
0x5361ee2f...42619161D
0 ETH0.000004080.00000125
Attack Player302850422026-01-25 22:24:597 hrs ago1769379899IN
0x5361ee2f...42619161D
0 ETH0.00000420.00000125
Buy Unit302850372026-01-25 22:24:497 hrs ago1769379889IN
0x5361ee2f...42619161D
0 ETH0.000003840.00000125
Attack Player302850312026-01-25 22:24:377 hrs ago1769379877IN
0x5361ee2f...42619161D
0 ETH0.000006160.00000125
Attack Player302850262026-01-25 22:24:277 hrs ago1769379867IN
0x5361ee2f...42619161D
0 ETH0.000005190.00000125
Buy Unit302480372026-01-25 1:51:2927 hrs ago1769305889IN
0x5361ee2f...42619161D
0 ETH0.000000050.00000125
Attack Player302480292026-01-25 1:51:1327 hrs ago1769305873IN
0x5361ee2f...42619161D
0 ETH0.000000050.00000125
Attack Player302480242026-01-25 1:51:0327 hrs ago1769305863IN
0x5361ee2f...42619161D
0 ETH0.000000050.00000125
Buy Unit302461112026-01-25 0:47:1728 hrs ago1769302037IN
0x5361ee2f...42619161D
0 ETH0.000000040.00000125
Attack Player302460972026-01-25 0:46:4928 hrs ago1769302009IN
0x5361ee2f...42619161D
0 ETH0.000000040.00000125
Attack Player302460882026-01-25 0:46:3128 hrs ago1769301991IN
0x5361ee2f...42619161D
0 ETH0.000000040.00000125
Attack Player302460822026-01-25 0:46:1928 hrs ago1769301979IN
0x5361ee2f...42619161D
0 ETH0.000000040.00000125
Attack Player302460762026-01-25 0:46:0728 hrs ago1769301967IN
0x5361ee2f...42619161D
0 ETH0.000000050.00000125
Buy Unit302225802026-01-24 11:42:5541 hrs ago1769254975IN
0x5361ee2f...42619161D
0 ETH0.000000060.00000125
Attack Player302225742026-01-24 11:42:4341 hrs ago1769254963IN
0x5361ee2f...42619161D
0 ETH0.000000070.00000125
Attack Player302225692026-01-24 11:42:3341 hrs ago1769254953IN
0x5361ee2f...42619161D
0 ETH0.000000070.00000125
Buy Unit302225622026-01-24 11:42:1941 hrs ago1769254939IN
0x5361ee2f...42619161D
0 ETH0.000000070.00000125
Attack Player302225572026-01-24 11:42:0941 hrs ago1769254929IN
0x5361ee2f...42619161D
0 ETH0.000000070.00000125
Attack Player302225522026-01-24 11:41:5941 hrs ago1769254919IN
0x5361ee2f...42619161D
0 ETH0.000000070.00000125
Fund Goo Researc...301545972026-01-22 21:56:493 days ago1769119009IN
0x5361ee2f...42619161D
0 ETH0.000000120.00000125
Buy Unit301545822026-01-22 21:56:193 days ago1769118979IN
0x5361ee2f...42619161D
0 ETH0.000000120.00000125
Attack Player301545762026-01-22 21:56:073 days ago1769118967IN
0x5361ee2f...42619161D
0 ETH0.000000120.00000125
Attack Player301545712026-01-22 21:55:573 days ago1769118957IN
0x5361ee2f...42619161D
0 ETH0.000000120.00000125
Attack Player301545662026-01-22 21:55:473 days ago1769118947IN
0x5361ee2f...42619161D
0 ETH0.000000120.00000125
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
293827782026-01-05 1:09:3121 days ago1767575371
0x5361ee2f...42619161D
0.00047013 ETH
293827782026-01-05 1:09:3121 days ago1767575371
0x5361ee2f...42619161D
0.0000538 ETH
285385292025-12-16 12:07:5340 days ago1765886873
0x5361ee2f...42619161D
0.00144593 ETH
285385292025-12-16 12:07:5340 days ago1765886873
0x5361ee2f...42619161D
0.00056406 ETH
283218942025-12-11 11:46:4345 days ago1765453603
0x5361ee2f...42619161D
0.00106578 ETH
271108452025-11-13 10:58:2573 days ago1763031505
0x5361ee2f...42619161D
0.00216286 ETH
265540852025-10-31 13:39:4586 days ago1761917985
0x5361ee2f...42619161D
0.0028829 ETH
265540852025-10-31 13:39:4586 days ago1761917985
0x5361ee2f...42619161D
0.00116774 ETH
262271202025-10-24 0:00:5594 days ago1761264055
0x5361ee2f...42619161D
0.00101728 ETH
261613552025-10-22 11:28:4595 days ago1761132525
0x5361ee2f...42619161D
0.00345395 ETH
259661352025-10-17 23:01:25100 days ago1760742085
0x5361ee2f...42619161D
0.00125743 ETH
258023172025-10-14 4:00:49104 days ago1760414449
0x5361ee2f...42619161D
0.05 ETH
257757462025-10-13 13:15:07104 days ago1760361307
0x5361ee2f...42619161D
0.01962755 ETH
256907162025-10-11 14:00:47106 days ago1760191247
0x5361ee2f...42619161D
0.00130163 ETH
255665162025-10-08 17:00:47109 days ago1759942847
0x5361ee2f...42619161D
0.03076926 ETH
251341212025-09-28 16:47:37119 days ago1759078057
0x5361ee2f...42619161D
0.00005707 ETH
251341212025-09-28 16:47:37119 days ago1759078057
0x5361ee2f...42619161D
0.00094866 ETH
250737732025-09-27 7:16:01120 days ago1758957361
0x5361ee2f...42619161D
0.00194617 ETH
250737732025-09-27 7:16:01120 days ago1758957361
0x5361ee2f...42619161D
0.00047705 ETH
244143972025-09-12 0:56:49136 days ago1757638609
0x5361ee2f...42619161D
0.00020496 ETH
244143972025-09-12 0:56:49136 days ago1757638609
0x5361ee2f...42619161D
0.00003738 ETH
239341522025-08-31 22:08:39147 days ago1756678119
0x5361ee2f...42619161D
0.00166131 ETH
231347892025-08-13 10:03:13165 days ago1755079393
0x5361ee2f...42619161D
0.00153926 ETH
231347892025-08-13 10:03:13165 days ago1755079393
0x5361ee2f...42619161D
0.00075682 ETH
230195952025-08-10 18:03:25168 days ago1754849005
0x5361ee2f...42619161D
0.00024007 ETH
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FarmGoo

Compiler Version
v0.5.16+commit.9c3226ce

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at blastscan.io on 2024-02-29
*/

pragma solidity 0.5.16;

/**
 *
 * https://blastgoo.com
 * 
 * The competitive free2play idle game powered by Blast Native yield, play now!
 *
 */

contract GooFarm {
    using SafeMath for uint256;

    FarmGoo constant farmGoo = FarmGoo(0x0);
    Blast constant blast = Blast(0x4300000000000000000000000000000000000002);
    address constant blobby = address(0xf0eCCE59887de745Ce00D445c65DBE69EF5d5B2e);
    address public farmToken; // This is native eth so has no token address

    mapping(address => uint256) public balances;
    mapping(address => uint256) public unlockTime;

    function() payable external {}

    constructor() public {
        blast.configureClaimableYield();
        blast.configureClaimableGas();
    }

    function stake(address player) external payable {
        require(msg.sender == address(farmGoo));
        balances[player] += msg.value;

        if (unlockTime[player] == 0) {
            unlockTime[player] = now + 30 days;
        }
    }

    function unstake(address payable player, uint256 amount) external {
        require(msg.sender == address(farmGoo));
        require(now > unlockTime[player]);

		balances[player] = balances[player].sub(amount);
		player.transfer(amount);
    }

    function claimBlastYield() external {
        uint256 gained = blast.claimAllYield(address(this), address(this));
        gained += blast.claimAllGas(address(this), address(this));
        farmGoo.addEth.value(gained)();
    }

    function recoverToken(address erc20, uint256 amount) external  {
        require(msg.sender == blobby); // Just incase someone accidently sends random token here
        require(erc20 != farmToken);
        ERC20(erc20).transfer(blobby, amount);
    }

}



contract FarmGoo {
    using SafeMath for uint256;

    Blast constant blast = Blast(0x4300000000000000000000000000000000000002);

    uint256 public totalGooProduction;
    address public owner = msg.sender; // Minor management of game

    uint256 constant public researchDivPercent = 4;
    uint256 constant public gooDepositDivPercent = 1;

    uint256 public totalEthResearchPool; // Eth dividends to be distributed to players
    uint256 public platformGas; // 5% of gas stored for crons etc.
    uint256[] private totalGooProductionSnapshots; // The total goo production for each prior day past
    uint256[] private totalGooDepositSnapshots;  // The total goo deposited for each prior day past
    uint256[] private allocatedGooResearchSnapshots; // Div pot #1 (research eth allocated to each prior day past)
    uint256[] private allocatedGooDepositSnapshots;  // Div pot #2 (deposit eth allocated to each prior day past)
    uint256 public nextSnapshotTime;
    uint256 public nextGooDepositSnapshotTime;
    uint256 public startTime;

    mapping(address => address[]) public playersReferals;
    mapping(address => address) public playersRef;
    mapping(address => uint256) private lastUnitBoughtEpoch;
    mapping(address => uint256) private lastUpgradeBoughtEpoch;
    address[] public players;

    // Balances for each player
    mapping(address => uint256) private gooBalance;
    mapping(address => mapping(uint256 => uint256)) private gooProductionSnapshots; // Store player's goo production for given day (snapshot)
    mapping(address => mapping(uint256 => uint256)) private gooDepositSnapshots;    // Store player's goo deposited for given day (snapshot)
    mapping(address => mapping(uint256 => bool)) private gooProductionZeroedSnapshots; // This isn't great but we need know difference between 0 production and an unused/inactive day.

    mapping(address => uint256) private lastGooSaveTime; // Seconds (last time player claimed their produced goo)
    mapping(address => uint256) public lastGooProductionUpdate; // Days (last snapshot player updated their production)
    mapping(address => uint256) private lastGooResearchFundClaim; // Days (snapshot number)
    mapping(address => uint256) private lastGooDepositFundClaim; // Days (snapshot number)

    // Stuff owned by each player
    mapping(address => mapping(uint256 => uint256)) private unitsOwned;
    mapping(address => mapping(uint256 => bool)) private upgradesOwned;

    // Upgrades (Increase unit's production / attack etc.)
    mapping(address => mapping(uint256 => uint256)) private unitGooProductionIncreases; // Adds to the goo per second
    mapping(address => mapping(uint256 => uint256)) private unitGooProductionMultiplier; // Multiplies the goo per second
    mapping(address => mapping(uint256 => uint256)) private unitAttackIncreases;
    mapping(address => mapping(uint256 => uint256)) private unitAttackMultiplier;
    mapping(address => mapping(uint256 => uint256)) private unitDefenseIncreases;
    mapping(address => mapping(uint256 => uint256)) private unitDefenseMultiplier;
    mapping(address => mapping(uint256 => uint256)) private unitGooStealingIncreases;
    mapping(address => mapping(uint256 => uint256)) private unitGooStealingMultiplier;
    mapping(address => mapping(uint256 => uint256)) private unitCostReduction;

    event PlayerAttacked(address attacker, address target, bool success, uint256 gooStolen);
    event RefDeposit(address player, address referer, uint256 amount);
    event TalentPurchase(address player, uint256 class, uint256 unitId);

    modifier SnapshotCheck {
        if (now >= nextSnapshotTime && nextSnapshotTime != 0){
            snapshotDailyGooResearchFunding();
        }
        if (now >= nextGooDepositSnapshotTime && nextGooDepositSnapshotTime != 0){
            snapshotDailyGooDepositFunding();
        }
        _;
    }

    function() payable external {}

    constructor() public {
        blast.configureClaimableYield();
        blast.configureClaimableGas();
    }

    function beginGame(uint256 firstDivsTime) external {
        require(msg.sender == owner);
        require(startTime == 0);
        startTime = now;
        nextSnapshotTime = firstDivsTime;
        nextGooDepositSnapshotTime = firstDivsTime + 12 hours;
        totalGooDepositSnapshots.push(0); // Add initial-zero snapshot
    }

    function balanceOf(address player) public view returns(uint256) {
        return gooBalance[player] + balanceOfUnclaimedGoo(player);
    }

    function balanceOfUnclaimedGoo(address player) internal view returns (uint256) {
        uint256 lastSave = lastGooSaveTime[player];
        if (lastSave > 0 && lastSave < now) {
            return (getGooProduction(player) * (now - lastSave)) / 100;
        }
        return 0;
    }

    function getGooProduction(address player) public view returns (uint256){
        return gooProductionSnapshots[player][lastGooProductionUpdate[player]];
    }

    function updatePlayersGoo(address player) public {
        uint256 gooGain = balanceOfUnclaimedGoo(player);
        lastGooSaveTime[player] = now;
        gooBalance[player] += gooGain;
    }

    function updatePlayersGooFromPurchase(address player, uint256 purchaseCost) internal {
        uint256 unclaimedGoo = balanceOfUnclaimedGoo(player);

        if (purchaseCost > unclaimedGoo) {
            uint256 gooDecrease = purchaseCost - unclaimedGoo;
            require(gooBalance[player] >= gooDecrease);
            gooBalance[player] -= gooDecrease;
        } else {
            uint256 gooGain = unclaimedGoo - purchaseCost;
            gooBalance[player] += gooGain;
        }

        lastGooSaveTime[player] = now;
    }

    function increasePlayersGooProduction(address player, uint256 increase) internal {
        gooProductionSnapshots[player][allocatedGooResearchSnapshots.length] = getGooProduction(player) + increase;
        lastGooProductionUpdate[player] = allocatedGooResearchSnapshots.length;
        totalGooProduction += increase;
    }

    function reducePlayersGooProduction(address player, uint256 decrease) internal {
        uint256 previousProduction = getGooProduction(player);
        uint256 newProduction = previousProduction.sub(decrease);

        if (newProduction == 0) { // Special case which tangles with "inactive day" snapshots (claiming divs)
            gooProductionZeroedSnapshots[player][allocatedGooResearchSnapshots.length] = true;
            delete gooProductionSnapshots[player][allocatedGooResearchSnapshots.length]; // 0
        } else {
            gooProductionSnapshots[player][allocatedGooResearchSnapshots.length] = newProduction;
        }

        lastGooProductionUpdate[player] = allocatedGooResearchSnapshots.length;
        totalGooProduction -= decrease;
    }

    function addEth() external payable {
        totalEthResearchPool += msg.value;
    }

    function claimBlastYield() external {
        totalEthResearchPool += blast.claimAllYield(address(this), address(this));
    }

    function claimGasYield(bool claimAll) external {
        require(msg.sender == owner);
        uint256 gas;
        if (claimAll) {
            gas = blast.claimAllGas(address(this), address(this));
        } else {
            gas = blast.claimMaxGas(address(this), address(this));
        }
        platformGas += (gas * 5) / 100; // 5% gas saved for platform
        totalEthResearchPool += (gas * 95) / 100;
    }

    function pullGas(address payable recipient) external  {
        require(msg.sender == owner);
        recipient.transfer(platformGas);
        delete platformGas;
    }

    function recoverToken(address erc20, uint256 amount) external  {
        require(msg.sender == owner); // Just incase someone accidently sends random token here
        ERC20(erc20).transfer(owner, amount);
    }

    function withdrawEth() external SnapshotCheck {
        claimResearchDividends();
        claimGooDepositDividends();
    }

    function fundGooResearch(uint256 amount) external SnapshotCheck {
        updatePlayersGooFromPurchase(msg.sender, amount);
        address ref = playersRef[msg.sender];
        if (ref != address(0)) {
            uint256 refPercent = amount * 5 / 100;
            gooDepositSnapshots[ref][totalGooDepositSnapshots.length - 1] += refPercent;
            totalGooDepositSnapshots[totalGooDepositSnapshots.length - 1] += (amount + refPercent);
            emit RefDeposit(msg.sender, ref, refPercent);
        } else {
            totalGooDepositSnapshots[totalGooDepositSnapshots.length - 1] += amount;
        }
        gooDepositSnapshots[msg.sender][totalGooDepositSnapshots.length - 1] += amount;
    }

    function claimResearchDividends() public SnapshotCheck {
        uint256 startSnapshot = lastGooResearchFundClaim[msg.sender];
        uint256 endSnapShot = allocatedGooResearchSnapshots.length - 1;

        uint256 researchShare;
        uint256 previousProduction;
        if (startSnapshot > 0) {
            previousProduction = gooProductionSnapshots[msg.sender][startSnapshot - 1];
        }

        for (uint256 i = startSnapshot; i <= endSnapShot; i++) {

            // Slightly complex things by accounting for days/snapshots when user made no tx's
            uint256 productionDuringSnapshot = gooProductionSnapshots[msg.sender][i];
            bool soldAllProduction = gooProductionZeroedSnapshots[msg.sender][i];
            if (productionDuringSnapshot == 0 && !soldAllProduction) {
                productionDuringSnapshot = previousProduction;
            } else {
               previousProduction = productionDuringSnapshot;
            }

            uint256 totalProduction = totalGooProductionSnapshots[i];
            if (totalProduction > 0) {
                researchShare += (allocatedGooResearchSnapshots[i] * productionDuringSnapshot) / totalProduction;
            }
        }


        if (gooProductionSnapshots[msg.sender][endSnapShot] == 0 && !gooProductionZeroedSnapshots[msg.sender][endSnapShot] && previousProduction > 0) {
            gooProductionSnapshots[msg.sender][endSnapShot] = previousProduction; // Checkpoint for next claim
        }

        lastGooResearchFundClaim[msg.sender] = endSnapShot + 1;
        msg.sender.transfer(researchShare);
    }


    function claimGooDepositDividends() public SnapshotCheck {
        uint256 startSnapshot = lastGooDepositFundClaim[msg.sender];
        uint256 endSnapShot = allocatedGooDepositSnapshots.length - 1;

        uint256 depositShare;
        if (allocatedGooDepositSnapshots.length > 0) {
            for (uint256 i = startSnapshot; i <= endSnapShot; i++) {
                uint256 totalDeposited = totalGooDepositSnapshots[i];
                if (totalDeposited > 0) {
                    depositShare += (allocatedGooDepositSnapshots[i] * gooDepositSnapshots[msg.sender][i]) / totalDeposited;
                }
            }
        }

        lastGooDepositFundClaim[msg.sender] = endSnapShot + 1;
        msg.sender.transfer(depositShare);
    }


    // Allocate pot #1 divs for the day
    function snapshotDailyGooResearchFunding() public {
        require(now >= nextSnapshotTime);

        uint256 todaysGooResearchFund = (totalEthResearchPool * researchDivPercent) / 100; // 4% of pool daily
        totalEthResearchPool -= todaysGooResearchFund;

        totalGooProductionSnapshots.push(totalGooProduction);
        allocatedGooResearchSnapshots.push(todaysGooResearchFund);
        nextSnapshotTime = now + 24 hours;
    }

    // Allocate pot #2 divs for the day
    function snapshotDailyGooDepositFunding() public {
        require(now >= nextGooDepositSnapshotTime);

        uint256 todaysGooDepositFund = (totalEthResearchPool * gooDepositDivPercent) / 100; // 1% of pool daily
        totalEthResearchPool -= todaysGooDepositFund;

        totalGooDepositSnapshots.push(0); // Reset for to store next day's deposits
        allocatedGooDepositSnapshots.push(todaysGooDepositFund); // Store to payout divs for previous day deposits
        nextGooDepositSnapshotTime = now + 24 hours;
    }


    function getUnitsProduction(address player, uint256 unitId, uint256 amount) internal view returns (uint256) {
        return (amount * (unitInfo[unitId].baseGooProduction + unitGooProductionIncreases[player][unitId]) * (10 + unitGooProductionMultiplier[player][unitId]));
    }

    function getUnitsAttack(address player, uint256 unitId, uint256 amount) internal view returns (uint256) {
        return (amount * (unitInfo[unitId].attackValue + unitAttackIncreases[player][unitId]) * (10 + unitAttackMultiplier[player][unitId])) / 10;
    }

    function getUnitsDefense(address player, uint256 unitId, uint256 amount) internal view returns (uint256) {
        return (amount * (unitInfo[unitId].defenseValue + unitDefenseIncreases[player][unitId]) * (10 + unitDefenseMultiplier[player][unitId])) / 10;
    }

    function getUnitsStealingCapacity(address player, uint256 unitId, uint256 amount) internal view returns (uint256) {
        return (amount * (unitInfo[unitId].gooStealingCapacity + unitGooStealingIncreases[player][unitId]) * (10 + unitGooStealingMultiplier[player][unitId])) / 10;
    }












    ////////////////////////// GOO 2 ///////////////////////////

    mapping(uint256 => Unit) private unitInfo;
    mapping(uint256 => Upgrade) private upgradeInfo;
    mapping(uint256 => mapping(uint256 => uint256)) private talentUpgradeValues;

    mapping(address => UserLevel) public playerLevel;
    mapping(address => uint256) public lastBattleChargeTime;
    mapping(address => bool) public gooContract;

    uint256 constant public maxBattleCharges = 4;
    uint256 constant public battleChargeRechargeTime = 6 hours;
    uint256 constant public talentGooDuration = 12 hours;
    uint256 public stealingMultiplier = 1; // 1 goo per steal
    uint256 public defenseGooProtection = 1000; // 1k goo per def

    uint256 public numUpgrades;
    uint256 public numProdUnits;
    uint256 public numArmyUnits;
    uint256 public numTalents;

    struct UserLevel {
        uint48 level;
        uint48 spentPoints;
        uint160 experience;
    }

    struct Unit {
        uint256 unitId;
        uint256 baseGooCost;
        uint256 gooCostIncreaseHalf; // Halfed to make maths slightly less (cancels a 2 out)
        uint256 baseGooProduction;
        address payable farmAddress;

        uint256 attackValue;
        uint256 defenseValue;
        uint256 gooStealingCapacity;
        uint256 levelRequirement;
    }

    struct Upgrade {
        uint256 upgradeId;
        uint256 gooCost;
        uint256 upgradeClass;
        uint256 unitId;
        uint256 upgradeValue;
        uint256 prerequisiteUpgrade;
    }

    function setGooContract(address gameContract, bool isGoo) external {
        require(msg.sender == owner);
        gooContract[gameContract] = isGoo;
    }

    function updateStealingMultiplier(uint256 newStealingMultiplier) external {
        require(msg.sender == owner);
        stealingMultiplier = newStealingMultiplier;
    }

    function updateDefenseGooProtection(uint256 newDefenseGooProtection) external {
        require(msg.sender == owner);
        defenseGooProtection = newDefenseGooProtection;
    }

    function addUpgrade(uint256 id, uint256 goo, uint256 class, uint256 unit, uint256 value, uint256 prereq) external {
        require(msg.sender == owner);
        if (upgradeInfo[id].upgradeId == 0) {
            numUpgrades++;
        }
        upgradeInfo[id] = Upgrade(id, goo, class, unit, value, prereq);
    }

    function addUnit(uint256 id, uint256 goo, uint256 gooIncreaseHalf, address payable farmToken, uint256 production, uint256 attack, uint256 defense, uint256 stealing, uint256 levelRequirement) external {
        require(msg.sender == owner);
        require(unitInfo[id].farmAddress == address(0));
        if (unitInfo[id].unitId == 0) {
            if (production > 0) {
                numProdUnits++;
            } else {
                numArmyUnits++;
            }
        }
        unitInfo[id] = Unit(id, goo, gooIncreaseHalf, production, farmToken, attack, defense, stealing, levelRequirement);
    }

    function addTalent(uint256 talentClass, uint256 unitId, uint256 value) external {
        require(msg.sender == owner);
        if (talentUpgradeValues[talentClass][unitId] == 0) {
            numTalents++;
        }
        talentUpgradeValues[talentClass][unitId] = value;
    }

    function creditUnitExternal(address player, uint256 unitId) external {
        require(gooContract[msg.sender]);
        Unit memory unit = unitInfo[unitId];
        require(unit.unitId > 0); // Valid unit

        if (unit.baseGooProduction > 0) {
            updatePlayersGoo(player);
            uint256 production = (unit.baseGooProduction + unitGooProductionIncreases[player][unitId]) * (10 + unitGooProductionMultiplier[player][unitId]);
            increasePlayersGooProduction(player, production);
        }
        unitsOwned[player][unitId]++;
    }

    function creditGooExternal(address player, uint256 gooGain) external {
        require(gooContract[msg.sender]); // Item Shop contract
        gooBalance[player] += gooGain;
    }

    function updatePlayersGooFromPurchaseExternal(address player, uint256 purchaseCost) external {
        require(gooContract[msg.sender]);
        updatePlayersGooFromPurchase(player, purchaseCost);
    }

    function upgradeUnitMultipliersExternal(address player, uint256 upgradeClass, uint256 unitId, uint256 upgradeValue) external {
        require(gooContract[msg.sender]);
        upgradeUnitMultipliers(player, upgradeClass, unitId, upgradeValue);
    }

    function upgradeUnitMultipliers(address player, uint256 upgradeClass, uint256 unitId, uint256 upgradeValue) internal {
        uint256 productionGain;
        if (upgradeClass == 0) {
            unitGooProductionIncreases[player][unitId] += upgradeValue;
            productionGain = unitsOwned[player][unitId] * upgradeValue * (10 + unitGooProductionMultiplier[player][unitId]);
            increasePlayersGooProduction(player, productionGain);
        } else if (upgradeClass == 1) {
            Unit memory unit = unitInfo[unitId];
            unitGooProductionMultiplier[player][unitId] += upgradeValue;
            productionGain = unitsOwned[player][unitId] * upgradeValue * (unit.baseGooProduction + unitGooProductionIncreases[player][unitId]);
            increasePlayersGooProduction(player, productionGain);
        } else if (upgradeClass == 2) {
            unitAttackIncreases[player][unitId] += upgradeValue;
        } else if (upgradeClass == 3) {
            unitAttackMultiplier[player][unitId] += upgradeValue;
        } else if (upgradeClass == 4) {
            unitDefenseIncreases[player][unitId] += upgradeValue;
        } else if (upgradeClass == 5) {
            unitDefenseMultiplier[player][unitId] += upgradeValue;
        } else if (upgradeClass == 6) {
            unitGooStealingIncreases[player][unitId] += upgradeValue;
        } else if (upgradeClass == 7) {
            unitGooStealingMultiplier[player][unitId] += upgradeValue;
        } else if (upgradeClass == 9) {
            unitCostReduction[player][unitId] += upgradeValue; // Unit cost reduction
        }
    }

    function removeUnitMultipliersExternal(address player, uint256 upgradeClass, uint256 unitId, uint256 upgradeValue) external {
        require(gooContract[msg.sender]);
        removeUnitMultipliers(player, upgradeClass, unitId, upgradeValue);
    }

    function removeUnitMultipliers(address player, uint256 upgradeClass, uint256 unitId, uint256 upgradeValue) internal {
        uint256 productionLoss;
        if (upgradeClass == 0) {
            unitGooProductionIncreases[player][unitId] -= upgradeValue;
            productionLoss = unitsOwned[player][unitId] * upgradeValue * (10 + unitGooProductionMultiplier[player][unitId]);
            reducePlayersGooProduction(player, productionLoss);
        } else if (upgradeClass == 1) {
            Unit memory unit = unitInfo[unitId];
            unitGooProductionMultiplier[player][unitId] -= upgradeValue;
            productionLoss = unitsOwned[player][unitId] * upgradeValue * (unit.baseGooProduction + unitGooProductionIncreases[player][unitId]);
            reducePlayersGooProduction(player, productionLoss);
        } else if (upgradeClass == 2) {
            unitAttackIncreases[player][unitId] -= upgradeValue;
        } else if (upgradeClass == 3) {
            unitAttackMultiplier[player][unitId] -= upgradeValue;
        } else if (upgradeClass == 4) {
            unitDefenseIncreases[player][unitId] -= upgradeValue;
        } else if (upgradeClass == 5) {
            unitDefenseMultiplier[player][unitId] -= upgradeValue;
        } else if (upgradeClass == 6) {
            unitGooStealingIncreases[player][unitId] -= upgradeValue;
        } else if (upgradeClass == 7) {
            unitGooStealingMultiplier[player][unitId] -= upgradeValue;
        } else if (upgradeClass == 9) {
            unitCostReduction[player][unitId] -= upgradeValue; // Unit cost reduction
        }
    }

    function getGooCostForUnit(uint256 unitId, uint256 existing, uint256 amount, uint256 discount) internal view returns (uint256 totalCost) {
        Unit storage unit = unitInfo[unitId];
        if (amount == 1) { // 1
            if (existing == 0) {
                totalCost = unit.baseGooCost;
            } else {
                totalCost = unit.baseGooCost + (existing * unit.gooCostIncreaseHalf * 2);
            }
        } else if (amount > 1) {
            uint256 existingCost;
            if (existing > 0) { // Gated by unit limit
                existingCost = (unit.baseGooCost * existing) + (existing * (existing - 1) * unit.gooCostIncreaseHalf);
            }

            existing = existing.add(amount);
            totalCost = unit.baseGooCost.mul(existing).add(existing.mul(existing - 1).mul(unit.gooCostIncreaseHalf)) - existingCost;
        }

        if (discount > 0 && discount < 100) {
            totalCost = (totalCost * (100 - discount)) / 100;
        }
    }

    function daysSinceEpoch() public view returns(uint256) {
        return (now / 86400);
    }

    // To display on website
    function getGameInfo() external view returns (uint256[13] memory data) {
        UserLevel memory player = playerLevel[msg.sender];
        uint256 snapshotsLength = totalGooDepositSnapshots.length - 1;

        data[0] = now;
        data[1] = totalEthResearchPool;
        data[2] = totalGooProduction;
        data[3] = totalGooDepositSnapshots[snapshotsLength];
        data[4] = gooDepositSnapshots[msg.sender][snapshotsLength];
        data[5] = nextSnapshotTime;
        data[6] = balanceOf(msg.sender);
        data[7] = player.level;
        data[8] = player.spentPoints;
        data[9] = player.experience;
        data[10] = getGooProduction(msg.sender);
        data[11] = nextGooDepositSnapshotTime;
        data[12] = stealingMultiplier;
    }

    function getUnitsOwned(uint256[] calldata ids) external view returns (uint256[] memory) {
        uint256[] memory units = new uint256[](ids.length);

        for (uint256 i = 0; i < ids.length; i++) {
            units[i] = unitsOwned[msg.sender][ids[i]];
        }

        return units;
    }

    function getUpgradesOwned(uint256[] calldata ids) external view returns (bool[] memory) {
        bool[] memory upgrades = new bool[](ids.length);

        for (uint256 i = 0; i < ids.length; i++) {
            upgrades[i] = upgradesOwned[msg.sender][ids[i]];
        }

        return upgrades;
    }

    function getUpgradeValues(uint256[] calldata ids) external view returns (uint256[9][] memory) {
        uint256[9][] memory upgradeValues = new uint256[9][](ids.length);

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 unitId = ids[i];
            upgradeValues[i][0] = unitGooProductionIncreases[msg.sender][unitId];
            upgradeValues[i][1] = unitGooProductionMultiplier[msg.sender][unitId];
            upgradeValues[i][2] = unitAttackIncreases[msg.sender][unitId];
            upgradeValues[i][3] = unitAttackMultiplier[msg.sender][unitId];
            upgradeValues[i][4] = unitDefenseIncreases[msg.sender][unitId];
            upgradeValues[i][5] = unitDefenseMultiplier[msg.sender][unitId];
            upgradeValues[i][6] = unitGooStealingIncreases[msg.sender][unitId];
            upgradeValues[i][7] = unitGooStealingMultiplier[msg.sender][unitId];
            upgradeValues[i][8] = unitCostReduction[msg.sender][unitId];
        }

        return upgradeValues;
    }

    function numPlayers() external view returns (uint256) {
        return players.length;
    }

    function getPlayersInfo(uint256 start, uint256 amount) external view returns (address[] memory, uint256[5][] memory, uint256) {
        uint256 toFetch = amount;
        uint256 totalPlayers = players.length;
        if (players.length < toFetch) {
            toFetch = totalPlayers;
        }

        address[] memory users = new address[](toFetch);
        uint256[5][] memory stats = new uint256[5][](toFetch);

        uint256 index = start;
        for (uint256 i = 0; i < toFetch; i++) {
            if (index >= totalPlayers) {
                index = index - totalPlayers;
            }

            address player = players[index];
            users[i] = player;
            stats[i][0] = balanceOf(player);
            stats[i][1] = getGooProduction(player);
            (stats[i][2], stats[i][3], stats[i][4]) = getPlayersBattlePower(player);
            index++;
        }

        return (users, stats, index);
    }

    function getDailyXP() view external returns (uint256, uint256, uint256) {
        return (daysSinceEpoch(), lastUnitBoughtEpoch[msg.sender], lastUpgradeBoughtEpoch[msg.sender]);
    }

    function getReferals() view external returns (address[] memory) {
        return playersReferals[msg.sender];
    }

    function viewUnclaimedDividends() external view returns (uint256, uint256) {
        uint256 startSnapshot = lastGooResearchFundClaim[msg.sender];
        uint256 latestSnapshot;

        uint256 researchShare;
        uint256 previousProduction;

        if (startSnapshot > 0) {
            previousProduction = gooProductionSnapshots[msg.sender][startSnapshot - 1];
        }

        if (allocatedGooResearchSnapshots.length > 0) {
            latestSnapshot = allocatedGooResearchSnapshots.length - 1;
            for (uint256 i = startSnapshot; i <= latestSnapshot; i++) {
                // Slightly complex things by accounting for days/snapshots when user made no tx's
                uint256 productionDuringSnapshot = gooProductionSnapshots[msg.sender][i];
                bool soldAllProduction = gooProductionZeroedSnapshots[msg.sender][i];
                if (productionDuringSnapshot == 0 && !soldAllProduction) {
                    productionDuringSnapshot = previousProduction;
                } else {
                   previousProduction = productionDuringSnapshot;
                }

                uint256 totalProduction = totalGooProductionSnapshots[i];
                if (totalProduction > 0) {
                    researchShare += (allocatedGooResearchSnapshots[i] * productionDuringSnapshot) / totalProduction;
                }
            }
        }

        uint256 depositShare;
        if (allocatedGooDepositSnapshots.length > 0) {
            latestSnapshot = allocatedGooDepositSnapshots.length - 1;
            for (uint256 j = lastGooDepositFundClaim[msg.sender]; j <= latestSnapshot; j++) {
                uint256 totalDeposits = totalGooDepositSnapshots[j];
                if (totalDeposits > 0) {
                    depositShare += (allocatedGooDepositSnapshots[j] * gooDepositSnapshots[msg.sender][j]) / totalDeposits;
                }
            }
        }

        return (researchShare, depositShare);
    }

    function buyFarmUnit(uint256 unitId, uint256 amount, address referer) external payable SnapshotCheck {
        Unit memory unit = unitInfo[unitId];
        require(unit.farmAddress != address(0));

        if (getGooProduction(msg.sender) == 0) {
            if (referer != msg.sender && referer != address(0)) { 
                playersRef[msg.sender] = referer;
                playersReferals[referer].push(msg.sender);
            }
            lastUnitBoughtEpoch[msg.sender] = daysSinceEpoch();
            giveExp(msg.sender, 40);
            players.push(msg.sender);
        } else {
            uint256 daysSince = daysSinceEpoch();
            if (lastUnitBoughtEpoch[msg.sender] < daysSince) {
                lastUnitBoughtEpoch[msg.sender] = daysSince;
                giveExp(msg.sender, 40);
            }
        }
        
        GooFarm farm = GooFarm(unit.farmAddress);
        if (farm.farmToken() == address(0)) {
            require(msg.value == amount * (10 ** 16)); // 1 eth = 100 units
            farm.stake.value(msg.value)(msg.sender);
        } else {
            TokenGooFarm(unit.farmAddress).stake(msg.sender, amount);
        }

        updatePlayersGoo(msg.sender);
        if (unit.baseGooProduction > 0) {
            increasePlayersGooProduction(msg.sender, (unit.baseGooProduction + unitGooProductionIncreases[msg.sender][unitId]) * (10 + unitGooProductionMultiplier[msg.sender][unitId]).mul(amount));
        }
        unitsOwned[msg.sender][unitId] = unitsOwned[msg.sender][unitId] + amount;
    }

    function sellFarmUnit(uint256 unitId, uint256 amount) external SnapshotCheck {
        Unit memory unit = unitInfo[unitId];
        require(unit.farmAddress != address(0));

        GooFarm farm = GooFarm(unit.farmAddress);
        if (farm.farmToken() == address(0)) {
            farm.unstake(msg.sender, amount * (10 ** 16)); // 1 eth = 100 units
        } else {
            TokenGooFarm(unit.farmAddress).unstake(msg.sender, amount);
        }

        updatePlayersGoo(msg.sender);
        if (unit.baseGooProduction > 0) {
            reducePlayersGooProduction(msg.sender, (unit.baseGooProduction + unitGooProductionIncreases[msg.sender][unitId]) * (10 + unitGooProductionMultiplier[msg.sender][unitId]).mul(amount));
        }
        unitsOwned[msg.sender][unitId] = unitsOwned[msg.sender][unitId].sub(amount);
    }

    function buyUnit(uint256 unitId, uint256 amount) external SnapshotCheck {
        Unit memory unit = unitInfo[unitId];
        address player = msg.sender;
        require(unit.unitId > 0); // Valid unit
        require(playerLevel[msg.sender].level >= unit.levelRequirement);
        require(unit.farmAddress == address(0));

        if (getGooProduction(player) == 0) {
            players.push(player);
        }

        uint256 existing = unitsOwned[player][unitId];
        uint256 newTotal = existing.add(amount);

        updatePlayersGooFromPurchase(player, getGooCostForUnit(unitId, existing, amount, unitCostReduction[player][unitId]));

        if (unit.baseGooProduction > 0) {
            increasePlayersGooProduction(player, (unit.baseGooProduction + unitGooProductionIncreases[player][unitId]) * (10 + unitGooProductionMultiplier[player][unitId]).mul(amount));
        }
        unitsOwned[player][unitId] = newTotal;

        uint256 daysSince = daysSinceEpoch();
        if (lastUnitBoughtEpoch[msg.sender] < daysSince) {
            lastUnitBoughtEpoch[msg.sender] = daysSince;
            giveExp(msg.sender, 40);
        }
    }

    function buyUpgrade(uint256 upgradeId) external SnapshotCheck {
        Upgrade memory upgrade = upgradeInfo[upgradeId];
        address player = msg.sender;
        require(upgrade.upgradeId > 0); // Valid upgrade
        require(!upgradesOwned[player][upgradeId]); // Haven't already purchased

        if (upgrade.prerequisiteUpgrade > 0) {
            require(upgradesOwned[player][upgrade.prerequisiteUpgrade]);
        }

        uint256 daysSince = daysSinceEpoch();
        if (lastUpgradeBoughtEpoch[msg.sender] < daysSince) {
            lastUpgradeBoughtEpoch[msg.sender] = daysSince;
            giveExp(msg.sender, 40);
        }

        // Update players goo
        updatePlayersGooFromPurchase(player, upgrade.gooCost);

        upgradeUnitMultipliers(player, upgrade.upgradeClass, upgrade.unitId, upgrade.upgradeValue);
        upgradesOwned[player][upgradeId] = true;
    }


    function getBattleChargeTime() external view returns (uint256, uint256, uint256, uint256) {
        uint256 attackingPower;
        uint256 defendingPower;
        uint256 stealingPower;

        for (uint256 i = 0; i < numArmyUnits; i++) {
            uint256 unitId = i + 101; // Starts at 101
            uint256 owned = unitsOwned[msg.sender][unitId];
            attackingPower += getUnitsAttack(msg.sender, unitId, owned);
            defendingPower += getUnitsDefense(msg.sender, unitId, owned);
            stealingPower += getUnitsStealingCapacity(msg.sender, unitId, owned);
        }

        uint256 playerbattleChargeTime = lastBattleChargeTime[msg.sender];
        if (playerbattleChargeTime == 0) {
            playerbattleChargeTime = startTime - 12 hours + 5;
        }

        return (playerbattleChargeTime, attackingPower, defendingPower, stealingPower);
    }

    function getPlayersBattlePower(address player) public view returns (uint256, uint256, uint256) {
        uint256 attackingPower;
        uint256 defendingPower;
        uint256 stealingPower;

        for (uint256 i = 0; i < numArmyUnits; i++) {
            uint256 unitId = i + 101; // Starts at 101
            uint256 owned = unitsOwned[player][unitId];
            attackingPower += getUnitsAttack(player, unitId, owned);
            defendingPower += getUnitsDefense(player, unitId, owned);
            stealingPower += getUnitsStealingCapacity(player, unitId, owned);
        }

        return (attackingPower, defendingPower, stealingPower);
    }

    function getPlayersBattlePower(address attacker, address defender) internal view returns (uint256, uint256, uint256) {
        uint256 attackingPower;
        uint256 defendingPower;
        uint256 stealingPower;

        for (uint256 i = 0; i < numArmyUnits; i++) {
            uint256 unitId = i + 101; // Starts at 101
            uint256 owned = unitsOwned[attacker][unitId];
            attackingPower += getUnitsAttack(attacker, unitId, owned);
            stealingPower += getUnitsStealingCapacity(attacker, unitId, owned);

            defendingPower += getUnitsDefense(defender, unitId, unitsOwned[defender][unitId]);
        }

        return (attackingPower, defendingPower, stealingPower);
    }

    function attackPlayer(address target) external {
        require(target != msg.sender);
        require(tx.origin == msg.sender);

        (uint256 attackingPower, uint256 defendersPower, uint256 stealingPower) = getPlayersBattlePower(msg.sender, target);
        uint256 targetsGoo = balanceOf(target);
        bool attackWon = attackingPower > defendersPower;

        uint256 playerbattleChargeTime = lastBattleChargeTime[msg.sender];
        if (playerbattleChargeTime == 0) {
            playerbattleChargeTime = startTime - 12 hours + 5;
        }

        uint256 battleCharges = (now - playerbattleChargeTime) / battleChargeRechargeTime;
        require(battleCharges > 0);

        uint256 gooStolen;
        if (attackWon) {
            uint256 stealable;
            uint256 gooProtected = defendersPower * defenseGooProtection;
            if (targetsGoo > gooProtected) {
                stealable = targetsGoo - gooProtected;
            }

            stealingPower = stealingPower * stealingMultiplier;
            if (stealable > stealingPower) {
                gooStolen = stealingPower;
            } else {
                gooStolen = stealable;
            }

            if (gooStolen > 0) {
                // Save all their unclaimed goo, then steal attacker's max capacity (at same time)
                uint256 unclaimedGoo = balanceOfUnclaimedGoo(target);
                if (gooStolen > unclaimedGoo) {
                    gooBalance[target] -= (gooStolen - unclaimedGoo);
                } else {
                    gooBalance[target] += (unclaimedGoo - gooStolen);
                }
                lastGooSaveTime[target] = now;
                gooBalance[msg.sender] += gooStolen;
            }
            giveExp(msg.sender, 40);
        } else {
            giveExp(msg.sender, 20);
        }

        uint256 newBattleChargeTime = playerbattleChargeTime + battleChargeRechargeTime - 6;
        if (battleCharges >= maxBattleCharges) {
            newBattleChargeTime = now - ((maxBattleCharges - 1) * battleChargeRechargeTime) - 6;
        }
        lastBattleChargeTime[msg.sender] = newBattleChargeTime;
        emit PlayerAttacked(msg.sender, target, attackWon, gooStolen);
    }

    function giveExp(address player, uint160 amount) internal {
        UserLevel memory existingExp = playerLevel[player];
        uint160 expRequirement = (existingExp.level + 1) * 80; // Lvl 1: 80; Lvl 2: 160, Lvl 3: 240 (480 in total) etc.
        if (existingExp.experience + amount >= expRequirement) {
            existingExp.experience = (existingExp.experience + amount) - expRequirement;
            existingExp.level++;
            playerLevel[player] = existingExp;
        } else {
            playerLevel[player].experience += amount;
        }
    }

    function spendTalentPoint(uint256 talentClass, uint256 unitId) external {
        UserLevel memory user = playerLevel[msg.sender];
        Unit memory unit = unitInfo[unitId];
        require(user.spentPoints < user.level);

        if (talentClass < 8) {
            require(unit.unitId > 0);
            upgradeUnitMultipliers(msg.sender, talentClass, unitId, talentUpgradeValues[talentClass][unitId]);
        } else if (talentClass == 8) {
            lastBattleChargeTime[msg.sender] = now - (maxBattleCharges * battleChargeRechargeTime) - 6; // Replenish battle charges
        } else {
            gooBalance[msg.sender] += (getGooProduction(msg.sender) / 100) * talentGooDuration; // 12 hours of free goo
        }
        playerLevel[msg.sender].spentPoints++;
        emit TalentPurchase(msg.sender, talentClass, unitId);
    }

}


interface TokenGooFarm {
    function stake(address player, uint256 amount) external;
    function unstake(address payable player, uint256 amount) external;
}


interface Blast {
    function configureClaimableYield() external;
    function configureClaimableGas() external;
    function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256);
    function claimMaxGas(address contractAddress, address recipient) external returns (uint256);
    function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256);
    function readClaimableYield(address contractAddress) external view returns (uint256);
}


interface ERC20 {
	function totalSupply() external view returns (uint256);
	function balanceOf(address who) external view returns (uint256);
	function allowance(address owner, address spender) external view returns (uint256);
	function transfer(address to, uint256 value) external returns (bool);
	function approve(address spender, uint256 value) external returns (bool);
	function approveAndCall(address spender, uint tokens, bytes calldata data) external returns (bool success);
	function transferFrom(address from, address to, uint256 value) external returns (bool);
	function burn(uint256 amount) external;
    function decimals() external view returns (uint8);

	event Transfer(address indexed from, address indexed to, uint256 value);
	event Approval(address indexed owner, address indexed spender, uint256 value);
}


library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    require(c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a / b;
    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a);
    return c;
  }

  function ceil(uint256 a, uint256 m) internal pure returns (uint256) {
    uint256 c = add(a,m);
    uint256 d = sub(c,1);
    return mul(div(d,m),m);
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"attacker","type":"address"},{"indexed":false,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"uint256","name":"gooStolen","type":"uint256"}],"name":"PlayerAttacked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"address","name":"referer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RefDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"player","type":"address"},{"indexed":false,"internalType":"uint256","name":"class","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"TalentPurchase","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[],"name":"addEth","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"talentClass","type":"uint256"},{"internalType":"uint256","name":"unitId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"addTalent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"goo","type":"uint256"},{"internalType":"uint256","name":"gooIncreaseHalf","type":"uint256"},{"internalType":"address payable","name":"farmToken","type":"address"},{"internalType":"uint256","name":"production","type":"uint256"},{"internalType":"uint256","name":"attack","type":"uint256"},{"internalType":"uint256","name":"defense","type":"uint256"},{"internalType":"uint256","name":"stealing","type":"uint256"},{"internalType":"uint256","name":"levelRequirement","type":"uint256"}],"name":"addUnit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"goo","type":"uint256"},{"internalType":"uint256","name":"class","type":"uint256"},{"internalType":"uint256","name":"unit","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"prereq","type":"uint256"}],"name":"addUpgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"attackPlayer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"battleChargeRechargeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"firstDivsTime","type":"uint256"}],"name":"beginGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"referer","type":"address"}],"name":"buyFarmUnit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyUnit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"upgradeId","type":"uint256"}],"name":"buyUpgrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimBlastYield","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"claimAll","type":"bool"}],"name":"claimGasYield","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimGooDepositDividends","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimResearchDividends","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"gooGain","type":"uint256"}],"name":"creditGooExternal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"creditUnitExternal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"daysSinceEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defenseGooProtection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"fundGooResearch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getBattleChargeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getDailyXP","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getGameInfo","outputs":[{"internalType":"uint256[13]","name":"data","type":"uint256[13]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"getGooProduction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"getPlayersBattlePower","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getPlayersInfo","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[5][]","name":"","type":"uint256[5][]"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReferals","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"getUnitsOwned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"getUpgradeValues","outputs":[{"internalType":"uint256[9][]","name":"","type":"uint256[9][]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"getUpgradesOwned","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"gooContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gooDepositDivPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastBattleChargeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastGooProductionUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxBattleCharges","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextGooDepositSnapshotTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextSnapshotTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numArmyUnits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numPlayers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numProdUnits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numTalents","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numUpgrades","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"platformGas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playerLevel","outputs":[{"internalType":"uint48","name":"level","type":"uint48"},{"internalType":"uint48","name":"spentPoints","type":"uint48"},{"internalType":"uint160","name":"experience","type":"uint160"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"players","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"playersRef","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"playersReferals","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"pullGas","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"erc20","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"upgradeClass","type":"uint256"},{"internalType":"uint256","name":"unitId","type":"uint256"},{"internalType":"uint256","name":"upgradeValue","type":"uint256"}],"name":"removeUnitMultipliersExternal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"researchDivPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"unitId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sellFarmUnit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"gameContract","type":"address"},{"internalType":"bool","name":"isGoo","type":"bool"}],"name":"setGooContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"snapshotDailyGooDepositFunding","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"snapshotDailyGooResearchFunding","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"talentClass","type":"uint256"},{"internalType":"uint256","name":"unitId","type":"uint256"}],"name":"spendTalentPoint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stealingMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"talentGooDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalEthResearchPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalGooProduction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newDefenseGooProtection","type":"uint256"}],"name":"updateDefenseGooProtection","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"player","type":"address"}],"name":"updatePlayersGoo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"purchaseCost","type":"uint256"}],"name":"updatePlayersGooFromPurchaseExternal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"newStealingMultiplier","type":"uint256"}],"name":"updateStealingMultiplier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"player","type":"address"},{"internalType":"uint256","name":"upgradeClass","type":"uint256"},{"internalType":"uint256","name":"unitId","type":"uint256"},{"internalType":"uint256","name":"upgradeValue","type":"uint256"}],"name":"upgradeUnitMultipliersExternal","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"viewUnclaimedDividends","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawEth","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052600180546001600160a01b031916331781556029556103e8602a553480156200002c57600080fd5b507343000000000000000000000000000000000000026001600160a01b031663f098767a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200007d57600080fd5b505af115801562000092573d6000803e3d6000fd5b505050507343000000000000000000000000000000000000026001600160a01b0316634e606c476040518163ffffffff1660e01b8152600401600060405180830381600087803b158015620000e657600080fd5b505af1158015620000fb573d6000803e3d6000fd5b5050505061489c806200010f6000396000f3fe6080604052600436106103fa5760003560e01c80638f6d10c811610213578063c084b7e811610123578063d8895f92116100ab578063df3d21941161007a578063df3d2194146110bc578063e73feea2146110d1578063f2f921e614611136578063f71d96cb1461114b578063fa56453314611175576103fa565b8063d8895f9214610f05578063da4db0aa14610f3b578063da7a4bf31461102a578063dd898e1b146110a7576103fa565b8063c8bbdf08116100f2578063c8bbdf0814610e19578063cb0f8d0e14610e4b578063cc4c90ad14610e84578063d3ac085214610eb7578063d466540f14610ecc576103fa565b8063c084b7e814610db4578063c1b42b3f14610de7578063c2ac3aff14610dfc578063c38f074114610e04576103fa565b8063a54ed22a116101a6578063b29a814011610175578063b29a814014610cd9578063b4674f4f14610d12578063b5967e1614610d27578063b6db0bb714610d5a578063b99700b214610d9f576103fa565b8063a54ed22a14610c5b578063a5a2cb1914610c85578063a89cdad914610caf578063adef408a14610cc4576103fa565b8063a0ef91df116101e2578063a0ef91df14610bc0578063a1e6fcdf14610bd5578063a21f74b814610bea578063a3ab9df314610c14576103fa565b80638f6d10c814610b3f57806393d7c6bf146104e957806397b2f55614610b725780639d7c8b6f14610b87576103fa565b80634a617fba1161030e57806370a08231116102a15780637eef9dba116102705780637eef9dba14610ab05780637ef58e7314610ac557806381bdc2d514610ada5780638743eb4f14610b155780638da5cb5b14610b2a576103fa565b806370a0823114610a2757806378e9792514610a5a5780637c5fa85314610a6f5780637ccebf6d14610a9b576103fa565b80635dc22cce116102dd5780635dc22cce1461096657806367f0eb04146109995780636f151dad146109c7578063709375d0146109f7576103fa565b80634a617fba146108945780634b8772c1146108a95780634e23816d146108d95780634f4bbbdf14610921576103fa565b806323c8eb96116103915780632f6ca47e116103605780632f6ca47e146107e75780633081fe3f1461082257806333e8c09f146108555780633743e60c1461086a5780633a60c8c71461087f576103fa565b806323c8eb96146106b157806325a7650a1461077e578063280b8764146107a85780632cc82f46146107d2576103fa565b80631746bd1b116103cd5780631746bd1b146105a857806319e9e5de146105f65780631b2398171461062957806320bf933614610662576103fa565b8063095f28b7146103fc5780630a540fbb146104e95780630dd72b8a1461051057806314c84f3a14610543575b005b34801561040857600080fd5b5061042c6004803603604081101561041f57600080fd5b508035906020013561118a565b604051808060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b8381101561047657818101518382015260200161045e565b505050509050018381038252858181518152602001915080516000925b818410156104d55760208085028401015160a080838360005b838110156104c45781810151838201526020016104ac565b505050509050019260010192610493565b925050509550505050505060405180910390f35b3480156104f557600080fd5b506104fe61137d565b60408051918252519081900360200190f35b34801561051c57600080fd5b506104fe6004803603602081101561053357600080fd5b50356001600160a01b0316611382565b34801561054f57600080fd5b506105766004803603602081101561056657600080fd5b50356001600160a01b0316611394565b6040805165ffffffffffff94851681529290931660208301526001600160a01b03168183015290519081900360600190f35b3480156105b457600080fd5b506105bd6113cc565b60405180826101a080838360005b838110156105e35781810151838201526020016105cb565b5050505090500191505060405180910390f35b34801561060257600080fd5b506104fe6004803603602081101561061957600080fd5b50356001600160a01b03166114eb565b34801561063557600080fd5b506103fa6004803603604081101561064c57600080fd5b506001600160a01b03813516906020013561151c565b34801561066e57600080fd5b506106956004803603602081101561068557600080fd5b50356001600160a01b0316611656565b604080516001600160a01b039092168252519081900360200190f35b3480156106bd57600080fd5b5061072e600480360360208110156106d457600080fd5b8101906020810181356401000000008111156106ef57600080fd5b82018360208201111561070157600080fd5b8035906020019184602083028401116401000000008311171561072357600080fd5b509092509050611671565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561076a578181015183820152602001610752565b505050509050019250505060405180910390f35b34801561078a57600080fd5b506103fa600480360360208110156107a157600080fd5b503561170a565b3480156107b457600080fd5b506103fa600480360360208110156107cb57600080fd5b5035611772565b3480156107de57600080fd5b506104fe61178e565b3480156107f357600080fd5b506103fa6004803603604081101561080a57600080fd5b506001600160a01b0381351690602001351515611794565b34801561082e57600080fd5b506104fe6004803603602081101561084557600080fd5b50356001600160a01b03166117d6565b34801561086157600080fd5b506104fe6117e8565b34801561087657600080fd5b506104fe6117f1565b34801561088b57600080fd5b506103fa6117f7565b3480156108a057600080fd5b506104fe61187b565b3480156108b557600080fd5b506103fa600480360360408110156108cc57600080fd5b5080359060200135611880565b3480156108e557600080fd5b506103fa600480360360c08110156108fc57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135611b52565b34801561092d57600080fd5b506103fa6004803603608081101561094457600080fd5b506001600160a01b038135169060208101359060408101359060600135611be8565b34801561097257600080fd5b506103fa6004803603602081101561098957600080fd5b50356001600160a01b0316611c16565b3480156109a557600080fd5b506109ae611e08565b6040805192835260208301919091528051918290030190f35b3480156109d357600080fd5b506103fa600480360360408110156109ea57600080fd5b5080359060200135611fb7565b348015610a0357600080fd5b506103fa60048036036040811015610a1a57600080fd5b50803590602001356122b0565b348015610a3357600080fd5b506104fe60048036036020811015610a4a57600080fd5b50356001600160a01b03166124c4565b348015610a6657600080fd5b506104fe6124f0565b348015610a7b57600080fd5b506103fa60048036036020811015610a9257600080fd5b503515156124f6565b348015610aa757600080fd5b506104fe612639565b348015610abc57600080fd5b506104fe61263f565b348015610ad157600080fd5b506104fe612645565b348015610ae657600080fd5b50610aef61264b565b604080519485526020850193909352838301919091526060830152519081900360800190f35b348015610b2157600080fd5b5061072e6126e4565b348015610b3657600080fd5b5061069561274f565b348015610b4b57600080fd5b50610b5461275e565b60408051938452602084019290925282820152519081900360600190f35b348015610b7e57600080fd5b506104fe612793565b348015610b9357600080fd5b5061069560048036036040811015610baa57600080fd5b506001600160a01b038135169060200135612799565b348015610bcc57600080fd5b506103fa6127ce565b348015610be157600080fd5b506103fa612820565b348015610bf657600080fd5b506103fa60048036036020811015610c0d57600080fd5b5035612a0b565b348015610c2057600080fd5b50610c4760048036036020811015610c3757600080fd5b50356001600160a01b0316612b79565b604080519115158252519081900360200190f35b348015610c6757600080fd5b506103fa60048036036020811015610c7e57600080fd5b5035612b8e565b348015610c9157600080fd5b506103fa60048036036020811015610ca857600080fd5b5035612baa565b348015610cbb57600080fd5b506104fe612d5b565b348015610cd057600080fd5b506104fe612d61565b348015610ce557600080fd5b506103fa60048036036040811015610cfc57600080fd5b506001600160a01b038135169060200135612d67565b348015610d1e57600080fd5b506104fe612dfe565b348015610d3357600080fd5b506103fa60048036036020811015610d4a57600080fd5b50356001600160a01b0316612e04565b348015610d6657600080fd5b506103fa60048036036080811015610d7d57600080fd5b506001600160a01b038135169060208101359060408101359060600135612e40565b348015610dab57600080fd5b506104fe612e68565b348015610dc057600080fd5b50610b5460048036036020811015610dd757600080fd5b50356001600160a01b0316612e6e565b348015610df357600080fd5b506104fe612eee565b6103fa612ef4565b348015610e1057600080fd5b506103fa612efe565b6103fa60048036036060811015610e2f57600080fd5b50803590602081013590604001356001600160a01b0316612f9d565b348015610e5757600080fd5b506103fa60048036036040811015610e6e57600080fd5b506001600160a01b0381351690602001356133b0565b348015610e9057600080fd5b506103fa60048036036020811015610ea757600080fd5b50356001600160a01b03166133ee565b348015610ec357600080fd5b506104fe613445565b348015610ed857600080fd5b506103fa60048036036040811015610eef57600080fd5b506001600160a01b03813516906020013561344b565b348015610f1157600080fd5b506103fa60048036036060811015610f2857600080fd5b5080359060208101359060400135613475565b348015610f4757600080fd5b50610fb860048036036020811015610f5e57600080fd5b810190602081018135640100000000811115610f7957600080fd5b820183602082011115610f8b57600080fd5b80359060200191846020830284011164010000000083111715610fad57600080fd5b5090925090506134d0565b60405180806020018281038252838181518152602001915080516000925b818410156110195760208085028401015161012080838360005b83811015611008578181015183820152602001610ff0565b505050509050019260010192610fd6565b925050509250505060405180910390f35b34801561103657600080fd5b5061072e6004803603602081101561104d57600080fd5b81019060208101813564010000000081111561106857600080fd5b82018360208201111561107a57600080fd5b8035906020019184602083028401116401000000008311171561109c57600080fd5b5090925090506137c9565b3480156110b357600080fd5b506104fe61386a565b3480156110c857600080fd5b506103fa613870565b3480156110dd57600080fd5b506103fa60048036036101208110156110f557600080fd5b508035906020810135906040810135906001600160a01b036060820135169060808101359060a08101359060c08101359060e081013590610100013561398d565b34801561114257600080fd5b506103fa613aab565b34801561115757600080fd5b506106956004803603602081101561116e57600080fd5b5035613b37565b34801561118157600080fd5b506104fe613b5e565b600f5460609081906000908490818110156111a3578091505b6060826040519080825280602002602001820160405280156111cf578160200160208202803883390190505b50905060608360405190808252806020026020018201604052801561120e57816020015b6111fb614760565b8152602001906001900390816111f35790505b5090508860005b8581101561136c5784821061122a5784820391505b6000600f838154811061123957fe5b9060005260206000200160009054906101000a90046001600160a01b031690508085838151811061126657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061128f816124c4565b84838151811061129b57fe5b60200260200101516000600581106112af57fe5b60200201526112bd816114eb565b8483815181106112c957fe5b60200260200101516001600581106112dd57fe5b60200201526112eb81612e6e565b8685815181106112f757fe5b602002602001015160026005811061130b57fe5b6020020187868151811061131b57fe5b602002602001015160036005811061132f57fe5b6020020188878151811061133f57fe5b602002602001015160046005811061135357fe5b6020020192909252919052525060019182019101611215565b509196509450925050509250925092565b600481565b60276020526000908152604090205481565b60266020526000908152604090205465ffffffffffff80821691600160301b810490911690600160601b90046001600160a01b031683565b6113d461477e565b6113dc61479d565b503360009081526026602090815260408083208151606081018352905465ffffffffffff8082168352600160301b82041682850152600160601b90046001600160a01b0316818301526005805442875260025494870194909452935491850191909152916000198201918290811061145057fe5b6000918252602080832090910154606086015233808352601282526040808420858552909252912054608085015260085460a085015261148f906124c4565b60c0840152815165ffffffffffff90811660e085015260208301511661010084015260408201516001600160a01b03166101208401526114ce336114eb565b610140840152505060095461016082015260295461018082015290565b6001600160a01b0381166000908152601160209081526040808320601583528184205484529091529020545b919050565b3360009081526028602052604090205460ff1661153857600080fd5b6115406147bd565b5060008181526023602090815260409182902082516101208101845281548082526001830154938201939093526002820154938101939093526003810154606084015260048101546001600160a01b03166080840152600581015460a0840152600681015460c0840152600781015460e0840152600801546101008301526115c757600080fd5b606081015115611629576115da83612e04565b6001600160a01b0383166000818152601b60209081526040808320868452825280832054938352601a8252808320868452909152902054606083015101600a909101026116278482613b64565b505b506001600160a01b0390911660009081526018602090815260408083209383529290522080546001019055565b600c602052600090815260409020546001600160a01b031681565b606080838390506040519080825280602002602001820160405280156116a1578160200160208202803883390190505b50905060005b8381101561170057336000908152601860205260408120908686848181106116cb57fe5b905060200201358152602001908152602001600020548282815181106116ed57fe5b60209081029190910101526001016116a7565b5090505b92915050565b6001546001600160a01b0316331461172157600080fd5b600a541561172e57600080fd5b42600a55600881905561a8c0016009556005805460018101825560009182527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00155565b6001546001600160a01b0316331461178957600080fd5b602a55565b602b5481565b6001546001600160a01b031633146117ab57600080fd5b6001600160a01b03919091166000908152602860205260409020805460ff1916911515919091179055565b60156020526000908152604090205481565b62015180420490565b60295481565b6040805163430021db60e11b81523060048201819052602482015290516002604360981b019163860043b69160448083019260209291908290030181600087803b15801561184457600080fd5b505af1158015611858573d6000803e3d6000fd5b505050506040513d602081101561186e57600080fd5b5051600280549091019055565b600181565b6008544210158015611893575060085415155b156118a0576118a0612efe565b60095442101580156118b3575060095415155b156118c0576118c0613aab565b6118c86147bd565b5060008281526023602090815260409182902082516101208101845281548082526001830154938201939093526002820154938101939093526003810154606084015260048101546001600160a01b03166080840152600581015460a0840152600681015460c0840152600781015460e084015260080154610100830152339061195157600080fd5b6101008201513360009081526026602052604090205465ffffffffffff16101561197a57600080fd5b60808201516001600160a01b03161561199257600080fd5b61199b816114eb565b6119eb57600f80546001810182556000919091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319166001600160a01b0383161790555b6001600160a01b038116600090815260186020908152604080832087845290915281205490611a20828663ffffffff613bb216565b9050611a6d83611a68888589602260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060008d815260200190815260200160002054613bcb565b613cc2565b606084015115611ae4576001600160a01b0383166000908152601b60209081526040808320898452909152902054611ae4908490611ab490600a018863ffffffff613d6416565b6001600160a01b0386166000908152601a602090815260408083208c845290915290205460608801510102613b64565b6001600160a01b03831660009081526018602090815260408083208984529091528120829055611b126117e8565b336000908152600d6020526040902054909150811115611b4957336000818152600d60205260409020829055611b49906028613d8b565b50505050505050565b6001546001600160a01b03163314611b6957600080fd5b600086815260246020526040902054611b8657602b805460010190555b6040805160c0810182528781526020808201978852818301968752606082019586526080820194855260a08201938452600098895260249052962095518655935160018601559151600285015551600384015551600483015551600590910155565b3360009081526028602052604090205460ff16611c0457600080fd5b611c1084848484613edb565b50505050565b6001600160a01b038116331415611c2c57600080fd5b323314611c3857600080fd5b6000806000611c4733856141be565b9250925092506000611c58856124c4565b336000908152602760205260409020549091508385119080611c7e5750600a5461a8ba19015b600061546082420381611c8d57fe5b04905060008111611c9d57600080fd5b60008315611d7a57602a54600090880280871115611cbb5780870391505b6029548802975087821115611cd257879250611cd6565b8192505b8215611d68576000611ce78c614264565b905080841115611d17576001600160a01b038c166000908152601060205260409020805482860390039055611d38565b6001600160a01b038c16600090815260106020526040902080548583030190555b506001600160a01b038b166000908152601460209081526040808320429055338352601090915290208054840190555b611d73336028613d8b565b5050611d85565b611d85336014613d8b565b61545a830160048310611d9a575061fd251942015b3360008181526027602090815260409182902084905581519283526001600160a01b038d16908301528615158282015260608201849052517fb06cb54b17603e70140ce0216d86cef7e3e645e5a77c76f0cd1e4afe1b5b9e3f9181900360800190a150505050505050505050565b3360009081526016602052604081205481908180808315611e445750336000908152601160209081526040808320600019870184529091529020545b60065415611f0657600654600019019250835b838111611f04573360008181526011602090815260408083208584528252808320549383526013825280832085845290915290205460ff1681158015611e9b575080155b15611ea857839150611eac565b8193505b600060048481548110611ebb57fe5b906000526020600020015490506000811115611ef957808360068681548110611ee057fe5b90600052602060002001540281611ef357fe5b04860195505b505050600101611e57565b505b60075460009015611faa576007543360009081526017602052604090205460001990910194505b848111611fa857600060058281548110611f4357fe5b906000526020600020015490506000811115611f9f57336000908152601260209081526040808320858452909152902054600780548392919085908110611f8657fe5b90600052602060002001540281611f9957fe5b04830192505b50600101611f2d565b505b9195509093505050509091565b6008544210158015611fca575060085415155b15611fd757611fd7612efe565b6009544210158015611fea575060095415155b15611ff757611ff7613aab565b611fff6147bd565b50600082815260236020908152604091829020825161012081018452815481526001820154928101929092526002810154928201929092526003820154606082015260048201546001600160a01b031660808201819052600583015460a0830152600683015460c0830152600783015460e08301526008909201546101008201529061208a57600080fd5b60008160800151905060006001600160a01b0316816001600160a01b031663c2442f936040518163ffffffff1660e01b815260040160206040518083038186803b1580156120d757600080fd5b505afa1580156120eb573d6000803e3d6000fd5b505050506040513d602081101561210157600080fd5b50516001600160a01b031614156121855760408051630615339760e51b8152336004820152662386f26fc100008502602482015290516001600160a01b0383169163c2a672e091604480830192600092919082900301818387803b15801561216857600080fd5b505af115801561217c573d6000803e3d6000fd5b505050506121f3565b608082015160408051630615339760e51b81523360048201526024810186905290516001600160a01b039092169163c2a672e09160448082019260009290919082900301818387803b1580156121da57600080fd5b505af11580156121ee573d6000803e3d6000fd5b505050505b6121fc33612e04565b60608201511561226057336000818152601b60209081526040808320888452909152902054612260919061223990600a018663ffffffff613d6416565b336000908152601a602090815260408083208a8452909152902054606086015101026142b8565b33600090815260186020908152604080832087845290915290205461228b908463ffffffff61437c16565b3360009081526018602090815260408083209783529690529490942093909355505050565b6122b861479d565b50336000908152602660209081526040918290208251606081018452905465ffffffffffff8082168352600160301b82041692820192909252600160601b9091046001600160a01b0316918101919091526123116147bd565b50600082815260236020908152604091829020825161012081018452815481526001820154818401526002820154938101939093526003810154606084015260048101546001600160a01b03166080840152600581015460a0840152600681015460c0840152600781015460e08401526008015461010083015282519083015165ffffffffffff9182169116106123a757600080fd5b60088410156123e95780516123bb57600080fd5b60008481526025602090815260408083208684529091529020546123e490339086908690614391565b612441565b836008141561240f57336000908152602760205260409020620151851942019055612441565b61a8c0606461241d336114eb565b8161242457fe5b336000908152601060205260409020805492909104929092020190555b336000818152602660209081526040918290208054600165ffffffffffff600160301b80840482169290920116026bffffffffffff0000000000001990911617905581519283528201869052818101859052517fe1f232f076a00b18957d44e5d35849b555de372215cb89d9ec3c52dec8a219769181900360600190a150505050565b60006124cf82614264565b6001600160a01b038316600090815260106020526040902054019050919050565b600a5481565b6001546001600160a01b0316331461250d57600080fd5b600081156125955760408051634aa7d2f760e11b81523060048201819052602482015290516002604360981b019163954fa5ee9160448083019260209291908290030181600087803b15801561256257600080fd5b505af1158015612576573d6000803e3d6000fd5b505050506040513d602081101561258c57600080fd5b50519050612611565b6040805163662aa11d60e01b81523060048201819052602482015290516002604360981b019163662aa11d9160448083019260209291908290030181600087803b1580156125e257600080fd5b505af11580156125f6573d6000803e3d6000fd5b505050506040513d602081101561260c57600080fd5b505190505b6003805460646005840281900490910190915560028054605f90930291909104909101905550565b61a8c081565b602e5481565b60005481565b6000808080808080805b602d548110156126b75733600081815260186020908152604080832060658601808552925290912054909161268b908383614660565b8601955061269a3383836146b9565b850194506126a933838361470d565b909301925050600101612655565b5033600090815260276020526040902054806126d75750600a5461a8ba19015b9792965090945092509050565b336000908152600b602090815260409182902080548351818402810184019094528084526060939283018282801561274557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612727575b5050505050905090565b6001546001600160a01b031681565b600080600061276b6117e8565b336000908152600d6020908152604080832054600e9092529091205491945092509050909192565b600f5490565b600b60205281600052604060002081815481106127b257fe5b6000918252602090912001546001600160a01b03169150829050565b60085442101580156127e1575060085415155b156127ee576127ee612efe565b6009544210158015612801575060095415155b1561280e5761280e613aab565b612816612820565b61281e613870565b565b6008544210158015612833575060085415155b1561284057612840612efe565b6009544210158015612853575060095415155b1561286057612860613aab565b336000908152601660205260408120546006549091600019909101908083156128a45750336000908152601160209081526040808320600019870184529091529020545b835b838111612953573360008181526011602090815260408083208584528252808320549383526013825280832085845290915290205460ff16811580156128ea575080155b156128f7578391506128fb565b8193505b60006004848154811061290a57fe5b9060005260206000200154905060008111156129485780836006868154811061292f57fe5b9060005260206000200154028161294257fe5b04860195505b5050506001016128a6565b50336000908152601160209081526040808320868452909152902054158015612997575033600090815260136020908152604080832086845290915290205460ff16155b80156129a35750600081115b156129c65733600090815260116020908152604080832086845290915290208190555b336000818152601660205260408082206001870190555184156108fc0291859190818181858888f19350505050158015612a04573d6000803e3d6000fd5b5050505050565b6008544210158015612a1e575060085415155b15612a2b57612a2b612efe565b6009544210158015612a3e575060095415155b15612a4b57612a4b613aab565b612a553382613cc2565b336000908152600c60205260409020546001600160a01b03168015612b27576001600160a01b03811660009081526012602090815260408083206005805460001990810186529190935292208054606486840204908101909155815490928386019291908101908110612ac457fe5b6000918252602091829020018054909201909155604080513381526001600160a01b03851692810192909252818101839052517fe78a0f7427f2857e85c4003eca022c81e899460d01b30b65e1b4962291281cd89181900360600190a150612b4f565b600580548391906000198101908110612b3c57fe5b6000918252602090912001805490910190555b50336000908152601260209081526040808320600554600019018452909152902080549091019055565b60286020526000908152604090205460ff1681565b6001546001600160a01b03163314612ba557600080fd5b602955565b6008544210158015612bbd575060085415155b15612bca57612bca612efe565b6009544210158015612bdd575060095415155b15612bea57612bea613aab565b612bf2614812565b50600081815260246020908152604091829020825160c081018452815480825260018301549382019390935260028201549381019390935260038101546060840152600481015460808401526005015460a08301523390612c5257600080fd5b6001600160a01b038116600090815260196020908152604080832086845290915290205460ff1615612c8357600080fd5b60a082015115612cc1576001600160a01b038116600090815260196020908152604080832060a0860151845290915290205460ff16612cc157600080fd5b6000612ccb6117e8565b336000908152600e6020526040902054909150811115612d0257336000818152600e60205260409020829055612d02906028613d8b565b612d10828460200151613cc2565b612d2882846040015185606001518660800151614391565b506001600160a01b0316600090815260196020908152604080832094835293905291909120805460ff1916600117905550565b60085481565b61546081565b6001546001600160a01b03163314612d7e57600080fd5b6001546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810184905290519184169163a9059cbb916044808201926020929091908290030181600087803b158015612dd457600080fd5b505af1158015612de8573d6000803e3d6000fd5b505050506040513d6020811015611c1057600080fd5b602a5481565b6000612e0f82614264565b6001600160a01b03909216600090815260146020908152604080832042905560109091529020805490920190915550565b3360009081526028602052604090205460ff16612e5c57600080fd5b611c1084848484614391565b602d5481565b60008080808080805b602d54811015612ee0576001600160a01b038816600090815260186020908152604080832060658501808552925290912054612eb48a8383614660565b86019550612ec38a83836146b9565b85019450612ed28a838361470d565b909301925050600101612e77565b509196909550909350915050565b602c5481565b6002805434019055565b600854421015612f0d57600080fd5b6000606460046002540281612f1e57fe5b6002805492909104918290039055600080546004805460018181019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01919091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f015550620151804201600855565b6008544210158015612fb0575060085415155b15612fbd57612fbd612efe565b6009544210158015612fd0575060095415155b15612fdd57612fdd613aab565b612fe56147bd565b50600083815260236020908152604091829020825161012081018452815481526001820154928101929092526002810154928201929092526003820154606082015260048201546001600160a01b031660808201819052600583015460a0830152600683015460c0830152600783015460e08301526008909201546101008201529061307057600080fd5b613079336114eb565b613164576001600160a01b038216331480159061309e57506001600160a01b03821615155b156130f757336000818152600c6020908152604080832080546001600160a01b0388166001600160a01b03199182168117909255908452600b835290832080546001810182559084529190922001805490911690911790555b6130ff6117e8565b336000818152600d602052604090209190915561311d906028613d8b565b600f80546001810182556000919091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b031916331790556131a7565b600061316e6117e8565b336000908152600d60205260409020549091508111156131a557336000818152600d602052604090208290556131a5906028613d8b565b505b60008160800151905060006001600160a01b0316816001600160a01b031663c2442f936040518163ffffffff1660e01b815260040160206040518083038186803b1580156131f457600080fd5b505afa158015613208573d6000803e3d6000fd5b505050506040513d602081101561321e57600080fd5b50516001600160a01b031614156132ac5783662386f26fc1000002341461324457600080fd5b60408051630991d88160e21b815233600482015290516001600160a01b03831691632647620491349160248082019260009290919082900301818588803b15801561328e57600080fd5b505af11580156132a2573d6000803e3d6000fd5b505050505061331a565b6080820151604080516356e4bb9760e11b81523360048201526024810187905290516001600160a01b039092169163adc9772e9160448082019260009290919082900301818387803b15801561330157600080fd5b505af1158015613315573d6000803e3d6000fd5b505050505b61332333612e04565b60608201511561338757336000818152601b60209081526040808320898452909152902054613387919061336090600a018763ffffffff613d6416565b336000908152601a602090815260408083208b845290915290205460608601510102613b64565b505033600090815260186020908152604080832095835294905292909220805491909101905550565b3360009081526028602052604090205460ff166133cc57600080fd5b6001600160a01b03909116600090815260106020526040902080549091019055565b6001546001600160a01b0316331461340557600080fd5b6003546040516001600160a01b0383169180156108fc02916000818181858888f1935050505015801561343c573d6000803e3d6000fd5b50506000600355565b60035481565b3360009081526028602052604090205460ff1661346757600080fd5b6134718282613cc2565b5050565b6001546001600160a01b0316331461348c57600080fd5b60008381526025602090815260408083208584529091529020546134b457602e805460010190555b6000928352602560209081526040808520938552929052912055565b6060808383905060405190808252806020026020018201604052801561351057816020015b6134fd614848565b8152602001906001900390816134f55790505b50905060005b8381101561170057600085858381811061352c57fe5b905060200201359050601a6000336001600160a01b03166001600160a01b0316815260200190815260200160002060008281526020019081526020016000205483838151811061357857fe5b602002602001015160006009811061358c57fe5b60209081029190910191909152336000908152601b82526040808220848352909252205483518490849081106135be57fe5b60200260200101516001600981106135d257fe5b60209081029190910191909152336000908152601c825260408082208483529092522054835184908490811061360457fe5b602002602001015160026009811061361857fe5b60209081029190910191909152336000908152601d825260408082208483529092522054835184908490811061364a57fe5b602002602001015160036009811061365e57fe5b60209081029190910191909152336000908152601e825260408082208483529092522054835184908490811061369057fe5b60200260200101516004600981106136a457fe5b60209081029190910191909152336000908152601f82526040808220848352909252205483518490849081106136d657fe5b60200260200101516005600981106136ea57fe5b6020908102919091019190915233600090815281805260408082208483529092522054835184908490811061371b57fe5b602002602001015160066009811061372f57fe5b602090810291909101919091523360009081526021825260408082208483529092522054835184908490811061376157fe5b602002602001015160076009811061377557fe5b60209081029190910191909152336000908152602282526040808220848352909252205483518490849081106137a757fe5b60200260200101516008600981106137bb57fe5b602002015250600101613516565b606080838390506040519080825280602002602001820160405280156137f9578160200160208202803883390190505b50905060005b83811015611700573360009081526019602052604081209086868481811061382357fe5b90506020020135815260200190815260200160002060009054906101000a900460ff1682828151811061385257fe5b911515602092830291909101909101526001016137ff565b60025481565b6008544210158015613883575060085415155b1561389057613890612efe565b60095442101580156138a3575060095415155b156138b0576138b0613aab565b3360009081526017602052604081205460075490916000198201911561394f57825b82811161394d576000600582815481106138e857fe5b9060005260206000200154905060008111156139445733600090815260126020908152604080832085845290915290205460078054839291908590811061392b57fe5b9060005260206000200154028161393e57fe5b04830192505b506001016138d2565b505b336000818152601760205260408082206001860190555183156108fc0291849190818181858888f19350505050158015611c10573d6000803e3d6000fd5b6001546001600160a01b031633146139a457600080fd5b6000898152602360205260409020600401546001600160a01b0316156139c957600080fd5b6000898152602360205260409020546139fa5784156139f057602c805460010190556139fa565b602d805460010190555b60408051610120810182528a815260208082019a8b52818301998a52606082019788526001600160a01b039889166080830190815260a0830197885260c0830196875260e08301958652610100830194855260009c8d52602390915291909a2099518a55975160018a0155955160028901559251600388015594516004870180546001600160a01b031916919094161790925590516005850155915160068401559051600783015551600890910155565b600954421015613aba57600080fd5b60028054606481049081900390915560058054600181810190925560007f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090910181905560078054928301815590527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880155426201518001600955565b600f8181548110613b4457fe5b6000918252602090912001546001600160a01b0316905081565b60095481565b80613b6e836114eb565b6001600160a01b0390931660008181526011602090815260408083206006805485529083528184209590970190945594549181526015909452908320558154019055565b600082820183811015613bc457600080fd5b9392505050565b60008481526023602052604081206001841415613c0b5784613bf35780600101549150613c06565b8060020154850260020281600101540191505b613c99565b6001841115613c995760008515613c3357816002015460018703870202868360010154020190505b613c43868663ffffffff613bb216565b955080613c94613c738460020154613c6760018b038b613d6490919063ffffffff16565b9063ffffffff613d6416565b6001850154613c88908a63ffffffff613d6416565b9063ffffffff613bb216565b039250505b600083118015613ca95750606483105b15613cb957606483810383020491505b50949350505050565b6000613ccd83614264565b905080821115613d25576001600160a01b03831660009081526010602052604090205481830390811115613d0057600080fd5b6001600160a01b03841660009081526010602052604090208054919091039055613d46565b6001600160a01b038316600090815260106020526040902080548383030190555b50506001600160a01b03166000908152601460205260409020429055565b600082613d7357506000611704565b82820282848281613d8057fe5b0414613bc457600080fd5b613d9361479d565b506001600160a01b038281166000908152602660209081526040918290208251606081018452905465ffffffffffff808216808452600160301b8304821694840194909452600160601b90910485169382018490529093600190920160500216918401168111613e95576040828101805185018390036001600160a01b039081168252845160010165ffffffffffff90811686528782166000908152602660209081529490208651815495880151945165ffffffffffff19909616908316176bffffffffffff0000000000001916600160301b9490921693909302176bffffffffffffffffffffffff16600160601b9390911692909202919091179055611c10565b50506001600160a01b03918216600090815260266020526040902080546bffffffffffffffffffffffff8116600160601b91829004851693909301909316909202179055565b600083613f4a57506001600160a01b0384166000818152601a60209081526040808320868452825280832080548690039055838352601b8252808320868452825280832054938352601882528083208684529091529020548202600a90910102613f4585826142b8565b612a04565b836001141561403657613f5b6147bd565b505060008281526023602090815260408083208151610120810183528154815260018201548185015260028201548184015260038201546060820190815260048301546001600160a01b039081166080840152600584015460a0840152600684015460c0840152600784015460e0840152600890930154610100830152918916808652601b8552838620888752855283862080548890039055808652601a85528386208887528552838620549251908652601885528386208887529094529190932054840291909201029061403086836142b8565b50612a04565b836002141561406e576001600160a01b0385166000908152601c60209081526040808320868452909152902080548390039055612a04565b83600314156140a6576001600160a01b0385166000908152601d60209081526040808320868452909152902080548390039055612a04565b83600414156140de576001600160a01b0385166000908152601e60209081526040808320868452909152902080548390039055612a04565b8360051415614116576001600160a01b0385166000908152601f60209081526040808320868452909152902080548390039055612a04565b836006141561414c576001600160a01b038516600090815260208080526040808320868452909152902080548390039055612a04565b8360071415614184576001600160a01b0385166000908152602160209081526040808320868452909152902080548390039055612a04565b8360091415612a04576001600160a01b03851660009081526022602090815260408083208684529091529020805483900390555050505050565b60008080808080805b602d54811015614255576001600160a01b0389166000908152601860209081526040808320606585018085529252909120546142048b8383614660565b860195506142138b838361470d565b6001600160a01b038b166000908152601860209081526040808320868452909152902054940193614247908b9084906146b9565b9094019350506001016141c7565b50919450925090509250925092565b6001600160a01b038116600090815260146020526040812054801580159061428b57504281105b156142af57606481420361429e856114eb565b02816142a657fe5b04915050611517565b50600092915050565b60006142c3836114eb565b905060006142d7828463ffffffff61437c16565b90508061432a576001600160a01b0384166000818152601360209081526040808320600680548552908352818420805460ff19166001179055938352601182528083209354835292905290812055614353565b6001600160a01b0384166000908152601160209081526040808320600654845290915290208190555b50506006546001600160a01b039092166000908152601560205260408120929092558154039055565b60008282111561438b57600080fd5b50900390565b6000836143fa57506001600160a01b0384166000818152601a602090815260408083208684528252808320805486019055838352601b8252808320868452825280832054938352601882528083208684529091529020548202600a90910102613f458582613b64565b83600114156144df5761440b6147bd565b505060008281526023602090815260408083208151610120810183528154815260018201548185015260028201548184015260038201546060820190815260048301546001600160a01b039081166080840152600584015460a0840152600684015460c0840152600784015460e0840152600890930154610100830152918916808652601b85528386208887528552838620805488019055808652601a8552838620888752855283862054925190865260188552838620888752909452919093205484029190920102906140308683613b64565b8360021415614516576001600160a01b0385166000908152601c602090815260408083208684529091529020805483019055612a04565b836003141561454d576001600160a01b0385166000908152601d602090815260408083208684529091529020805483019055612a04565b8360041415614584576001600160a01b0385166000908152601e602090815260408083208684529091529020805483019055612a04565b83600514156145bb576001600160a01b0385166000908152601f602090815260408083208684529091529020805483019055612a04565b83600614156145f0576001600160a01b0385166000908152602080805260408083208684529091529020805483019055612a04565b8360071415614627576001600160a01b03851660009081526021602090815260408083208684529091529020805483019055612a04565b8360091415612a04576001600160a01b038516600090815260226020908152604080832086845290915290208054830190555050505050565b6001600160a01b0383166000818152601d60209081526040808320868452825280832054938352601c825280832086845282528083205460239092528220600501549192600a9290830191018402025b04949350505050565b6001600160a01b0383166000818152601f60209081526040808320868452825280832054938352601e825280832086845282528083205460239092528220600601549192600a9290830191018402026146b0565b6001600160a01b038316600081815260216020908152604080832086845282528083205493835281805280832086845282528083205460239092528220600701549192600a9290830191018402026146b0565b6040518060a001604052806005906020820280388339509192915050565b604051806101a00160405280600d906020820280388339509192915050565b604080516060810182526000808252602082018190529181019190915290565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101200160405280600990602082028038833950919291505056fea265627a7a723158203991c884608580ac47846142e97e0f0dbfea373f10bf364c34fcc94cb242d9ae64736f6c63430005100032

Deployed Bytecode

0x6080604052600436106103fa5760003560e01c80638f6d10c811610213578063c084b7e811610123578063d8895f92116100ab578063df3d21941161007a578063df3d2194146110bc578063e73feea2146110d1578063f2f921e614611136578063f71d96cb1461114b578063fa56453314611175576103fa565b8063d8895f9214610f05578063da4db0aa14610f3b578063da7a4bf31461102a578063dd898e1b146110a7576103fa565b8063c8bbdf08116100f2578063c8bbdf0814610e19578063cb0f8d0e14610e4b578063cc4c90ad14610e84578063d3ac085214610eb7578063d466540f14610ecc576103fa565b8063c084b7e814610db4578063c1b42b3f14610de7578063c2ac3aff14610dfc578063c38f074114610e04576103fa565b8063a54ed22a116101a6578063b29a814011610175578063b29a814014610cd9578063b4674f4f14610d12578063b5967e1614610d27578063b6db0bb714610d5a578063b99700b214610d9f576103fa565b8063a54ed22a14610c5b578063a5a2cb1914610c85578063a89cdad914610caf578063adef408a14610cc4576103fa565b8063a0ef91df116101e2578063a0ef91df14610bc0578063a1e6fcdf14610bd5578063a21f74b814610bea578063a3ab9df314610c14576103fa565b80638f6d10c814610b3f57806393d7c6bf146104e957806397b2f55614610b725780639d7c8b6f14610b87576103fa565b80634a617fba1161030e57806370a08231116102a15780637eef9dba116102705780637eef9dba14610ab05780637ef58e7314610ac557806381bdc2d514610ada5780638743eb4f14610b155780638da5cb5b14610b2a576103fa565b806370a0823114610a2757806378e9792514610a5a5780637c5fa85314610a6f5780637ccebf6d14610a9b576103fa565b80635dc22cce116102dd5780635dc22cce1461096657806367f0eb04146109995780636f151dad146109c7578063709375d0146109f7576103fa565b80634a617fba146108945780634b8772c1146108a95780634e23816d146108d95780634f4bbbdf14610921576103fa565b806323c8eb96116103915780632f6ca47e116103605780632f6ca47e146107e75780633081fe3f1461082257806333e8c09f146108555780633743e60c1461086a5780633a60c8c71461087f576103fa565b806323c8eb96146106b157806325a7650a1461077e578063280b8764146107a85780632cc82f46146107d2576103fa565b80631746bd1b116103cd5780631746bd1b146105a857806319e9e5de146105f65780631b2398171461062957806320bf933614610662576103fa565b8063095f28b7146103fc5780630a540fbb146104e95780630dd72b8a1461051057806314c84f3a14610543575b005b34801561040857600080fd5b5061042c6004803603604081101561041f57600080fd5b508035906020013561118a565b604051808060200180602001848152602001838103835286818151815260200191508051906020019060200280838360005b8381101561047657818101518382015260200161045e565b505050509050018381038252858181518152602001915080516000925b818410156104d55760208085028401015160a080838360005b838110156104c45781810151838201526020016104ac565b505050509050019260010192610493565b925050509550505050505060405180910390f35b3480156104f557600080fd5b506104fe61137d565b60408051918252519081900360200190f35b34801561051c57600080fd5b506104fe6004803603602081101561053357600080fd5b50356001600160a01b0316611382565b34801561054f57600080fd5b506105766004803603602081101561056657600080fd5b50356001600160a01b0316611394565b6040805165ffffffffffff94851681529290931660208301526001600160a01b03168183015290519081900360600190f35b3480156105b457600080fd5b506105bd6113cc565b60405180826101a080838360005b838110156105e35781810151838201526020016105cb565b5050505090500191505060405180910390f35b34801561060257600080fd5b506104fe6004803603602081101561061957600080fd5b50356001600160a01b03166114eb565b34801561063557600080fd5b506103fa6004803603604081101561064c57600080fd5b506001600160a01b03813516906020013561151c565b34801561066e57600080fd5b506106956004803603602081101561068557600080fd5b50356001600160a01b0316611656565b604080516001600160a01b039092168252519081900360200190f35b3480156106bd57600080fd5b5061072e600480360360208110156106d457600080fd5b8101906020810181356401000000008111156106ef57600080fd5b82018360208201111561070157600080fd5b8035906020019184602083028401116401000000008311171561072357600080fd5b509092509050611671565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561076a578181015183820152602001610752565b505050509050019250505060405180910390f35b34801561078a57600080fd5b506103fa600480360360208110156107a157600080fd5b503561170a565b3480156107b457600080fd5b506103fa600480360360208110156107cb57600080fd5b5035611772565b3480156107de57600080fd5b506104fe61178e565b3480156107f357600080fd5b506103fa6004803603604081101561080a57600080fd5b506001600160a01b0381351690602001351515611794565b34801561082e57600080fd5b506104fe6004803603602081101561084557600080fd5b50356001600160a01b03166117d6565b34801561086157600080fd5b506104fe6117e8565b34801561087657600080fd5b506104fe6117f1565b34801561088b57600080fd5b506103fa6117f7565b3480156108a057600080fd5b506104fe61187b565b3480156108b557600080fd5b506103fa600480360360408110156108cc57600080fd5b5080359060200135611880565b3480156108e557600080fd5b506103fa600480360360c08110156108fc57600080fd5b5080359060208101359060408101359060608101359060808101359060a00135611b52565b34801561092d57600080fd5b506103fa6004803603608081101561094457600080fd5b506001600160a01b038135169060208101359060408101359060600135611be8565b34801561097257600080fd5b506103fa6004803603602081101561098957600080fd5b50356001600160a01b0316611c16565b3480156109a557600080fd5b506109ae611e08565b6040805192835260208301919091528051918290030190f35b3480156109d357600080fd5b506103fa600480360360408110156109ea57600080fd5b5080359060200135611fb7565b348015610a0357600080fd5b506103fa60048036036040811015610a1a57600080fd5b50803590602001356122b0565b348015610a3357600080fd5b506104fe60048036036020811015610a4a57600080fd5b50356001600160a01b03166124c4565b348015610a6657600080fd5b506104fe6124f0565b348015610a7b57600080fd5b506103fa60048036036020811015610a9257600080fd5b503515156124f6565b348015610aa757600080fd5b506104fe612639565b348015610abc57600080fd5b506104fe61263f565b348015610ad157600080fd5b506104fe612645565b348015610ae657600080fd5b50610aef61264b565b604080519485526020850193909352838301919091526060830152519081900360800190f35b348015610b2157600080fd5b5061072e6126e4565b348015610b3657600080fd5b5061069561274f565b348015610b4b57600080fd5b50610b5461275e565b60408051938452602084019290925282820152519081900360600190f35b348015610b7e57600080fd5b506104fe612793565b348015610b9357600080fd5b5061069560048036036040811015610baa57600080fd5b506001600160a01b038135169060200135612799565b348015610bcc57600080fd5b506103fa6127ce565b348015610be157600080fd5b506103fa612820565b348015610bf657600080fd5b506103fa60048036036020811015610c0d57600080fd5b5035612a0b565b348015610c2057600080fd5b50610c4760048036036020811015610c3757600080fd5b50356001600160a01b0316612b79565b604080519115158252519081900360200190f35b348015610c6757600080fd5b506103fa60048036036020811015610c7e57600080fd5b5035612b8e565b348015610c9157600080fd5b506103fa60048036036020811015610ca857600080fd5b5035612baa565b348015610cbb57600080fd5b506104fe612d5b565b348015610cd057600080fd5b506104fe612d61565b348015610ce557600080fd5b506103fa60048036036040811015610cfc57600080fd5b506001600160a01b038135169060200135612d67565b348015610d1e57600080fd5b506104fe612dfe565b348015610d3357600080fd5b506103fa60048036036020811015610d4a57600080fd5b50356001600160a01b0316612e04565b348015610d6657600080fd5b506103fa60048036036080811015610d7d57600080fd5b506001600160a01b038135169060208101359060408101359060600135612e40565b348015610dab57600080fd5b506104fe612e68565b348015610dc057600080fd5b50610b5460048036036020811015610dd757600080fd5b50356001600160a01b0316612e6e565b348015610df357600080fd5b506104fe612eee565b6103fa612ef4565b348015610e1057600080fd5b506103fa612efe565b6103fa60048036036060811015610e2f57600080fd5b50803590602081013590604001356001600160a01b0316612f9d565b348015610e5757600080fd5b506103fa60048036036040811015610e6e57600080fd5b506001600160a01b0381351690602001356133b0565b348015610e9057600080fd5b506103fa60048036036020811015610ea757600080fd5b50356001600160a01b03166133ee565b348015610ec357600080fd5b506104fe613445565b348015610ed857600080fd5b506103fa60048036036040811015610eef57600080fd5b506001600160a01b03813516906020013561344b565b348015610f1157600080fd5b506103fa60048036036060811015610f2857600080fd5b5080359060208101359060400135613475565b348015610f4757600080fd5b50610fb860048036036020811015610f5e57600080fd5b810190602081018135640100000000811115610f7957600080fd5b820183602082011115610f8b57600080fd5b80359060200191846020830284011164010000000083111715610fad57600080fd5b5090925090506134d0565b60405180806020018281038252838181518152602001915080516000925b818410156110195760208085028401015161012080838360005b83811015611008578181015183820152602001610ff0565b505050509050019260010192610fd6565b925050509250505060405180910390f35b34801561103657600080fd5b5061072e6004803603602081101561104d57600080fd5b81019060208101813564010000000081111561106857600080fd5b82018360208201111561107a57600080fd5b8035906020019184602083028401116401000000008311171561109c57600080fd5b5090925090506137c9565b3480156110b357600080fd5b506104fe61386a565b3480156110c857600080fd5b506103fa613870565b3480156110dd57600080fd5b506103fa60048036036101208110156110f557600080fd5b508035906020810135906040810135906001600160a01b036060820135169060808101359060a08101359060c08101359060e081013590610100013561398d565b34801561114257600080fd5b506103fa613aab565b34801561115757600080fd5b506106956004803603602081101561116e57600080fd5b5035613b37565b34801561118157600080fd5b506104fe613b5e565b600f5460609081906000908490818110156111a3578091505b6060826040519080825280602002602001820160405280156111cf578160200160208202803883390190505b50905060608360405190808252806020026020018201604052801561120e57816020015b6111fb614760565b8152602001906001900390816111f35790505b5090508860005b8581101561136c5784821061122a5784820391505b6000600f838154811061123957fe5b9060005260206000200160009054906101000a90046001600160a01b031690508085838151811061126657fe5b60200260200101906001600160a01b031690816001600160a01b03168152505061128f816124c4565b84838151811061129b57fe5b60200260200101516000600581106112af57fe5b60200201526112bd816114eb565b8483815181106112c957fe5b60200260200101516001600581106112dd57fe5b60200201526112eb81612e6e565b8685815181106112f757fe5b602002602001015160026005811061130b57fe5b6020020187868151811061131b57fe5b602002602001015160036005811061132f57fe5b6020020188878151811061133f57fe5b602002602001015160046005811061135357fe5b6020020192909252919052525060019182019101611215565b509196509450925050509250925092565b600481565b60276020526000908152604090205481565b60266020526000908152604090205465ffffffffffff80821691600160301b810490911690600160601b90046001600160a01b031683565b6113d461477e565b6113dc61479d565b503360009081526026602090815260408083208151606081018352905465ffffffffffff8082168352600160301b82041682850152600160601b90046001600160a01b0316818301526005805442875260025494870194909452935491850191909152916000198201918290811061145057fe5b6000918252602080832090910154606086015233808352601282526040808420858552909252912054608085015260085460a085015261148f906124c4565b60c0840152815165ffffffffffff90811660e085015260208301511661010084015260408201516001600160a01b03166101208401526114ce336114eb565b610140840152505060095461016082015260295461018082015290565b6001600160a01b0381166000908152601160209081526040808320601583528184205484529091529020545b919050565b3360009081526028602052604090205460ff1661153857600080fd5b6115406147bd565b5060008181526023602090815260409182902082516101208101845281548082526001830154938201939093526002820154938101939093526003810154606084015260048101546001600160a01b03166080840152600581015460a0840152600681015460c0840152600781015460e0840152600801546101008301526115c757600080fd5b606081015115611629576115da83612e04565b6001600160a01b0383166000818152601b60209081526040808320868452825280832054938352601a8252808320868452909152902054606083015101600a909101026116278482613b64565b505b506001600160a01b0390911660009081526018602090815260408083209383529290522080546001019055565b600c602052600090815260409020546001600160a01b031681565b606080838390506040519080825280602002602001820160405280156116a1578160200160208202803883390190505b50905060005b8381101561170057336000908152601860205260408120908686848181106116cb57fe5b905060200201358152602001908152602001600020548282815181106116ed57fe5b60209081029190910101526001016116a7565b5090505b92915050565b6001546001600160a01b0316331461172157600080fd5b600a541561172e57600080fd5b42600a55600881905561a8c0016009556005805460018101825560009182527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00155565b6001546001600160a01b0316331461178957600080fd5b602a55565b602b5481565b6001546001600160a01b031633146117ab57600080fd5b6001600160a01b03919091166000908152602860205260409020805460ff1916911515919091179055565b60156020526000908152604090205481565b62015180420490565b60295481565b6040805163430021db60e11b81523060048201819052602482015290516002604360981b019163860043b69160448083019260209291908290030181600087803b15801561184457600080fd5b505af1158015611858573d6000803e3d6000fd5b505050506040513d602081101561186e57600080fd5b5051600280549091019055565b600181565b6008544210158015611893575060085415155b156118a0576118a0612efe565b60095442101580156118b3575060095415155b156118c0576118c0613aab565b6118c86147bd565b5060008281526023602090815260409182902082516101208101845281548082526001830154938201939093526002820154938101939093526003810154606084015260048101546001600160a01b03166080840152600581015460a0840152600681015460c0840152600781015460e084015260080154610100830152339061195157600080fd5b6101008201513360009081526026602052604090205465ffffffffffff16101561197a57600080fd5b60808201516001600160a01b03161561199257600080fd5b61199b816114eb565b6119eb57600f80546001810182556000919091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b0319166001600160a01b0383161790555b6001600160a01b038116600090815260186020908152604080832087845290915281205490611a20828663ffffffff613bb216565b9050611a6d83611a68888589602260008a6001600160a01b03166001600160a01b0316815260200190815260200160002060008d815260200190815260200160002054613bcb565b613cc2565b606084015115611ae4576001600160a01b0383166000908152601b60209081526040808320898452909152902054611ae4908490611ab490600a018863ffffffff613d6416565b6001600160a01b0386166000908152601a602090815260408083208c845290915290205460608801510102613b64565b6001600160a01b03831660009081526018602090815260408083208984529091528120829055611b126117e8565b336000908152600d6020526040902054909150811115611b4957336000818152600d60205260409020829055611b49906028613d8b565b50505050505050565b6001546001600160a01b03163314611b6957600080fd5b600086815260246020526040902054611b8657602b805460010190555b6040805160c0810182528781526020808201978852818301968752606082019586526080820194855260a08201938452600098895260249052962095518655935160018601559151600285015551600384015551600483015551600590910155565b3360009081526028602052604090205460ff16611c0457600080fd5b611c1084848484613edb565b50505050565b6001600160a01b038116331415611c2c57600080fd5b323314611c3857600080fd5b6000806000611c4733856141be565b9250925092506000611c58856124c4565b336000908152602760205260409020549091508385119080611c7e5750600a5461a8ba19015b600061546082420381611c8d57fe5b04905060008111611c9d57600080fd5b60008315611d7a57602a54600090880280871115611cbb5780870391505b6029548802975087821115611cd257879250611cd6565b8192505b8215611d68576000611ce78c614264565b905080841115611d17576001600160a01b038c166000908152601060205260409020805482860390039055611d38565b6001600160a01b038c16600090815260106020526040902080548583030190555b506001600160a01b038b166000908152601460209081526040808320429055338352601090915290208054840190555b611d73336028613d8b565b5050611d85565b611d85336014613d8b565b61545a830160048310611d9a575061fd251942015b3360008181526027602090815260409182902084905581519283526001600160a01b038d16908301528615158282015260608201849052517fb06cb54b17603e70140ce0216d86cef7e3e645e5a77c76f0cd1e4afe1b5b9e3f9181900360800190a150505050505050505050565b3360009081526016602052604081205481908180808315611e445750336000908152601160209081526040808320600019870184529091529020545b60065415611f0657600654600019019250835b838111611f04573360008181526011602090815260408083208584528252808320549383526013825280832085845290915290205460ff1681158015611e9b575080155b15611ea857839150611eac565b8193505b600060048481548110611ebb57fe5b906000526020600020015490506000811115611ef957808360068681548110611ee057fe5b90600052602060002001540281611ef357fe5b04860195505b505050600101611e57565b505b60075460009015611faa576007543360009081526017602052604090205460001990910194505b848111611fa857600060058281548110611f4357fe5b906000526020600020015490506000811115611f9f57336000908152601260209081526040808320858452909152902054600780548392919085908110611f8657fe5b90600052602060002001540281611f9957fe5b04830192505b50600101611f2d565b505b9195509093505050509091565b6008544210158015611fca575060085415155b15611fd757611fd7612efe565b6009544210158015611fea575060095415155b15611ff757611ff7613aab565b611fff6147bd565b50600082815260236020908152604091829020825161012081018452815481526001820154928101929092526002810154928201929092526003820154606082015260048201546001600160a01b031660808201819052600583015460a0830152600683015460c0830152600783015460e08301526008909201546101008201529061208a57600080fd5b60008160800151905060006001600160a01b0316816001600160a01b031663c2442f936040518163ffffffff1660e01b815260040160206040518083038186803b1580156120d757600080fd5b505afa1580156120eb573d6000803e3d6000fd5b505050506040513d602081101561210157600080fd5b50516001600160a01b031614156121855760408051630615339760e51b8152336004820152662386f26fc100008502602482015290516001600160a01b0383169163c2a672e091604480830192600092919082900301818387803b15801561216857600080fd5b505af115801561217c573d6000803e3d6000fd5b505050506121f3565b608082015160408051630615339760e51b81523360048201526024810186905290516001600160a01b039092169163c2a672e09160448082019260009290919082900301818387803b1580156121da57600080fd5b505af11580156121ee573d6000803e3d6000fd5b505050505b6121fc33612e04565b60608201511561226057336000818152601b60209081526040808320888452909152902054612260919061223990600a018663ffffffff613d6416565b336000908152601a602090815260408083208a8452909152902054606086015101026142b8565b33600090815260186020908152604080832087845290915290205461228b908463ffffffff61437c16565b3360009081526018602090815260408083209783529690529490942093909355505050565b6122b861479d565b50336000908152602660209081526040918290208251606081018452905465ffffffffffff8082168352600160301b82041692820192909252600160601b9091046001600160a01b0316918101919091526123116147bd565b50600082815260236020908152604091829020825161012081018452815481526001820154818401526002820154938101939093526003810154606084015260048101546001600160a01b03166080840152600581015460a0840152600681015460c0840152600781015460e08401526008015461010083015282519083015165ffffffffffff9182169116106123a757600080fd5b60088410156123e95780516123bb57600080fd5b60008481526025602090815260408083208684529091529020546123e490339086908690614391565b612441565b836008141561240f57336000908152602760205260409020620151851942019055612441565b61a8c0606461241d336114eb565b8161242457fe5b336000908152601060205260409020805492909104929092020190555b336000818152602660209081526040918290208054600165ffffffffffff600160301b80840482169290920116026bffffffffffff0000000000001990911617905581519283528201869052818101859052517fe1f232f076a00b18957d44e5d35849b555de372215cb89d9ec3c52dec8a219769181900360600190a150505050565b60006124cf82614264565b6001600160a01b038316600090815260106020526040902054019050919050565b600a5481565b6001546001600160a01b0316331461250d57600080fd5b600081156125955760408051634aa7d2f760e11b81523060048201819052602482015290516002604360981b019163954fa5ee9160448083019260209291908290030181600087803b15801561256257600080fd5b505af1158015612576573d6000803e3d6000fd5b505050506040513d602081101561258c57600080fd5b50519050612611565b6040805163662aa11d60e01b81523060048201819052602482015290516002604360981b019163662aa11d9160448083019260209291908290030181600087803b1580156125e257600080fd5b505af11580156125f6573d6000803e3d6000fd5b505050506040513d602081101561260c57600080fd5b505190505b6003805460646005840281900490910190915560028054605f90930291909104909101905550565b61a8c081565b602e5481565b60005481565b6000808080808080805b602d548110156126b75733600081815260186020908152604080832060658601808552925290912054909161268b908383614660565b8601955061269a3383836146b9565b850194506126a933838361470d565b909301925050600101612655565b5033600090815260276020526040902054806126d75750600a5461a8ba19015b9792965090945092509050565b336000908152600b602090815260409182902080548351818402810184019094528084526060939283018282801561274557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612727575b5050505050905090565b6001546001600160a01b031681565b600080600061276b6117e8565b336000908152600d6020908152604080832054600e9092529091205491945092509050909192565b600f5490565b600b60205281600052604060002081815481106127b257fe5b6000918252602090912001546001600160a01b03169150829050565b60085442101580156127e1575060085415155b156127ee576127ee612efe565b6009544210158015612801575060095415155b1561280e5761280e613aab565b612816612820565b61281e613870565b565b6008544210158015612833575060085415155b1561284057612840612efe565b6009544210158015612853575060095415155b1561286057612860613aab565b336000908152601660205260408120546006549091600019909101908083156128a45750336000908152601160209081526040808320600019870184529091529020545b835b838111612953573360008181526011602090815260408083208584528252808320549383526013825280832085845290915290205460ff16811580156128ea575080155b156128f7578391506128fb565b8193505b60006004848154811061290a57fe5b9060005260206000200154905060008111156129485780836006868154811061292f57fe5b9060005260206000200154028161294257fe5b04860195505b5050506001016128a6565b50336000908152601160209081526040808320868452909152902054158015612997575033600090815260136020908152604080832086845290915290205460ff16155b80156129a35750600081115b156129c65733600090815260116020908152604080832086845290915290208190555b336000818152601660205260408082206001870190555184156108fc0291859190818181858888f19350505050158015612a04573d6000803e3d6000fd5b5050505050565b6008544210158015612a1e575060085415155b15612a2b57612a2b612efe565b6009544210158015612a3e575060095415155b15612a4b57612a4b613aab565b612a553382613cc2565b336000908152600c60205260409020546001600160a01b03168015612b27576001600160a01b03811660009081526012602090815260408083206005805460001990810186529190935292208054606486840204908101909155815490928386019291908101908110612ac457fe5b6000918252602091829020018054909201909155604080513381526001600160a01b03851692810192909252818101839052517fe78a0f7427f2857e85c4003eca022c81e899460d01b30b65e1b4962291281cd89181900360600190a150612b4f565b600580548391906000198101908110612b3c57fe5b6000918252602090912001805490910190555b50336000908152601260209081526040808320600554600019018452909152902080549091019055565b60286020526000908152604090205460ff1681565b6001546001600160a01b03163314612ba557600080fd5b602955565b6008544210158015612bbd575060085415155b15612bca57612bca612efe565b6009544210158015612bdd575060095415155b15612bea57612bea613aab565b612bf2614812565b50600081815260246020908152604091829020825160c081018452815480825260018301549382019390935260028201549381019390935260038101546060840152600481015460808401526005015460a08301523390612c5257600080fd5b6001600160a01b038116600090815260196020908152604080832086845290915290205460ff1615612c8357600080fd5b60a082015115612cc1576001600160a01b038116600090815260196020908152604080832060a0860151845290915290205460ff16612cc157600080fd5b6000612ccb6117e8565b336000908152600e6020526040902054909150811115612d0257336000818152600e60205260409020829055612d02906028613d8b565b612d10828460200151613cc2565b612d2882846040015185606001518660800151614391565b506001600160a01b0316600090815260196020908152604080832094835293905291909120805460ff1916600117905550565b60085481565b61546081565b6001546001600160a01b03163314612d7e57600080fd5b6001546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810184905290519184169163a9059cbb916044808201926020929091908290030181600087803b158015612dd457600080fd5b505af1158015612de8573d6000803e3d6000fd5b505050506040513d6020811015611c1057600080fd5b602a5481565b6000612e0f82614264565b6001600160a01b03909216600090815260146020908152604080832042905560109091529020805490920190915550565b3360009081526028602052604090205460ff16612e5c57600080fd5b611c1084848484614391565b602d5481565b60008080808080805b602d54811015612ee0576001600160a01b038816600090815260186020908152604080832060658501808552925290912054612eb48a8383614660565b86019550612ec38a83836146b9565b85019450612ed28a838361470d565b909301925050600101612e77565b509196909550909350915050565b602c5481565b6002805434019055565b600854421015612f0d57600080fd5b6000606460046002540281612f1e57fe5b6002805492909104918290039055600080546004805460018181019092557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01919091556006805491820181559091527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f015550620151804201600855565b6008544210158015612fb0575060085415155b15612fbd57612fbd612efe565b6009544210158015612fd0575060095415155b15612fdd57612fdd613aab565b612fe56147bd565b50600083815260236020908152604091829020825161012081018452815481526001820154928101929092526002810154928201929092526003820154606082015260048201546001600160a01b031660808201819052600583015460a0830152600683015460c0830152600783015460e08301526008909201546101008201529061307057600080fd5b613079336114eb565b613164576001600160a01b038216331480159061309e57506001600160a01b03821615155b156130f757336000818152600c6020908152604080832080546001600160a01b0388166001600160a01b03199182168117909255908452600b835290832080546001810182559084529190922001805490911690911790555b6130ff6117e8565b336000818152600d602052604090209190915561311d906028613d8b565b600f80546001810182556000919091527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac8020180546001600160a01b031916331790556131a7565b600061316e6117e8565b336000908152600d60205260409020549091508111156131a557336000818152600d602052604090208290556131a5906028613d8b565b505b60008160800151905060006001600160a01b0316816001600160a01b031663c2442f936040518163ffffffff1660e01b815260040160206040518083038186803b1580156131f457600080fd5b505afa158015613208573d6000803e3d6000fd5b505050506040513d602081101561321e57600080fd5b50516001600160a01b031614156132ac5783662386f26fc1000002341461324457600080fd5b60408051630991d88160e21b815233600482015290516001600160a01b03831691632647620491349160248082019260009290919082900301818588803b15801561328e57600080fd5b505af11580156132a2573d6000803e3d6000fd5b505050505061331a565b6080820151604080516356e4bb9760e11b81523360048201526024810187905290516001600160a01b039092169163adc9772e9160448082019260009290919082900301818387803b15801561330157600080fd5b505af1158015613315573d6000803e3d6000fd5b505050505b61332333612e04565b60608201511561338757336000818152601b60209081526040808320898452909152902054613387919061336090600a018763ffffffff613d6416565b336000908152601a602090815260408083208b845290915290205460608601510102613b64565b505033600090815260186020908152604080832095835294905292909220805491909101905550565b3360009081526028602052604090205460ff166133cc57600080fd5b6001600160a01b03909116600090815260106020526040902080549091019055565b6001546001600160a01b0316331461340557600080fd5b6003546040516001600160a01b0383169180156108fc02916000818181858888f1935050505015801561343c573d6000803e3d6000fd5b50506000600355565b60035481565b3360009081526028602052604090205460ff1661346757600080fd5b6134718282613cc2565b5050565b6001546001600160a01b0316331461348c57600080fd5b60008381526025602090815260408083208584529091529020546134b457602e805460010190555b6000928352602560209081526040808520938552929052912055565b6060808383905060405190808252806020026020018201604052801561351057816020015b6134fd614848565b8152602001906001900390816134f55790505b50905060005b8381101561170057600085858381811061352c57fe5b905060200201359050601a6000336001600160a01b03166001600160a01b0316815260200190815260200160002060008281526020019081526020016000205483838151811061357857fe5b602002602001015160006009811061358c57fe5b60209081029190910191909152336000908152601b82526040808220848352909252205483518490849081106135be57fe5b60200260200101516001600981106135d257fe5b60209081029190910191909152336000908152601c825260408082208483529092522054835184908490811061360457fe5b602002602001015160026009811061361857fe5b60209081029190910191909152336000908152601d825260408082208483529092522054835184908490811061364a57fe5b602002602001015160036009811061365e57fe5b60209081029190910191909152336000908152601e825260408082208483529092522054835184908490811061369057fe5b60200260200101516004600981106136a457fe5b60209081029190910191909152336000908152601f82526040808220848352909252205483518490849081106136d657fe5b60200260200101516005600981106136ea57fe5b6020908102919091019190915233600090815281805260408082208483529092522054835184908490811061371b57fe5b602002602001015160066009811061372f57fe5b602090810291909101919091523360009081526021825260408082208483529092522054835184908490811061376157fe5b602002602001015160076009811061377557fe5b60209081029190910191909152336000908152602282526040808220848352909252205483518490849081106137a757fe5b60200260200101516008600981106137bb57fe5b602002015250600101613516565b606080838390506040519080825280602002602001820160405280156137f9578160200160208202803883390190505b50905060005b83811015611700573360009081526019602052604081209086868481811061382357fe5b90506020020135815260200190815260200160002060009054906101000a900460ff1682828151811061385257fe5b911515602092830291909101909101526001016137ff565b60025481565b6008544210158015613883575060085415155b1561389057613890612efe565b60095442101580156138a3575060095415155b156138b0576138b0613aab565b3360009081526017602052604081205460075490916000198201911561394f57825b82811161394d576000600582815481106138e857fe5b9060005260206000200154905060008111156139445733600090815260126020908152604080832085845290915290205460078054839291908590811061392b57fe5b9060005260206000200154028161393e57fe5b04830192505b506001016138d2565b505b336000818152601760205260408082206001860190555183156108fc0291849190818181858888f19350505050158015611c10573d6000803e3d6000fd5b6001546001600160a01b031633146139a457600080fd5b6000898152602360205260409020600401546001600160a01b0316156139c957600080fd5b6000898152602360205260409020546139fa5784156139f057602c805460010190556139fa565b602d805460010190555b60408051610120810182528a815260208082019a8b52818301998a52606082019788526001600160a01b039889166080830190815260a0830197885260c0830196875260e08301958652610100830194855260009c8d52602390915291909a2099518a55975160018a0155955160028901559251600388015594516004870180546001600160a01b031916919094161790925590516005850155915160068401559051600783015551600890910155565b600954421015613aba57600080fd5b60028054606481049081900390915560058054600181810190925560007f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090910181905560078054928301815590527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880155426201518001600955565b600f8181548110613b4457fe5b6000918252602090912001546001600160a01b0316905081565b60095481565b80613b6e836114eb565b6001600160a01b0390931660008181526011602090815260408083206006805485529083528184209590970190945594549181526015909452908320558154019055565b600082820183811015613bc457600080fd5b9392505050565b60008481526023602052604081206001841415613c0b5784613bf35780600101549150613c06565b8060020154850260020281600101540191505b613c99565b6001841115613c995760008515613c3357816002015460018703870202868360010154020190505b613c43868663ffffffff613bb216565b955080613c94613c738460020154613c6760018b038b613d6490919063ffffffff16565b9063ffffffff613d6416565b6001850154613c88908a63ffffffff613d6416565b9063ffffffff613bb216565b039250505b600083118015613ca95750606483105b15613cb957606483810383020491505b50949350505050565b6000613ccd83614264565b905080821115613d25576001600160a01b03831660009081526010602052604090205481830390811115613d0057600080fd5b6001600160a01b03841660009081526010602052604090208054919091039055613d46565b6001600160a01b038316600090815260106020526040902080548383030190555b50506001600160a01b03166000908152601460205260409020429055565b600082613d7357506000611704565b82820282848281613d8057fe5b0414613bc457600080fd5b613d9361479d565b506001600160a01b038281166000908152602660209081526040918290208251606081018452905465ffffffffffff808216808452600160301b8304821694840194909452600160601b90910485169382018490529093600190920160500216918401168111613e95576040828101805185018390036001600160a01b039081168252845160010165ffffffffffff90811686528782166000908152602660209081529490208651815495880151945165ffffffffffff19909616908316176bffffffffffff0000000000001916600160301b9490921693909302176bffffffffffffffffffffffff16600160601b9390911692909202919091179055611c10565b50506001600160a01b03918216600090815260266020526040902080546bffffffffffffffffffffffff8116600160601b91829004851693909301909316909202179055565b600083613f4a57506001600160a01b0384166000818152601a60209081526040808320868452825280832080548690039055838352601b8252808320868452825280832054938352601882528083208684529091529020548202600a90910102613f4585826142b8565b612a04565b836001141561403657613f5b6147bd565b505060008281526023602090815260408083208151610120810183528154815260018201548185015260028201548184015260038201546060820190815260048301546001600160a01b039081166080840152600584015460a0840152600684015460c0840152600784015460e0840152600890930154610100830152918916808652601b8552838620888752855283862080548890039055808652601a85528386208887528552838620549251908652601885528386208887529094529190932054840291909201029061403086836142b8565b50612a04565b836002141561406e576001600160a01b0385166000908152601c60209081526040808320868452909152902080548390039055612a04565b83600314156140a6576001600160a01b0385166000908152601d60209081526040808320868452909152902080548390039055612a04565b83600414156140de576001600160a01b0385166000908152601e60209081526040808320868452909152902080548390039055612a04565b8360051415614116576001600160a01b0385166000908152601f60209081526040808320868452909152902080548390039055612a04565b836006141561414c576001600160a01b038516600090815260208080526040808320868452909152902080548390039055612a04565b8360071415614184576001600160a01b0385166000908152602160209081526040808320868452909152902080548390039055612a04565b8360091415612a04576001600160a01b03851660009081526022602090815260408083208684529091529020805483900390555050505050565b60008080808080805b602d54811015614255576001600160a01b0389166000908152601860209081526040808320606585018085529252909120546142048b8383614660565b860195506142138b838361470d565b6001600160a01b038b166000908152601860209081526040808320868452909152902054940193614247908b9084906146b9565b9094019350506001016141c7565b50919450925090509250925092565b6001600160a01b038116600090815260146020526040812054801580159061428b57504281105b156142af57606481420361429e856114eb565b02816142a657fe5b04915050611517565b50600092915050565b60006142c3836114eb565b905060006142d7828463ffffffff61437c16565b90508061432a576001600160a01b0384166000818152601360209081526040808320600680548552908352818420805460ff19166001179055938352601182528083209354835292905290812055614353565b6001600160a01b0384166000908152601160209081526040808320600654845290915290208190555b50506006546001600160a01b039092166000908152601560205260408120929092558154039055565b60008282111561438b57600080fd5b50900390565b6000836143fa57506001600160a01b0384166000818152601a602090815260408083208684528252808320805486019055838352601b8252808320868452825280832054938352601882528083208684529091529020548202600a90910102613f458582613b64565b83600114156144df5761440b6147bd565b505060008281526023602090815260408083208151610120810183528154815260018201548185015260028201548184015260038201546060820190815260048301546001600160a01b039081166080840152600584015460a0840152600684015460c0840152600784015460e0840152600890930154610100830152918916808652601b85528386208887528552838620805488019055808652601a8552838620888752855283862054925190865260188552838620888752909452919093205484029190920102906140308683613b64565b8360021415614516576001600160a01b0385166000908152601c602090815260408083208684529091529020805483019055612a04565b836003141561454d576001600160a01b0385166000908152601d602090815260408083208684529091529020805483019055612a04565b8360041415614584576001600160a01b0385166000908152601e602090815260408083208684529091529020805483019055612a04565b83600514156145bb576001600160a01b0385166000908152601f602090815260408083208684529091529020805483019055612a04565b83600614156145f0576001600160a01b0385166000908152602080805260408083208684529091529020805483019055612a04565b8360071415614627576001600160a01b03851660009081526021602090815260408083208684529091529020805483019055612a04565b8360091415612a04576001600160a01b038516600090815260226020908152604080832086845290915290208054830190555050505050565b6001600160a01b0383166000818152601d60209081526040808320868452825280832054938352601c825280832086845282528083205460239092528220600501549192600a9290830191018402025b04949350505050565b6001600160a01b0383166000818152601f60209081526040808320868452825280832054938352601e825280832086845282528083205460239092528220600601549192600a9290830191018402026146b0565b6001600160a01b038316600081815260216020908152604080832086845282528083205493835281805280832086845282528083205460239092528220600701549192600a9290830191018402026146b0565b6040518060a001604052806005906020820280388339509192915050565b604051806101a00160405280600d906020820280388339509192915050565b604080516060810182526000808252602082018190529181019190915290565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806101200160405280600990602082028038833950919291505056fea265627a7a723158203991c884608580ac47846142e97e0f0dbfea373f10bf364c34fcc94cb242d9ae64736f6c63430005100032

Deployed Bytecode Sourcemap

1786:39209:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27135:956;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27135:956:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27135:956:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27135:956:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;27135:956:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15725:44;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15725:44:0;;;:::i;:::-;;;;;;;;;;;;;;;;15611:55;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15611:55:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15611:55:0;-1:-1:-1;;;;;15611:55:0;;:::i;15556:48::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15556:48:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15556:48:0;-1:-1:-1;;;;;15556:48:0;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15556:48:0;;;;;;;;;;;;;;;24589:775;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24589:775:0;;;:::i;:::-;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24589:775:0;;;;;;;;;;;;;;;;6689:160;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6689:160:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6689:160:0;-1:-1:-1;;;;;6689:160:0;;:::i;18665:570::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18665:570:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;18665:570:0;;;;;;;;:::i;2916:45::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2916:45:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2916:45:0;-1:-1:-1;;;;;2916:45:0;;:::i;:::-;;;;-1:-1:-1;;;;;2916:45:0;;;;;;;;;;;;;;25372:303;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25372:303:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25372:303:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;25372:303:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25372:303:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;25372:303:0;;-1:-1:-1;25372:303:0;-1:-1:-1;25372:303:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;25372:303:0;;;;;;;;;;;;;;;;;5898:337;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5898:337:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5898:337:0;;:::i;17226:182::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17226:182:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17226:182:0;;:::i;16032:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16032:26:0;;;:::i;16878:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16878:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;16878:158:0;;;;;;;;;;:::i;3801:58::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3801:58:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3801:58:0;-1:-1:-1;;;;;3801:58:0;;:::i;24457:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24457:94:0;;;:::i;15900:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15900:37:0;;;:::i;8827:128::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8827:128:0;;;:::i;2089:48::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2089:48:0;;;:::i;32858:1175::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32858:1175:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32858:1175:0;;;;;;;:::i;17416:320::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17416:320:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;17416:320:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21546:251::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21546:251:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;21546:251:0;;;;;;;;;;;;;;;;;;:::i;37279:2273::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37279:2273:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37279:2273:0;-1:-1:-1;;;;;37279:2273:0;;:::i;28417:2003::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28417:2003:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32008:842;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32008:842:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32008:842:0;;;;;;;:::i;40138:852::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40138:852:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40138:852:0;;;;;;;:::i;6243:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6243:140:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6243:140:0;-1:-1:-1;;;;;6243:140:0;;:::i;2824:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2824:24:0;;;:::i;8963:427::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8963:427:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8963:427:0;;;;:::i;15841:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15841:52:0;;;:::i;16133:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16133:25:0;;;:::i;1926:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1926:33:0;;;:::i;34964:900::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34964:900:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28292:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28292:117:0;;;:::i;1966:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1966:33:0;;;:::i;28099:185::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28099:185:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;27033:94;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27033:94:0;;;:::i;2857:52::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2857:52:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;2857:52:0;;;;;;;;:::i;9801:126::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9801:126:0;;;:::i;10661:1630::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10661:1630:0;;;:::i;9935:718::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9935:718:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9935:718:0;;:::i;15673:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15673:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15673:43:0;-1:-1:-1;;;;;15673:43:0;;:::i;:::-;;;;;;;;;;;;;;;;;;17044:174;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17044:174:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17044:174:0;;:::i;34041:913::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34041:913:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34041:913:0;;:::i;2738:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2738:31:0;;;:::i;15776:58::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15776:58:0;;;:::i;9578:215::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9578:215:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9578:215:0;;;;;;;;:::i;15963:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15963:42:0;;;:::i;6857:195::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6857:195:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6857:195:0;-1:-1:-1;;;;;6857:195:0;;:::i;19646:253::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19646:253:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;19646:253:0;;;;;;;;;;;;;;;;;;:::i;16099:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16099:27:0;;;:::i;35872:668::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35872:668:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35872:668:0;-1:-1:-1;;;;;35872:668:0;;:::i;16065:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16065:27:0;;;:::i;8732:87::-;;;:::i;13113:448::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13113:448:0;;;:::i;30428:1572::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30428:1572:0;;;;;;;;;;;-1:-1:-1;;;;;30428:1572:0;;:::i;19243:182::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19243:182:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19243:182:0;;;;;;;;:::i;9398:172::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9398:172:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9398:172:0;-1:-1:-1;;;;;9398:172:0;;:::i;2234:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2234:26:0;;;:::i;19433:205::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19433:205:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19433:205:0;;;;;;;;:::i;18371:286::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18371:286:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18371:286:0;;;;;;;;;;;;:::i;26000:1025::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26000:1025:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26000:1025:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;26000:1025:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;26000:1025:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;26000:1025:0;;-1:-1:-1;26000:1025:0;-1:-1:-1;26000:1025:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;26000:1025:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25683:309;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25683:309:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25683:309:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;25683:309:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;25683:309:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;25683:309:0;;-1:-1:-1;25683:309:0;-1:-1:-1;25683:309:0;:::i;2146:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2146:35:0;;;:::i;12301:761::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12301:761:0;;;:::i;17744:619::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17744:619:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;17744:619:0;;;;;;;;;;;;;-1:-1:-1;;;;;17744:619:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13610:537::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13610:537:0;;;:::i;3095:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3095:24:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3095:24:0;;:::i;2776:41::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2776:41:0;;;:::i;27135:956::-;27330:7;:14;27213:16;;;;27252:7;;27290:6;;27359:24;;;27355:79;;;27410:12;27400:22;;27355:79;27446:22;27485:7;27471:22;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;27471:22:0;;27446:47;;27504:25;27549:7;27532:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;27504:53:0;-1:-1:-1;27586:5:0;27570:13;27602:441;27626:7;27622:1;:11;27602:441;;;27668:12;27659:5;:21;27655:90;;27717:12;27709:5;:20;27701:28;;27655:90;27761:14;27778:7;27786:5;27778:14;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27778:14:0;27761:31;;27818:6;27807:5;27813:1;27807:8;;;;;;;;;;;;;:17;-1:-1:-1;;;;;27807:17:0;;;-1:-1:-1;;;;;27807:17:0;;;;;27853;27863:6;27853:9;:17::i;:::-;27839:5;27845:1;27839:8;;;;;;;;;;;;;;27848:1;27839:11;;;;;;;;;;:31;27899:24;27916:6;27899:16;:24::i;:::-;27885:5;27891:1;27885:8;;;;;;;;;;;;;;27894:1;27885:11;;;;;;;;;;:38;27980:29;28002:6;27980:21;:29::i;:::-;27939:5;27945:1;27939:8;;;;;;;;;;;;;;27948:1;27939:11;;;;;;;;;;27952:5;27958:1;27952:8;;;;;;;;;;;;;;27961:1;27952:11;;;;;;;;;;27965:5;27971:1;27965:8;;;;;;;;;;;;;;27974:1;27965:11;;;;;;;;;;27938:71;;;;;;;;-1:-1:-1;28024:7:0;;;;;27635:3;27602:441;;;-1:-1:-1;28063:5:0;;-1:-1:-1;28070:5:0;-1:-1:-1;28077:5:0;-1:-1:-1;;;27135:956:0;;;;;:::o;15725:44::-;15768:1;15725:44;:::o;15611:55::-;;;;;;;;;;;;;:::o;15556:48::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;15556:48:0;;;;;;-1:-1:-1;;;15556:48:0;;-1:-1:-1;;;;;15556:48:0;;:::o;24589:775::-;24635:23;;:::i;:::-;24671;;:::i;:::-;-1:-1:-1;24709:10:0;24697:23;;;;:11;:23;;;;;;;;24671:49;;;;;;;;;;;;;;;-1:-1:-1;;;24671:49:0;;;;;;;-1:-1:-1;;;24671:49:0;;-1:-1:-1;;;;;24671:49:0;;;;;24757:24;:31;;24815:3;24805:13;;24839:20;;24829:7;;;:30;;;;24880:18;;24870:7;;;:28;;;;24671:49;-1:-1:-1;;24757:35:0;;;;;24919:41;;;;;;;;;;;;;;;;;;24909:7;;;:51;25001:10;24981:31;;;:19;:31;;;;;;:48;;;;;;;;;24971:7;;;:58;25050:16;;25040:7;;;:26;25087:21;;:9;:21::i;:::-;25077:7;;;:31;25129:12;;25119:22;;;;:7;;;:22;25077:7;25162:18;;;25152:28;:7;;;:28;25201:17;;;;-1:-1:-1;;;;;25191:27:0;:7;;;:27;25240:28;25257:10;25240:16;:28::i;:::-;25229:8;;;:39;-1:-1:-1;;25290:26:0;;25279:8;;;:37;25338:18;;25327:8;;;:29;25229:4;24589:775::o;6689:160::-;-1:-1:-1;;;;;6778:30:0;;6752:7;6778:30;;;:22;:30;;;;;;;;6809:23;:31;;;;;;6778:63;;;;;;;;6689:160;;;;:::o;18665:570::-;18765:10;18753:23;;;;:11;:23;;;;;;;;18745:32;;;;;;18788:16;;:::i;:::-;-1:-1:-1;18807:16:0;;;;:8;:16;;;;;;;;;18788:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18788:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18834:24;;;;;;18889:22;;;;:26;18885:304;;18932:24;18949:6;18932:16;:24::i;:::-;-1:-1:-1;;;;;19070:35:0;;18971:18;19070:35;;;:27;:35;;;;;;;;:43;;;;;;;;;19018:34;;;:26;:34;;;;;:42;;;;;;;;;18993:22;;;;:67;19065:2;:48;;;18992:122;19129:48;19098:6;18992:122;19129:28;:48::i;:::-;18885:304;;-1:-1:-1;;;;;;19199:18:0;;;;;;;:10;:18;;;;;;;;:26;;;;;;;:28;;;;;;18665:570::o;2916:45::-;;;;;;;;;;;;-1:-1:-1;;;;;2916:45:0;;:::o;25372:303::-;25442:16;25471:22;25510:3;;:10;;25496:25;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;25496:25:0;-1:-1:-1;25471:50:0;-1:-1:-1;25539:9:0;25534:109;25554:14;;;25534:109;;;25612:10;25601:22;;;;:10;:22;;;;;;25624:3;;25628:1;25624:6;;;;;;;;;;;;;25601:30;;;;;;;;;;;;25590:5;25596:1;25590:8;;;;;;;;;;;;;;;;;:41;25570:3;;25534:109;;;-1:-1:-1;25662:5:0;-1:-1:-1;25372:303:0;;;;;:::o;5898:337::-;5982:5;;-1:-1:-1;;;;;5982:5:0;5968:10;:19;5960:28;;;;;;6007:9;;:14;5999:23;;;;;;6045:3;6033:9;:15;6059:16;:32;;;6147:8;6131:24;6102:26;:53;6166:24;27:10:-1;;-1:-1;23:18;;45:23;;-1:-1;6166:32:0;;;;;;5898:337::o;17226:182::-;17337:5;;-1:-1:-1;;;;;17337:5:0;17323:10;:19;17315:28;;;;;;17354:20;:46;17226:182::o;16032:26::-;;;;:::o;16878:158::-;16978:5;;-1:-1:-1;;;;;16978:5:0;16964:10;:19;16956:28;;;;;;-1:-1:-1;;;;;16995:25:0;;;;;;;;:11;:25;;;;;:33;;-1:-1:-1;;16995:33:0;;;;;;;;;;16878:158::o;3801:58::-;;;;;;;;;;;;;:::o;24457:94::-;24537:5;24531:3;:11;;24457:94::o;15900:37::-;;;;:::o;8827:128::-;8898:49;;;-1:-1:-1;;;8898:49:0;;8926:4;8898:49;;;;;;;;;;;;-1:-1:-1;;;;;1874:42:0;8898:19;;:49;;;;;;;;;;;;;;-1:-1:-1;1874:42:0;8898:49;;;5:2:-1;;;;30:1;27;20:12;5:2;8898:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8898:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8898:49:0;8874:20;:73;;;;;;;8827:128::o;2089:48::-;2136:1;2089:48;:::o;32858:1175::-;5470:16;;5463:3;:23;;:48;;;;-1:-1:-1;5490:16:0;;:21;;5463:48;5459:113;;;5527:33;:31;:33::i;:::-;5593:26;;5586:3;:33;;:68;;;;-1:-1:-1;5623:26:0;;:31;;5586:68;5582:132;;;5670:32;:30;:32::i;:::-;32941:16;;:::i;:::-;-1:-1:-1;32960:16:0;;;;:8;:16;;;;;;;;;32941:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32941:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33004:10;;33025:24;;;;;;33115:21;;;;33094:10;33082:23;;;;:11;:23;;;;;:29;;;:54;;33074:63;;;;;;33156:16;;;;-1:-1:-1;;;;;33156:30:0;;33148:39;;;;;;33204:24;33221:6;33204:16;:24::i;:::-;33200:82;;33250:7;27:10:-1;;39:1;23:18;;45:23;;-1:-1;33250:20:0;;;;;;;;-1:-1:-1;;;;;;33250:20:0;-1:-1:-1;;;;;33250:20:0;;;;;33200:82;-1:-1:-1;;;;;33313:18:0;;33294:16;33313:18;;;:10;:18;;;;;;;;:26;;;;;;;;;;33369:20;33313:26;33382:6;33369:20;:12;:20;:::i;:::-;33350:39;;33402:116;33431:6;33439:78;33457:6;33465:8;33475:6;33483:17;:25;33501:6;-1:-1:-1;;;;;33483:25:0;-1:-1:-1;;;;;33483:25:0;;;;;;;;;;;;:33;33509:6;33483:33;;;;;;;;;;;;33439:17;:78::i;:::-;33402:28;:116::i;:::-;33535:22;;;;:26;33531:231;;-1:-1:-1;;;;;33693:35:0;;;;;;:27;:35;;;;;;;;:43;;;;;;;;;33578:172;;33607:6;;33687:62;;33688:2;:48;33742:6;33687:62;:54;:62;:::i;:::-;-1:-1:-1;;;;;33641:34:0;;;;;;:26;:34;;;;;;;;:42;;;;;;;;;33616:22;;;;:67;33615:134;33578:28;:172::i;:::-;-1:-1:-1;;;;;33772:18:0;;;;;;:10;:18;;;;;;;;:26;;;;;;;;:37;;;33842:16;:14;:16::i;:::-;33893:10;33873:31;;;;:19;:31;;;;;;33822:36;;-1:-1:-1;33873:43:0;-1:-1:-1;33869:157:0;;;33953:10;33933:31;;;;:19;:31;;;;;:43;;;33991:23;;34011:2;33991:7;:23::i;:::-;5724:1;;;;;32858:1175;;:::o;17416:320::-;17563:5;;-1:-1:-1;;;;;17563:5:0;17549:10;:19;17541:28;;;;;;17584:15;;;;:11;:15;;;;;:25;17580:76;;17631:11;:13;;;;;;17580:76;17684:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17666:15:0;;;:11;:15;;;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17416:320::o;21546:251::-;21701:10;21689:23;;;;:11;:23;;;;;;;;21681:32;;;;;;21724:65;21746:6;21754:12;21768:6;21776:12;21724:21;:65::i;:::-;21546:251;;;;:::o;37279:2273::-;-1:-1:-1;;;;;37345:20:0;;37355:10;37345:20;;37337:29;;;;;;37385:9;37398:10;37385:23;37377:32;;;;;;37423:22;37447;37471:21;37496:41;37518:10;37530:6;37496:21;:41::i;:::-;37422:115;;;;;;37548:18;37569:17;37579:6;37569:9;:17::i;:::-;37712:10;37597:14;37691:32;;;:20;:32;;;;;;37548:38;;-1:-1:-1;37614:31:0;;;;37738:27;37734:109;;-1:-1:-1;37807:9:0;;-1:-1:-1;;37807:24:0;37734:109;37855:21;15827:7;37886:22;37880:3;:28;37879:57;;;;;;37855:81;;37971:1;37955:13;:17;37947:26;;;;;;37986:17;38018:9;38014:1139;;;38116:20;;38044:17;;38099:37;;38155:25;;;38151:103;;;38226:12;38213:10;:25;38201:37;;38151:103;38302:18;;38286:13;:34;38270:50;;38351:13;38339:9;:25;38335:153;;;38397:13;38385:25;;38335:153;;;38463:9;38451:21;;38335:153;38508:13;;38504:544;;38642:20;38665:29;38687:6;38665:21;:29::i;:::-;38642:52;;38729:12;38717:9;:24;38713:218;;;-1:-1:-1;;;;;38766:18:0;;;;;;:10;:18;;;;;:48;;38789:24;;;38766:48;;;;38713:218;;;-1:-1:-1;;;;;38863:18:0;;;;;;:10;:18;;;;;:48;;38886:24;;;38863:48;;;38713:218;-1:-1:-1;;;;;;38949:23:0;;;;;;:15;:23;;;;;;;;38975:3;38949:29;;39008:10;38997:22;;:10;:22;;;;;:35;;;;;;38504:544;39062:23;39070:10;39082:2;39062:7;:23::i;:::-;38014:1139;;;;;39118:23;39126:10;39138:2;39118:7;:23::i;:::-;39195:53;;;15768:1;39263:33;;39259:149;;-1:-1:-1;;;39335:3:0;:61;39259:149;39439:10;39418:32;;;;:20;:32;;;;;;;;;:54;;;39488:56;;;;;-1:-1:-1;;;;;39488:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37279:2273;;;;;;;;;;:::o;28417:2003::-;28552:10;28474:7;28527:36;;;:24;:36;;;;;;28474:7;;;;;28684:17;;28680:124;;-1:-1:-1;28762:10:0;28739:34;;;;:22;:34;;;;;;;;-1:-1:-1;;28774:17:0;;28739:53;;;;;;;;28680:124;28820:29;:36;:40;28816:1011;;28894:29;:36;-1:-1:-1;;28894:40:0;;-1:-1:-1;28966:13:0;28949:867;28986:14;28981:1;:19;28949:867;;29184:10;29126:32;29161:34;;;:22;:34;;;;;;;;:37;;;;;;;;;29242:40;;;:28;:40;;;;;:43;;;;;;;;;;;29308:29;;:51;;;;;29342:17;29341:18;29308:51;29304:238;;;29411:18;29384:45;;29304:238;;;29498:24;29477:45;;29304:238;29562:23;29588:27;29616:1;29588:30;;;;;;;;;;;;;;;;29562:56;;29659:1;29641:15;:19;29637:164;;;29766:15;29738:24;29703:29;29733:1;29703:32;;;;;;;;;;;;;;;;:59;29702:79;;;;;;29685:96;;;;29637:164;-1:-1:-1;;;29002:3:0;;28949:867;;;;28816:1011;29874:28;:35;29839:20;;29874:39;29870:494;;29947:28;:35;30042:10;30006:9;30018:35;;;:23;:35;;;;;;-1:-1:-1;;29947:39:0;;;;-1:-1:-1;30001:352:0;30060:14;30055:1;:19;30001:352;;30100:21;30124:24;30149:1;30124:27;;;;;;;;;;;;;;;;30100:51;;30190:1;30174:13;:17;30170:168;;;30287:10;30267:31;;;;:19;:31;;;;;;;;:34;;;;;;;;;30233:28;:31;;30305:13;;30267:34;30233:28;30299:1;;30233:31;;;;;;;;;;;;;;:68;30232:86;;;;;;30216:102;;;;30170:168;-1:-1:-1;30076:3:0;;30001:352;;;;29870:494;30384:13;;-1:-1:-1;30399:12:0;;-1:-1:-1;;;;28417:2003:0;;:::o;32008:842::-;5470:16;;5463:3;:23;;:48;;;;-1:-1:-1;5490:16:0;;:21;;5463:48;5459:113;;;5527:33;:31;:33::i;:::-;5593:26;;5586:3;:33;;:68;;;;-1:-1:-1;5623:26:0;;:31;;5586:68;5582:132;;;5670:32;:30;:32::i;:::-;32096:16;;:::i;:::-;-1:-1:-1;32115:16:0;;;;:8;:16;;;;;;;;;32096:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32096:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32142:39;;;;;;32194:12;32217:4;:16;;;32194:40;;32277:1;-1:-1:-1;;;;;32249:30:0;:4;-1:-1:-1;;;;;32249:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32249:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32249:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32249:16:0;-1:-1:-1;;;;;32249:30:0;;32245:220;;;32296:45;;;-1:-1:-1;;;32296:45:0;;32309:10;32296:45;;;;32331:8;32321:19;;32296:45;;;;;;-1:-1:-1;;;;;32296:12:0;;;;;:45;;;;;-1:-1:-1;;32296:45:0;;;;;;;-1:-1:-1;32296:12:0;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;32296:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32296:45:0;;;;32245:220;;;32408:16;;;;32395:58;;;-1:-1:-1;;;32395:58:0;;32434:10;32395:58;;;;;;;;;;;;-1:-1:-1;;;;;32395:38:0;;;;;;:58;;;;;-1:-1:-1;;32395:58:0;;;;;;;;-1:-1:-1;32395:38:0;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;32395:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32395:58:0;;;;32245:220;32477:28;32494:10;32477:16;:28::i;:::-;32520:22;;;;:26;32516:241;;32590:10;32684:39;;;;:27;:39;;;;;;;;:47;;;;;;;;;32563:182;;32590:10;32678:66;;32679:2;:52;32737:6;32678:66;:58;:66;:::i;:::-;32655:10;32628:38;;;;:26;:38;;;;;;;;:46;;;;;;;;;32603:22;;;;:71;32602:142;32563:26;:182::i;:::-;32811:10;32800:22;;;;:10;:22;;;;;;;;:30;;;;;;;;;:42;;32835:6;32800:42;:34;:42;:::i;:::-;32778:10;32767:22;;;;:10;:22;;;;;;;;:30;;;;;;;;;;:75;;;;-1:-1:-1;;;32008:842:0:o;40138:852::-;40221:21;;:::i;:::-;-1:-1:-1;40257:10:0;40245:23;;;;:11;:23;;;;;;;;;40221:47;;;;;;;;;;;;;;;-1:-1:-1;;;40221:47:0;;;;;;;;;;-1:-1:-1;;;40221:47:0;;;-1:-1:-1;;;;;40221:47:0;;;;;;;;40279:16;;:::i;:::-;-1:-1:-1;40298:16:0;;;;:8;:16;;;;;;;;;40279:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40279:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40352:10;;40333:16;;;;:29;;;;;;;40325:38;;;;;;40394:1;40380:11;:15;40376:496;;;40420:11;;40412:24;;;;;;40507:32;;;;:19;:32;;;;;;;;:40;;;;;;;;;40451:97;;40474:10;;40486:11;;40499:6;;40451:22;:97::i;:::-;40376:496;;;40570:11;40585:1;40570:16;40566:306;;;40624:10;40603:32;;;;:20;:32;;;;;-1:-1:-1;;40638:3:0;:55;40603:90;;40566:306;;;15885:8;40812:3;40781:28;40798:10;40781:16;:28::i;:::-;:34;;;;;40765:10;40754:22;;;;:10;:22;;;;;:82;;40781:34;;;;40780:56;;;;40754:82;;;40566:306;40894:10;40882:23;;;;:11;:23;;;;;;;;;:37;;;;-1:-1:-1;;;40882:37:0;;;;;;;;;;;-1:-1:-1;;40882:37:0;;;;;;40935:47;;;;;;;;;;;;;;;;;;;;;;;;;;40138:852;;;;:::o;6243:140::-;6298:7;6346:29;6368:6;6346:21;:29::i;:::-;-1:-1:-1;;;;;6325:18:0;;;;;;:10;:18;;;;;;:50;;-1:-1:-1;6243:140:0;;;:::o;2824:24::-;;;;:::o;8963:427::-;9043:5;;-1:-1:-1;;;;;9043:5:0;9029:10;:19;9021:28;;;;;;9060:11;9086:8;9082:180;;;9117:47;;;-1:-1:-1;;;9117:47:0;;9143:4;9117:47;;;;;;;;;;;;-1:-1:-1;;;;;1874:42:0;9117:17;;:47;;;;;;;;;;;;;;-1:-1:-1;1874:42:0;9117:47;;;5:2:-1;;;;30:1;27;20:12;5:2;9117:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9117:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9117:47:0;;-1:-1:-1;9082:180:0;;;9203:47;;;-1:-1:-1;;;9203:47:0;;9229:4;9203:47;;;;;;;;;;;;-1:-1:-1;;;;;1874:42:0;9203:17;;:47;;;;;;;;;;;;;;-1:-1:-1;1874:42:0;9203:47;;;5:2:-1;;;;30:1;27;20:12;5:2;9203:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9203:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9203:47:0;;-1:-1:-1;9082:180:0;9272:11;:30;;9299:3;9294:1;9288:7;;9287:15;;;9272:30;;;;;;9342:20;:40;;9373:2;9367:8;;;9366:16;;;;9342:40;;;;;-1:-1:-1;8963:427:0:o;15841:52::-;15885:8;15841:52;:::o;16133:25::-;;;;:::o;1926:33::-;;;;:::o;34964:900::-;35018:7;;;;;;;;35165:404;35189:12;;35185:1;:16;35165:404;;;35306:10;35223:14;35295:22;;;:10;:22;;;;;;;;35244:3;35240:7;;35295:30;;;;;;;;;35240:7;;35358:41;;35240:7;35295:30;35358:14;:41::i;:::-;35340:59;;;;35432:42;35448:10;35460:6;35468:5;35432:15;:42::i;:::-;35414:60;;;;35506:51;35531:10;35543:6;35551:5;35506:24;:51::i;:::-;35489:68;;;;-1:-1:-1;;35203:3:0;;35165:404;;;-1:-1:-1;35635:10:0;35581:30;35614:32;;;:20;:32;;;;;;35661:27;35657:109;;-1:-1:-1;35730:9:0;;-1:-1:-1;;35730:24:0;35657:109;35786:22;35810:14;;-1:-1:-1;35826:14:0;;-1:-1:-1;35810:14:0;-1:-1:-1;34964:900:0;-1:-1:-1;34964:900:0:o;28292:117::-;28390:10;28374:27;;;;:15;:27;;;;;;;;;28367:34;;;;;;;;;;;;;;;;;28338:16;;28367:34;;;28374:27;28367:34;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28367:34:0;;;;;;;;;;;;;;;;;;;;;;;28292:117;:::o;1966:33::-;;;-1:-1:-1;;;;;1966:33:0;;:::o;28099:185::-;28144:7;28153;28162;28190:16;:14;:16::i;:::-;28228:10;28208:31;;;;:19;:31;;;;;;;;;28241:22;:34;;;;;;;28182:94;;-1:-1:-1;28208:31:0;-1:-1:-1;28241:34:0;-1:-1:-1;28099:185:0;;;:::o;27033:94::-;27105:7;:14;27033:94;:::o;2857:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2857:52:0;;-1:-1:-1;2857:52:0;;-1:-1:-1;2857:52:0:o;9801:126::-;5470:16;;5463:3;:23;;:48;;;;-1:-1:-1;5490:16:0;;:21;;5463:48;5459:113;;;5527:33;:31;:33::i;:::-;5593:26;;5586:3;:33;;:68;;;;-1:-1:-1;5623:26:0;;:31;;5586:68;5582:132;;;5670:32;:30;:32::i;:::-;9858:24;:22;:24::i;:::-;9893:26;:24;:26::i;:::-;9801:126::o;10661:1630::-;5470:16;;5463:3;:23;;:48;;;;-1:-1:-1;5490:16:0;;:21;;5463:48;5459:113;;;5527:33;:31;:33::i;:::-;5593:26;;5586:3;:33;;:68;;;;-1:-1:-1;5623:26:0;;:31;;5586:68;5582:132;;;5670:32;:30;:32::i;:::-;10776:10;10727:21;10751:36;;;:24;:36;;;;;;10820:29;:36;10751;;-1:-1:-1;;10820:40:0;;;;10727:21;10946:17;;10942:124;;-1:-1:-1;11024:10:0;11001:34;;;;:22;:34;;;;;;;;-1:-1:-1;;11036:17:0;;11001:53;;;;;;;;10942:124;11095:13;11078:814;11115:11;11110:1;:16;11078:814;;11304:10;11246:32;11281:34;;;:22;:34;;;;;;;;:37;;;;;;;;;11358:40;;;:28;:40;;;;;:43;;;;;;;;;;;11420:29;;:51;;;;;11454:17;11453:18;11420:51;11416:222;;;11519:18;11492:45;;11416:222;;;11598:24;11577:45;;11416:222;11654:23;11680:27;11708:1;11680:30;;;;;;;;;;;;;;;;11654:56;;11747:1;11729:15;:19;11725:156;;;11850:15;11822:24;11787:29;11817:1;11787:32;;;;;;;;;;;;;;;;:59;11786:79;;;;;;11769:96;;;;11725:156;-1:-1:-1;;;11128:3:0;;11078:814;;;-1:-1:-1;11933:10:0;11910:34;;;;:22;:34;;;;;;;;:47;;;;;;;;;:52;:110;;;;-1:-1:-1;11996:10:0;11967:40;;;;:28;:40;;;;;;;;:53;;;;;;;;;;;11966:54;11910:110;:136;;;;;12045:1;12024:18;:22;11910:136;11906:266;;;12086:10;12063:34;;;;:22;:34;;;;;;;;:47;;;;;;;;:68;;;11906:266;12209:10;12184:36;;;;:24;:36;;;;;;12237:1;12223:15;;12184:54;;12249:34;;;;;;12269:13;;12249:34;;12184:36;12249:34;12269:13;12209:10;12249:34;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12249:34:0;5724:1;;;;10661:1630::o;9935:718::-;5470:16;;5463:3;:23;;:48;;;;-1:-1:-1;5490:16:0;;:21;;5463:48;5459:113;;;5527:33;:31;:33::i;:::-;5593:26;;5586:3;:33;;:68;;;;-1:-1:-1;5623:26:0;;:31;;5586:68;5582:132;;;5670:32;:30;:32::i;:::-;10010:48;10039:10;10051:6;10010:28;:48::i;:::-;10094:10;10069:11;10083:22;;;:10;:22;;;;;;-1:-1:-1;;;;;10083:22:0;10120:17;;10116:441;;-1:-1:-1;;;;;10206:24:0;;10154:18;10206:24;;;:19;:24;;;;;;;;10184:1;10231:31;;-1:-1:-1;;10231:35:0;;;10206:61;;;;;;;;:75;;10188:3;10175:10;;;:16;10206:75;;;;;;10321:31;;10175:16;;10362:19;;;;10184:1;10321:35;;;;10296:61;;;;;;;;;;;;;;;;:86;;;;;;;;10402:39;;;10413:10;10402:39;;-1:-1:-1;;;;;10402:39:0;;;;;;;;;;;;;;;;;;;;;;;;;10116:441;;;;10474:24;10499:31;;10539:6;;10474:24;-1:-1:-1;;10499:35:0;;;10474:61;;;;;;;;;;;;;;;:71;;;;;;;10116:441;-1:-1:-1;10587:10:0;10567:31;;;;:19;:31;;;;;;;;10599:24;:31;-1:-1:-1;;10599:35:0;10567:68;;;;;;;:78;;;;;;;9935:718::o;15673:43::-;;;;;;;;;;;;;;;:::o;17044:174::-;17151:5;;-1:-1:-1;;;;;17151:5:0;17137:10;:19;17129:28;;;;;;17168:18;:42;17044:174::o;34041:913::-;5470:16;;5463:3;:23;;:48;;;;-1:-1:-1;5490:16:0;;:21;;5463:48;5459:113;;;5527:33;:31;:33::i;:::-;5593:26;;5586:3;:33;;:68;;;;-1:-1:-1;5623:26:0;;:31;;5586:68;5582:132;;;5670:32;:30;:32::i;:::-;34114:22;;:::i;:::-;-1:-1:-1;34139:22:0;;;;:11;:22;;;;;;;;;34114:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34189:10;;34210:30;;;;;;-1:-1:-1;;;;;34277:21:0;;;;;;:13;:21;;;;;;;;:32;;;;;;;;;;;34276:33;34268:42;;;;;;34356:27;;;;:31;34352:123;;-1:-1:-1;;;;;34412:21:0;;;;;;:13;:21;;;;;;;;34434:27;;;;34412:50;;;;;;;;;;34404:59;;;;;;34487:17;34507:16;:14;:16::i;:::-;34561:10;34538:34;;;;:22;:34;;;;;;34487:36;;-1:-1:-1;34538:46:0;-1:-1:-1;34534:163:0;;;34624:10;34601:34;;;;:22;:34;;;;;:46;;;34662:23;;34682:2;34662:7;:23::i;:::-;34740:53;34769:6;34777:7;:15;;;34740:28;:53::i;:::-;34806:90;34829:6;34837:7;:20;;;34859:7;:14;;;34875:7;:20;;;34806:22;:90::i;:::-;-1:-1:-1;;;;;;34907:21:0;;;;;:13;:21;;;;;;;;:32;;;;;;;;;;:39;;-1:-1:-1;;34907:39:0;34942:4;34907:39;;;-1:-1:-1;34041:913:0:o;2738:31::-;;;;:::o;15776:58::-;15827:7;15776:58;:::o;9578:215::-;9674:5;;-1:-1:-1;;;;;9674:5:0;9660:10;:19;9652:28;;;;;;9771:5;;9749:36;;;-1:-1:-1;;;9749:36:0;;-1:-1:-1;;;;;9771:5:0;;;9749:36;;;;;;;;;;;;:21;;;;;;:36;;;;;;;;;;;;;;;9771:5;9749:21;:36;;;5:2:-1;;;;30:1;27;20:12;5:2;9749:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9749:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;15963:42:0;;;;:::o;6857:195::-;6917:15;6935:29;6957:6;6935:21;:29::i;:::-;-1:-1:-1;;;;;6975:23:0;;;;;;;:15;:23;;;;;;;;7001:3;6975:29;;7015:10;:18;;;;;:29;;;;;;;;-1:-1:-1;6857:195:0:o;19646:253::-;19802:10;19790:23;;;;:11;:23;;;;;;;;19782:32;;;;;;19825:66;19848:6;19856:12;19870:6;19878:12;19825:22;:66::i;16099:27::-;;;;:::o;35872:668::-;35940:7;;;;;;;36078:388;36102:12;;36098:1;:16;36078:388;;;-1:-1:-1;;;;;36208:18:0;;36136:14;36208:18;;;:10;:18;;;;;;;;36157:3;36153:7;;36208:26;;;;;;;;;36267:37;36219:6;36153:7;36208:26;36267:14;:37::i;:::-;36249:55;;;;36337:38;36353:6;36361;36369:5;36337:15;:38::i;:::-;36319:56;;;;36407:47;36432:6;36440;36448:5;36407:24;:47::i;:::-;36390:64;;;;-1:-1:-1;;36116:3:0;;36078:388;;;-1:-1:-1;36486:14:0;;36502;;-1:-1:-1;36486:14:0;;-1:-1:-1;35872:668:0;-1:-1:-1;;35872:668:0:o;16065:27::-;;;;:::o;8732:87::-;8778:20;:33;;8802:9;8778:33;;;8732:87::o;13113:448::-;13189:16;;13182:3;:23;;13174:32;;;;;;13219:29;13297:3;2081:1;13252:20;;:41;13251:49;;;;;13331:20;:45;;13251:49;;;;13331:45;;;;;;:20;13422:18;;13389:27;27:10:-1;;-1:-1;23:18;;;45:23;;;13389:52:0;;;;;;13452:29;27:10:-1;;23:18;;;45:23;;13452:57:0;;;;;;-1:-1:-1;13545:8:0;13539:3;:14;13520:16;:33;13113:448::o;30428:1572::-;5470:16;;5463:3;:23;;:48;;;;-1:-1:-1;5490:16:0;;:21;;5463:48;5459:113;;;5527:33;:31;:33::i;:::-;5593:26;;5586:3;:33;;:68;;;;-1:-1:-1;5623:26:0;;:31;;5586:68;5582:132;;;5670:32;:30;:32::i;:::-;30540:16;;:::i;:::-;-1:-1:-1;30559:16:0;;;;:8;:16;;;;;;;;;30540:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30540:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30586:39;;;;;;30642:28;30659:10;30642:16;:28::i;:::-;30638:639;;-1:-1:-1;;;;;30696:21:0;;30707:10;30696:21;;;;:46;;-1:-1:-1;;;;;;30721:21:0;;;;30696:46;30692:180;;;30775:10;30764:22;;;;:10;:22;;;;;;;;:32;;-1:-1:-1;;;;;30764:32:0;;-1:-1:-1;;;;;;30764:32:0;;;;;;;;30815:24;;;:15;:24;;;;;27:10:-1;;30764:32:0;23:18:-1;;45:23;;30815:41:0;;;;;;;;;;;;;;;;;;30692:180;30920:16;:14;:16::i;:::-;30906:10;30886:31;;;;:19;:31;;;;;:50;;;;30951:23;;30971:2;30951:7;:23::i;:::-;30989:7;27:10:-1;;39:1;23:18;;45:23;;-1:-1;30989:24:0;;;;;;;;-1:-1:-1;;;;;;30989:24:0;31002:10;30989:24;;;30638:639;;;31046:17;31066:16;:14;:16::i;:::-;31121:10;31101:31;;;;:19;:31;;;;;;31046:36;;-1:-1:-1;31101:43:0;-1:-1:-1;31097:169:0;;;31185:10;31165:31;;;;:19;:31;;;;;:43;;;31227:23;;31247:2;31227:7;:23::i;:::-;30638:639;;31297:12;31320:4;:16;;;31297:40;;31380:1;-1:-1:-1;;;;;31352:30:0;:4;-1:-1:-1;;;;;31352:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31352:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31352:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31352:16:0;-1:-1:-1;;;;;31352:30:0;;31348:268;;;31420:6;31430:8;31420:19;31407:9;:32;31399:41;;;;;;31476:39;;;-1:-1:-1;;;31476:39:0;;31504:10;31476:39;;;;;;-1:-1:-1;;;;;31476:10:0;;;;;31493:9;;31476:39;;;;;-1:-1:-1;;31476:39:0;;;;;;;;31493:9;31476:10;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;31476:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31476:39:0;;;;;31348:268;;;31561:16;;;;31548:56;;;-1:-1:-1;;;31548:56:0;;31585:10;31548:56;;;;;;;;;;;;-1:-1:-1;;;;;31548:36:0;;;;;;:56;;;;;-1:-1:-1;;31548:56:0;;;;;;;;-1:-1:-1;31548:36:0;:56;;;5:2:-1;;;;30:1;27;20:12;5:2;31548:56:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31548:56:0;;;;31348:268;31628:28;31645:10;31628:16;:28::i;:::-;31671:22;;;;:26;31667:243;;31743:10;31837:39;;;;:27;:39;;;;;;;;:47;;;;;;;;;31714:184;;31743:10;31831:66;;31832:2;:52;31890:6;31831:66;:58;:66;:::i;:::-;31808:10;31781:38;;;;:26;:38;;;;;;;;:46;;;;;;;;;31756:22;;;;:71;31755:142;31714:28;:184::i;:::-;-1:-1:-1;;31964:10:0;31953:22;;;;:10;:22;;;;;;;;:30;;;;;;;;;;;;:39;;;;31920:72;;-1:-1:-1;30428:1572:0:o;19243:182::-;19343:10;19331:23;;;;:11;:23;;;;;;;;19323:32;;;;;;-1:-1:-1;;;;;19388:18:0;;;;;;;:10;:18;;;;;:29;;;;;;;19243:182::o;9398:172::-;9485:5;;-1:-1:-1;;;;;9485:5:0;9471:10;:19;9463:28;;;;;;9521:11;;9502:31;;-1:-1:-1;;;;;9502:18:0;;;:31;;;;;;;;;9521:11;9502:18;:31;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;9544:18:0;9551:11;9544:18;9398:172::o;2234:26::-;;;;:::o;19433:205::-;19557:10;19545:23;;;;:11;:23;;;;;;;;19537:32;;;;;;19580:50;19609:6;19617:12;19580:28;:50::i;:::-;19433:205;;:::o;18371:286::-;18484:5;;-1:-1:-1;;;;;18484:5:0;18470:10;:19;18462:28;;;;;;18505:32;;;;:19;:32;;;;;;;;:40;;;;;;;;;18501:90;;18567:10;:12;;;;;;18501:90;18601:32;;;;:19;:32;;;;;;;;:40;;;;;;;;:48;18371:286::o;26000:1025::-;26073:19;26105:33;26158:3;;:10;;26141:28;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;26105:64:0;-1:-1:-1;26187:9:0;26182:803;26202:14;;;26182:803;;;26238:14;26255:3;;26259:1;26255:6;;;;;;;;;;;;;26238:23;;26298:26;:38;26325:10;-1:-1:-1;;;;;26298:38:0;-1:-1:-1;;;;;26298:38:0;;;;;;;;;;;;:46;26337:6;26298:46;;;;;;;;;;;;26276:13;26290:1;26276:16;;;;;;;;;;;;;;26293:1;26276:19;;;;;;;;;;;;;;;:68;;;;26409:10;26381:39;;;;:27;:39;;;;;;:47;;;;;;;;26359:16;;:13;;26373:1;;26359:16;;;;;;;;;;;;26376:1;26359:19;;;;;;;;;;;;;;;:69;;;;26485:10;26465:31;;;;:19;:31;;;;;;:39;;;;;;;;26443:16;;:13;;26457:1;;26443:16;;;;;;;;;;;;26460:1;26443:19;;;;;;;;;;;;;;;:61;;;;26562:10;26541:32;;;;:20;:32;;;;;;:40;;;;;;;;26519:16;;:13;;26533:1;;26519:16;;;;;;;;;;;;26536:1;26519:19;;;;;;;;;;;;;;;:62;;;;26639:10;26618:32;;;;:20;:32;;;;;;:40;;;;;;;;26596:16;;:13;;26610:1;;26596:16;;;;;;;;;;;;26613:1;26596:19;;;;;;;;;;;;;;;:62;;;;26717:10;26695:33;;;;:21;:33;;;;;;:41;;;;;;;;26673:16;;:13;;26687:1;;26673:16;;;;;;;;;;;;26690:1;26673:19;;;;;;;;;;;;;;;:63;;;;26798:10;26773:36;;;;;;;;;;;:44;;;;;;;;26751:16;;:13;;26765:1;;26751:16;;;;;;;;;;;;26768:1;26751:19;;;;;;;;;;;;;;;:66;;;;26880:10;26854:37;;;;:25;:37;;;;;;:45;;;;;;;;26832:16;;:13;;26846:1;;26832:16;;;;;;;;;;;;26849:1;26832:19;;;;;;;;;;;;;;;:67;;;;26954:10;26936:29;;;;:17;:29;;;;;;:37;;;;;;;;26914:16;;:13;;26928:1;;26914:16;;;;;;;;;;;;26931:1;26914:19;;;;;;;;;;:59;-1:-1:-1;26218:3:0;;26182:803;;25683:309;25756:13;25782:22;25818:3;;:10;;25807:22;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;25807:22:0;-1:-1:-1;25782:47:0;-1:-1:-1;25847:9:0;25842:115;25862:14;;;25842:115;;;25926:10;25912:25;;;;:13;:25;;;;;;25938:3;;25942:1;25938:6;;;;;;;;;;;;;25912:33;;;;;;;;;;;;;;;;;;;;;25898:8;25907:1;25898:11;;;;;;;;:47;;;:11;;;;;;;;;;;:47;25878:3;;25842:115;;2146:35;;;;:::o;12301:761::-;5470:16;;5463:3;:23;;:48;;;;-1:-1:-1;5490:16:0;;:21;;5463:48;5459:113;;;5527:33;:31;:33::i;:::-;5593:26;;5586:3;:33;;:68;;;;-1:-1:-1;5623:26:0;;:31;;5586:68;5582:132;;;5670:32;:30;:32::i;:::-;12417:10;12369:21;12393:35;;;:23;:35;;;;;;12461:28;:35;12393;;-1:-1:-1;;12461:39:0;;;12548;12544:401;;12621:13;12604:330;12641:11;12636:1;:16;12604:330;;12678:22;12703:24;12728:1;12703:27;;;;;;;;;;;;;;;;12678:52;;12770:1;12753:14;:18;12749:170;;;12867:10;12847:31;;;;:19;:31;;;;;;;;:34;;;;;;;;;12813:28;:31;;12885:14;;12847:34;12813:28;12879:1;;12813:31;;;;;;;;;;;;;;:68;12812:87;;;;;;12796:103;;;;12749:170;-1:-1:-1;12654:3:0;;12604:330;;;;12544:401;12981:10;12957:35;;;;:23;:35;;;;;;13009:1;12995:15;;12957:53;;13021:33;;;;;;13041:12;;13021:33;;12957:35;13021:33;13041:12;12981:10;13021:33;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;17744:619:0;17977:5;;-1:-1:-1;;;;;17977:5:0;17963:10;:19;17955:28;;;;;;18038:1;18002:12;;;:8;:12;;;;;:24;;;-1:-1:-1;;;;;18002:24:0;:38;17994:47;;;;;;18056:12;;;;:8;:12;;;;;:19;18052:180;;18101:14;;18097:124;;18136:12;:14;;;;;;18097:124;;;18191:12;:14;;;;;;18097:124;18257:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18257:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18242:12:0;;;:8;:12;;;;;;;:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18242:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17744:619::o;13610:537::-;13685:26;;13678:3;:33;;13670:42;;;;;;13757:20;;;13804:3;13756:51;;13838:44;;;;;;;13895:24;27:10:-1;;-1:-1;23:18;;;45:23;;;13725:28:0;13895:32;;;;;;;13980:28;27:10:-1;;23:18;;;45:23;;13980:55:0;;;;;14125:3;14131:8;14125:14;14096:26;:43;13610:537::o;3095:24::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3095:24:0;;-1:-1:-1;3095:24:0;:::o;2776:41::-;;;;:::o;7614:328::-;7804:8;7777:24;7794:6;7777:16;:24::i;:::-;-1:-1:-1;;;;;7706:30:0;;;;;;;:22;:30;;;;;;;;7737:29;:36;;7706:68;;;;;;;;7777:35;;;;7706:106;;;7857:36;;7823:31;;;:23;:31;;;;;;:70;7904:30;;;;;7614:328::o;42979:134::-;43037:7;43065:5;;;43085:6;;;;43077:15;;;;;;43106:1;42979:134;-1:-1:-1;;;42979:134:0:o;23439:1010::-;23557:17;23607:16;;;:8;:16;;;;;23648:1;23638:11;;23634:685;;;23675:13;23671:195;;23721:4;:16;;;23709:28;;23671:195;;;23821:4;:24;;;23810:8;:35;23848:1;23810:39;23790:4;:16;;;:60;23778:72;;23671:195;23634:685;;;23896:1;23887:6;:10;23883:436;;;23914:20;23953:12;;23949:177;;24085:4;:24;;;24080:1;24069:8;:12;24057:8;:25;:52;24044:8;24025:4;:16;;;:27;24024:86;24009:101;;23949:177;24153:20;:8;24166:6;24153:20;:12;:20;:::i;:::-;24142:31;;24295:12;24200:92;24235:56;24266:4;:24;;;24235:26;24259:1;24248:8;:12;24235:8;:12;;:26;;;;:::i;:::-;:30;:56;:30;:56;:::i;:::-;24200:16;;;;:30;;24221:8;24200:30;:20;:30;:::i;:::-;:34;:92;:34;:92;:::i;:::-;:107;24188:119;;23883:436;;24346:1;24335:8;:12;:30;;;;;24362:3;24351:8;:14;24335:30;24331:111;;;24427:3;24408:14;;;24395:28;;24394:36;24382:48;;24331:111;23439:1010;;;;;;;:::o;7060:546::-;7156:20;7179:29;7201:6;7179:21;:29::i;:::-;7156:52;;7240:12;7225;:27;7221:336;;;-1:-1:-1;;;;;7341:18:0;;7269:19;7341:18;;;:10;:18;;;;;;7291:27;;;;7341:33;-1:-1:-1;7341:33:0;7333:42;;;;;;-1:-1:-1;;;;;7390:18:0;;;;;;:10;:18;;;;;:33;;;;;;;;7221:336;;;-1:-1:-1;;;;;7516:18:0;;7456:15;7516:18;;;:10;:18;;;;;:29;;7474:27;;;7516:29;;;7221:336;-1:-1:-1;;;;;;;7569:23:0;;;;;:15;:23;;;;;7595:3;7569:29;;7060:546::o;42554:181::-;42612:7;42632:6;42628:37;;-1:-1:-1;42656:1:0;42649:8;;42628:37;42683:5;;;42687:1;42683;:5;:1;42703:5;;;;;:10;42695:19;;;;;39560:570;39629:28;;:::i;:::-;-1:-1:-1;;;;;;39660:19:0;;;;;;;:11;:19;;;;;;;;;39629:50;;;;;;;;;;;;;;;;-1:-1:-1;;;39629:50:0;;;;;;;;;;;-1:-1:-1;;;39629:50:0;;;;;;;;;;;;;;39716:21;;;39741:2;39715:28;39690:53;;39815:31;;:49;-1:-1:-1;;39811:312:0;;39907:22;;;;;;:31;;39906:50;;;-1:-1:-1;;;;;39881:75:0;;;;;39971:19;;;;;;;;;;40005;;;-1:-1:-1;40005:19:0;;;:11;:19;;;;;;;:33;;;;;;;;;;-1:-1:-1;;40005:33:0;;;;;;;-1:-1:-1;;40005:33:0;-1:-1:-1;;;40005:33:0;;;;;;;;;;;-1:-1:-1;;;40005:33:0;;;;;;;;;;;;;;39811:312;;;-1:-1:-1;;;;;;;40071:19:0;;;;;;;:11;:19;;;;;:40;;;;;-1:-1:-1;;;40071:40:0;;;;;;;;;;;;;;;;;;;39560:570::o;21805:1626::-;21932:22;21969:17;21965:1459;;-1:-1:-1;;;;;;22003:34:0;;;;;;:26;:34;;;;;;;;:42;;;;;;;;:58;;;;;;;22143:35;;;:27;:35;;;;;:43;;;;;;;;;22093:18;;;:10;:18;;;;;:26;;;;;;;;;:41;;22138:2;:48;;;22093:94;22202:50;22030:6;22093:94;22202:26;:50::i;:::-;21965:1459;;;22274:12;22290:1;22274:17;22270:1154;;;22308:16;;:::i;:::-;-1:-1:-1;;22327:16:0;;;;:8;:16;;;;;;;;22308:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22308:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22358;;;;;;:27;:35;;;;;:43;;;;;;;;:59;;;;;;;22519:34;;;:26;:34;;;;;:42;;;;;;;;;22494:22;;22449:18;;;:10;:18;;;;;:26;;;;;;;;;;;:41;;22494:67;;;;22449:113;;22577:50;22386:6;22449:113;22577:26;:50::i;:::-;22270:1154;;;;22649:12;22665:1;22649:17;22645:779;;;-1:-1:-1;;;;;22683:27:0;;;;;;:19;:27;;;;;;;;:35;;;;;;;;:51;;;;;;;22645:779;;;22756:12;22772:1;22756:17;22752:672;;;-1:-1:-1;;;;;22790:28:0;;;;;;:20;:28;;;;;;;;:36;;;;;;;;:52;;;;;;;22752:672;;;22864:12;22880:1;22864:17;22860:564;;;-1:-1:-1;;;;;22898:28:0;;;;;;:20;:28;;;;;;;;:36;;;;;;;;:52;;;;;;;22860:564;;;22972:12;22988:1;22972:17;22968:456;;;-1:-1:-1;;;;;23006:29:0;;;;;;:21;:29;;;;;;;;:37;;;;;;;;:53;;;;;;;22968:456;;;23081:12;23097:1;23081:17;23077:347;;;-1:-1:-1;;;;;23115:32:0;;;;;;:24;:32;;;;;;;:40;;;;;;;;:56;;;;;;;23077:347;;;23193:12;23209:1;23193:17;23189:235;;;-1:-1:-1;;;;;23227:33:0;;;;;;:25;:33;;;;;;;;:41;;;;;;;;:57;;;;;;;23189:235;;;23306:12;23322:1;23306:17;23302:122;;;-1:-1:-1;;;;;23340:25:0;;;;;;:17;:25;;;;;;;;:33;;;;;;;;:49;;;;;;;21805:1626;;;;;:::o;36548:723::-;36638:7;;;;;;;36776:421;36800:12;;36796:1;:16;36776:421;;;-1:-1:-1;;;;;36906:20:0;;36834:14;36906:20;;;:10;:20;;;;;;;;36855:3;36851:7;;36906:28;;;;;;;;;36967:39;36917:8;36851:7;36906:28;36967:14;:39::i;:::-;36949:57;;;;37038:49;37063:8;37073:6;37081:5;37038:24;:49::i;:::-;-1:-1:-1;;;;;37156:20:0;;;;;;:10;:20;;;;;;;;:28;;;;;;;;;37021:66;;;37122:63;;37138:8;;37148:6;;37122:15;:63::i;:::-;37104:81;;;;-1:-1:-1;;36814:3:0;;36776:421;;;-1:-1:-1;37217:14:0;;-1:-1:-1;37233:14:0;-1:-1:-1;37249:13:0;-1:-1:-1;36548:723:0;;;;;:::o;6391:290::-;-1:-1:-1;;;;;6500:23:0;;6461:7;6500:23;;;:15;:23;;;;;;6538:12;;;;;:30;;;6565:3;6554:8;:14;6538:30;6534:121;;;6640:3;6627:8;6621:3;:14;6593:24;6610:6;6593:16;:24::i;:::-;:43;6592:51;;;;;;6585:58;;;;;6534:121;-1:-1:-1;6672:1:0;;6391:290;-1:-1:-1;;6391:290:0:o;7950:774::-;8040:26;8069:24;8086:6;8069:16;:24::i;:::-;8040:53;-1:-1:-1;8104:21:0;8128:32;8040:53;8151:8;8128:32;:22;:32;:::i;:::-;8104:56;-1:-1:-1;8177:18:0;8173:420;;-1:-1:-1;;;;;8288:36:0;;;;;;:28;:36;;;;;;;;8325:29;:36;;8288:74;;;;;;;;:81;;-1:-1:-1;;8288:81:0;8365:4;8288:81;;;8391:30;;;:22;:30;;;;;8422:36;;8391:68;;;;;;;;8384:75;8173:420;;;-1:-1:-1;;;;;8497:30:0;;;;;;:22;:30;;;;;;;;8528:29;:36;8497:68;;;;;;;:84;;;8173:420;-1:-1:-1;;8639:29:0;:36;-1:-1:-1;;;;;8605:31:0;;;;;;;:23;:31;;;;;:70;;;;8686:30;;;;;7950:774::o;42859:114::-;42917:7;42946:1;42941;:6;;42933:15;;;;;;-1:-1:-1;42962:5:0;;;42859:114::o;19907:1631::-;20035:22;20072:17;20068:1463;;-1:-1:-1;;;;;;20106:34:0;;;;;;:26;:34;;;;;;;;:42;;;;;;;;:58;;;;;;20246:35;;;:27;:35;;;;;:43;;;;;;;;;20196:18;;;:10;:18;;;;;:26;;;;;;;;;:41;;20241:2;:48;;;20196:94;20305:52;20133:6;20196:94;20305:28;:52::i;20068:1463::-;20379:12;20395:1;20379:17;20375:1156;;;20413:16;;:::i;:::-;-1:-1:-1;;20432:16:0;;;;:8;:16;;;;;;;;20413:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20413:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20463;;;;;;:27;:35;;;;;:43;;;;;;;;:59;;;;;;20624:34;;;:26;:34;;;;;:42;;;;;;;;;20599:22;;20554:18;;;:10;:18;;;;;:26;;;;;;;;;;;:41;;20599:67;;;;20554:113;;20682:52;20491:6;20554:113;20682:28;:52::i;20375:1156::-;20756:12;20772:1;20756:17;20752:779;;;-1:-1:-1;;;;;20790:27:0;;;;;;:19;:27;;;;;;;;:35;;;;;;;;:51;;;;;;20752:779;;;20863:12;20879:1;20863:17;20859:672;;;-1:-1:-1;;;;;20897:28:0;;;;;;:20;:28;;;;;;;;:36;;;;;;;;:52;;;;;;20859:672;;;20971:12;20987:1;20971:17;20967:564;;;-1:-1:-1;;;;;21005:28:0;;;;;;:20;:28;;;;;;;;:36;;;;;;;;:52;;;;;;20967:564;;;21079:12;21095:1;21079:17;21075:456;;;-1:-1:-1;;;;;21113:29:0;;;;;;:21;:29;;;;;;;;:37;;;;;;;;:53;;;;;;21075:456;;;21188:12;21204:1;21188:17;21184:347;;;-1:-1:-1;;;;;21222:32:0;;;;;;:24;:32;;;;;;;:40;;;;;;;;:56;;;;;;21184:347;;;21300:12;21316:1;21300:17;21296:235;;;-1:-1:-1;;;;;21334:33:0;;;;;;:25;:33;;;;;;;;:41;;;;;;;;:57;;;;;;21296:235;;;21413:12;21429:1;21413:17;21409:122;;;-1:-1:-1;;;;;21447:25:0;;;;;;:17;:25;;;;;;;;:33;;;;;;;;:49;;;;;;19907:1631;;;;;:::o;14444:260::-;-1:-1:-1;;;;;14653:28:0;;14539:7;14653:28;;;:20;:28;;;;;;;;:36;;;;;;;;;14608:27;;;:19;:27;;;;;:35;;;;;;;;;14577:8;:16;;;;;:28;;;14539:7;;14694:2;;14648:41;;;14577:66;;14567:77;;:123;14566:130;;;14444:260;-1:-1:-1;;;;14444:260:0:o;14712:264::-;-1:-1:-1;;;;;14924:29:0;;14808:7;14924:29;;;:21;:29;;;;;;;;:37;;;;;;;;;14878:28;;;:20;:28;;;;;:36;;;;;;;;;14846:8;:16;;;;;:29;;;14808:7;;14966:2;;14919:42;;;14846:68;;14836:79;;:126;14835:133;;14984:288;-1:-1:-1;;;;;15216:33:0;;15089:7;15216:33;;;:25;:33;;;;;;;;:41;;;;;;;;;15166:32;;;;;;;;;:40;;;;;;;;;15127:8;:16;;;;;:36;;;15089:7;;15262:2;;15211:46;;;15127:79;;15117:90;;:141;15116:148;;1786:39209;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;1786:39209:0;;;-1:-1:-1;;1786:39209:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;1786:39209:0;;;-1:-1:-1;;1786:39209:0:o;:::-;;;;;;;;;-1:-1:-1;1786:39209:0;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1786:39209:0;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;1786:39209:0;;;-1:-1:-1;;1786:39209:0:o

Swarm Source

bzzr://3991c884608580ac47846142e97e0f0dbfea373f10bf364c34fcc94cb242d9ae

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
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.