ETH Price: $3,256.33 (-0.57%)
Gas: 2 Gwei

Contract

0x0Ce95ef378059F38c5FA21E6d81a5895c0d9911b
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Buy Stock Rocket147142412022-05-05 1:05:32815 days ago1651712732IN
EtherRockets
0.01 ETH0.0082159847.78014495
Buy Stock Rocket147078112022-05-04 0:25:35816 days ago1651623935IN
EtherRockets
0.01 ETH0.0115825867.35861383
Buy Stock Rocket147075362022-05-03 23:22:48816 days ago1651620168IN
EtherRockets
0.01 ETH0.0095131755.32398062
Buy Stock Rocket147075272022-05-03 23:19:06816 days ago1651619946IN
EtherRockets
0.01 ETH0.005693633.11123858
Buy Stock Rocket147075272022-05-03 23:19:06816 days ago1651619946IN
EtherRockets
0.01 ETH0.005693633.11123858
Buy Stock Rocket147075202022-05-03 23:18:22816 days ago1651619902IN
EtherRockets
0.01 ETH0.0066343838.58232449
Buy Stock Rocket147075092022-05-03 23:15:45816 days ago1651619745IN
EtherRockets
0.01 ETH0.0071185541.39804509
Buy Stock Rocket147074962022-05-03 23:12:35816 days ago1651619555IN
EtherRockets
0.01 ETH0.0073722442.87337783
Buy Stock Rocket147074902022-05-03 23:11:20816 days ago1651619480IN
EtherRockets
0.01 ETH0.0060683235.29040914
Buy Stock Rocket147074812022-05-03 23:10:09816 days ago1651619409IN
EtherRockets
0.01 ETH0.0074510143.33146195
Buy Stock Rocket147074782022-05-03 23:09:06816 days ago1651619346IN
EtherRockets
0.01 ETH0.0062792836.51725467
Buy Stock Rocket147074762022-05-03 23:08:25816 days ago1651619305IN
EtherRockets
0.01 ETH0.0057322637.01725467
Buy Stock Rocket147074742022-05-03 23:08:00816 days ago1651619280IN
EtherRockets
0.01 ETH0.0049491931.96039599
Buy Stock Rocket147074702022-05-03 23:07:35816 days ago1651619255IN
EtherRockets
0.01 ETH0.0052683234.02126437
Buy Stock Rocket147074642022-05-03 23:06:57816 days ago1651619217IN
EtherRockets
0.01 ETH0.0074813643.5079159
Buy Stock Rocket147074622022-05-03 23:06:13816 days ago1651619173IN
EtherRockets
0.01 ETH0.0070501141
Buy Stock Rocket147074522022-05-03 23:03:51816 days ago1651619031IN
EtherRockets
0.01 ETH0.0067024143.28217643
Buy Stock Rocket147074492022-05-03 23:02:44816 days ago1651618964IN
EtherRockets
0.01 ETH0.0060246835.03659999
Buy Stock Rocket147074492022-05-03 23:02:44816 days ago1651618964IN
EtherRockets
0.01 ETH0.0060246835.03659999
Buy Stock Rocket147074492022-05-03 23:02:44816 days ago1651618964IN
EtherRockets
0.01 ETH0.0055029835.53659999
Buy Stock Rocket147074482022-05-03 23:02:39816 days ago1651618959IN
EtherRockets
0.01 ETH0.0064271737.37727547
Buy Stock Rocket147074432022-05-03 23:01:46816 days ago1651618906IN
EtherRockets
0.01 ETH0.0071277541.45149757
Buy Stock Rocket147074422022-05-03 23:01:18816 days ago1651618878IN
EtherRockets
0.01 ETH0.0067938739.50981418
Buy Stock Rocket147074362022-05-03 23:00:16816 days ago1651618816IN
EtherRockets
0.01 ETH0.0072376342.09052755
Buy Stock Rocket147074312022-05-03 22:59:16816 days ago1651618756IN
EtherRockets
0.01 ETH0.0075062343.65258316
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
147142412022-05-05 1:05:32815 days ago1651712732
EtherRockets
0.01 ETH
147078112022-05-04 0:25:35816 days ago1651623935
EtherRockets
0.01 ETH
147075362022-05-03 23:22:48816 days ago1651620168
EtherRockets
0.01 ETH
147075272022-05-03 23:19:06816 days ago1651619946
EtherRockets
0.01 ETH
147075272022-05-03 23:19:06816 days ago1651619946
EtherRockets
0.01 ETH
147075202022-05-03 23:18:22816 days ago1651619902
EtherRockets
0.01 ETH
147075092022-05-03 23:15:45816 days ago1651619745
EtherRockets
0.01 ETH
147074962022-05-03 23:12:35816 days ago1651619555
EtherRockets
0.01 ETH
147074902022-05-03 23:11:20816 days ago1651619480
EtherRockets
0.01 ETH
147074812022-05-03 23:10:09816 days ago1651619409
EtherRockets
0.01 ETH
147074782022-05-03 23:09:06816 days ago1651619346
EtherRockets
0.01 ETH
147074762022-05-03 23:08:25816 days ago1651619305
EtherRockets
0.01 ETH
147074742022-05-03 23:08:00816 days ago1651619280
EtherRockets
0.01 ETH
147074702022-05-03 23:07:35816 days ago1651619255
EtherRockets
0.01 ETH
147074642022-05-03 23:06:57816 days ago1651619217
EtherRockets
0.01 ETH
147074622022-05-03 23:06:13816 days ago1651619173
EtherRockets
0.01 ETH
147074522022-05-03 23:03:51816 days ago1651619031
EtherRockets
0.01 ETH
147074492022-05-03 23:02:44816 days ago1651618964
EtherRockets
0.01 ETH
147074492022-05-03 23:02:44816 days ago1651618964
EtherRockets
0.01 ETH
147074492022-05-03 23:02:44816 days ago1651618964
EtherRockets
0.01 ETH
147074482022-05-03 23:02:39816 days ago1651618959
EtherRockets
0.01 ETH
147074432022-05-03 23:01:46816 days ago1651618906
EtherRockets
0.01 ETH
147074422022-05-03 23:01:18816 days ago1651618878
EtherRockets
0.01 ETH
147074362022-05-03 23:00:16816 days ago1651618816
EtherRockets
0.01 ETH
147074312022-05-03 22:59:16816 days ago1651618756
EtherRockets
0.01 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Game

Compiler Version
v0.4.19+commit.c4cbbb05

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-01-18
*/

pragma solidity ^0.4.13;

contract AbstractDatabase
{
    function() public payable;
    function ChangeOwner(address new_owner) public;
    function ChangeOwner2(address new_owner) public;
    function Store(address user, uint256 category, uint256 slot, bytes32 data) public;
    function Load(address user, uint256 category, uint256 index) public view returns (bytes32);
    function TransferFunds(address target, uint256 transfer_amount) public;
}

contract AbstractGameHidden
{
    function CalculateFinalDistance(bytes32 raw0, bytes32 raw1, bytes32 raw2, bytes32 raw3) pure public returns (int64, int64, uint64);
}

library CompetitionScoreTypes
{
    using Serializer for Serializer.DataComponent;

    struct CompetitionScore
    {
        address m_Owner; // 0
        uint64 m_Distance; // 20
        uint32 m_RocketId; // 28
    }

    function SerializeCompetitionScore(CompetitionScore score) internal pure returns (bytes32)
    {
        Serializer.DataComponent memory data;
        data.WriteAddress(0, score.m_Owner);
        data.WriteUint64(20, score.m_Distance);
        data.WriteUint32(28, score.m_RocketId);
        return data.m_Raw;
    }

    function DeserializeCompetitionScore(bytes32 raw) internal pure returns (CompetitionScore)
    {
        CompetitionScore memory score;

        Serializer.DataComponent memory data;
        data.m_Raw = raw;

        score.m_Owner = data.ReadAddress(0);
        score.m_Distance = data.ReadUint64(20);
        score.m_RocketId = data.ReadUint32(28);

        return score;
    }
}

contract Game
{
    using GlobalTypes for GlobalTypes.Global;
    using MarketTypes for MarketTypes.MarketListing;
    using MissionParametersTypes for MissionParametersTypes.MissionParameters;
    using GameCommon for GameCommon.LaunchRocketStackFrame;

    address public m_Owner;
    AbstractDatabase public m_Database;
    AbstractGameHidden public m_GameHidden;
    bool public m_Paused;

    uint256 constant GlobalCategory = 0;
    uint256 constant RocketCategory = 1;
    uint256 constant OwnershipCategory = 2;
    uint256 constant InventoryCategory = 3;
    uint256 constant MarketCategory = 4;
    uint256 constant ProfitFundsCategory = 5;
    uint256 constant CompetitionFundsCategory = 6;
    uint256 constant MissionParametersCategory = 7;
    uint256 constant CompetitionScoresCategory = 8;
    uint256 constant WithdrawalFundsCategory = 9;
    uint256 constant ReferralCategory = 10;
    uint256 constant RocketStockCategory = 11;
    uint256 constant RocketStockInitializedCategory = 12;

    address constant NullAddress = 0;
    uint256 constant MaxCompetitionScores = 10;

    mapping(uint32 => RocketTypes.StockRocket) m_InitialRockets;

    modifier OnlyOwner()
    {
        require(msg.sender == m_Owner);

        _;
    }

    modifier NotWhilePaused()
    {
        require(m_Paused == false);

        _;
    }

    function Game() public
    {
        m_Owner = msg.sender;
        m_Paused = true;
    }

    event BuyStockRocketEvent(address indexed buyer, uint32 stock_id, uint32 rocket_id, address referrer);
    event PlaceRocketForSaleEvent(address indexed seller, uint32 rocket_id, uint80 price);
    event RemoveRocketForSaleEvent(address indexed seller, uint32 rocket_id);
    event BuyRocketForSaleEvent(address indexed buyer, address indexed seller, uint32 rocket_id);
    event LaunchRocketEvent(address indexed launcher, uint32 competition_id, int64 leo_displacement, int64 planet_displacement);
    event StartCompetitionEvent(uint32 competition_id);
    event FinishCompetitionEvent(uint32 competition_id);

    function ChangeOwner(address new_owner) public OnlyOwner()
    {
        m_Owner = new_owner;
    }

    function ChangeDatabase(address db) public OnlyOwner()
    {
        m_Database = AbstractDatabase(db);
    }

    function ChangeGameHidden(address hidden) public OnlyOwner()
    {
        m_GameHidden = AbstractGameHidden(hidden);
    }

    function Unpause() public OnlyOwner()
    {
        m_Paused = false;
    }

    function Pause() public OnlyOwner()
    {
        require(m_Paused == false);

        m_Paused = true;
    }

    function IsPaused() public view returns (bool)
    {
        return m_Paused;
    }

    // 1 write
    function WithdrawProfitFunds(uint256 withdraw_amount, address beneficiary) public NotWhilePaused() OnlyOwner()
    {
        uint256 profit_funds = uint256(m_Database.Load(NullAddress, ProfitFundsCategory, 0));

        require(withdraw_amount > 0);
        require(withdraw_amount <= profit_funds);
        require(beneficiary != address(0));
        require(beneficiary != address(this));
        require(beneficiary != address(m_Database));

        profit_funds -= withdraw_amount;

        m_Database.Store(NullAddress, ProfitFundsCategory, 0, bytes32(profit_funds));

        m_Database.TransferFunds(beneficiary, withdraw_amount);
    }

    // 1 write
    function WithdrawWinnings(uint256 withdraw_amount) public NotWhilePaused()
    {
        require(withdraw_amount > 0);

        uint256 withdrawal_funds = uint256(m_Database.Load(msg.sender, WithdrawalFundsCategory, 0));
        require(withdraw_amount <= withdrawal_funds);

        withdrawal_funds -= withdraw_amount;

        m_Database.Store(msg.sender, WithdrawalFundsCategory, 0, bytes32(withdrawal_funds));

        m_Database.TransferFunds(msg.sender, withdraw_amount);
    }

    function GetRocket(uint32 rocket_id) view public returns (bool is_valid, uint32 top_speed, uint32 thrust, uint32 weight, uint32 fuel_capacity, uint16 stock_id, uint64 max_distance, bool is_for_sale, address owner)
    {
        RocketTypes.Rocket memory rocket = RocketTypes.DeserializeRocket(m_Database.Load(NullAddress, RocketCategory, rocket_id));

        is_valid = rocket.m_Version >= 1;
        is_for_sale = rocket.m_IsForSale == 1;
        top_speed = rocket.m_TopSpeed;
        thrust = rocket.m_Thrust;
        weight = rocket.m_Weight;
        fuel_capacity = rocket.m_FuelCapacity;
        stock_id = rocket.m_StockId;
        max_distance = rocket.m_MaxDistance;

        owner = GetRocketOwner(rocket_id);
    }

    function GetWithdrawalFunds(address target) view public NotWhilePaused() returns (uint256 funds)
    {
        funds = uint256(m_Database.Load(target, WithdrawalFundsCategory, 0));
    }

    function GetProfitFunds() view public OnlyOwner() returns (uint256 funds)
    {
        uint256 profit_funds = uint256(m_Database.Load(NullAddress, ProfitFundsCategory, 0));
        return profit_funds;
    }

    function GetCompetitionFunds(uint32 competition_id) view public returns (uint256 funds)
    {
        return uint256(m_Database.Load(NullAddress, CompetitionFundsCategory, competition_id));
    }

    function GetRocketOwner(uint32 rocket_id) view internal returns (address owner)
    {
        OwnershipTypes.Ownership memory ownership = OwnershipTypes.DeserializeOwnership(m_Database.Load(NullAddress, OwnershipCategory, rocket_id));
        owner = ownership.m_Owner;
    }

    function GetAuction(uint32 rocket_id) view public returns (bool is_for_sale, address owner, uint80 price)
    {
        RocketTypes.Rocket memory rocket = RocketTypes.DeserializeRocket(m_Database.Load(NullAddress, RocketCategory, rocket_id));
        is_for_sale = rocket.m_IsForSale == 1;

        OwnershipTypes.Ownership memory ownership = OwnershipTypes.DeserializeOwnership(m_Database.Load(NullAddress, OwnershipCategory, rocket_id));
        owner = ownership.m_Owner;

        MarketTypes.MarketListing memory listing = MarketTypes.DeserializeMarketListing(m_Database.Load(NullAddress, MarketCategory, rocket_id));
        price = listing.m_Price;
    }

    function GetInventoryCount(address target) view public returns (uint256)
    {
        require(target != address(0));

        uint256 inventory_count = uint256(m_Database.Load(target, InventoryCategory, 0));

        return inventory_count;
    }

    function GetInventory(address target, uint256 start_index) view public returns (uint32[8] rocket_ids)
    {
        require(target != address(0));

        uint256 inventory_count = GetInventoryCount(target);

        uint256 end = start_index + 8;
        if (end > inventory_count)
            end = inventory_count;

        for (uint256 i = start_index; i < end; i++)
        {
            rocket_ids[i - start_index] = uint32(uint256(m_Database.Load(target, InventoryCategory, i + 1)));
        }
    }

    // 1 write
    function AddRocket(uint32 stock_id, uint64 cost, uint32 min_top_speed, uint32 max_top_speed, uint32 min_thrust, uint32 max_thrust, uint32 min_weight, uint32 max_weight, uint32 min_fuel_capacity, uint32 max_fuel_capacity, uint64 distance, uint32 max_stock) OnlyOwner() public
    {
        m_InitialRockets[stock_id] = RocketTypes.StockRocket({
            m_IsValid: true,
            m_Cost: cost,
            m_MinTopSpeed: min_top_speed,
            m_MaxTopSpeed: max_top_speed,
            m_MinThrust: min_thrust,
            m_MaxThrust: max_thrust,
            m_MinWeight: min_weight,
            m_MaxWeight: max_weight,
            m_MinFuelCapacity: min_fuel_capacity,
            m_MaxFuelCapacity: max_fuel_capacity,
            m_Distance: distance
        });

        min_top_speed = uint32(m_Database.Load(NullAddress, RocketStockInitializedCategory, stock_id));

        if (min_top_speed == 0)
        {
            m_Database.Store(NullAddress, RocketStockCategory, stock_id, bytes32(max_stock));
            m_Database.Store(NullAddress, RocketStockInitializedCategory, stock_id, bytes32(1));
        }
    }

    function GetRocketStock(uint16 stock_id) public view returns (uint32)
    {
        return uint32(m_Database.Load(NullAddress, RocketStockCategory, stock_id));
    }

    // 6 writes
    function BuyStockRocket(uint16 stock_id, address referrer) payable NotWhilePaused() public
    {
        //require(referrer != msg.sender);
        uint32 stock = GetRocketStock(stock_id);

        require(stock > 0);

        GiveRocketInternal(stock_id, msg.sender, true, referrer);

        stock--;

        m_Database.Store(NullAddress, RocketStockCategory, stock_id, bytes32(stock));
    }

    function GiveReferralRocket(uint16 stock_id, address target) public NotWhilePaused() OnlyOwner()
    {
        uint256 already_received = uint256(m_Database.Load(target, ReferralCategory, 0));
        require(already_received == 0);

        already_received = 1;
        m_Database.Store(target, ReferralCategory, 0, bytes32(already_received));

        GiveRocketInternal(stock_id, target, false, address(0));
    }

    function GiveRocketInternal(uint16 stock_id, address target, bool buying, address referrer) internal
    {
        RocketTypes.StockRocket storage stock_rocket = m_InitialRockets[stock_id];

        require(stock_rocket.m_IsValid);
        if (buying)
        {
            require(msg.value == stock_rocket.m_Cost);
        }

        GlobalTypes.Global memory global = GlobalTypes.DeserializeGlobal(m_Database.Load(NullAddress, GlobalCategory, 0));

        uint256 profit_funds = uint256(m_Database.Load(NullAddress, ProfitFundsCategory, 0));

        global.m_LastRocketId++;
        uint32 next_rocket_id = global.m_LastRocketId;

        uint256 inventory_count = GetInventoryCount(target);
        inventory_count++;

        RocketTypes.Rocket memory rocket;
        rocket.m_Version = 1;
        rocket.m_StockId = stock_id;
        rocket.m_IsForSale = 0;

        bytes32 rand = sha256(block.timestamp, block.coinbase, global.m_LastRocketId);

        // Fix LerpExtra calls in FinishCompetition if anything is added here
        rocket.m_TopSpeed = uint32(Lerp(stock_rocket.m_MinTopSpeed, stock_rocket.m_MaxTopSpeed, rand[0]));
        rocket.m_Thrust = uint32(Lerp(stock_rocket.m_MinThrust, stock_rocket.m_MaxThrust, rand[1]));
        rocket.m_Weight = uint32(Lerp(stock_rocket.m_MinWeight, stock_rocket.m_MaxWeight, rand[2]));
        rocket.m_FuelCapacity = uint32(Lerp(stock_rocket.m_MinFuelCapacity, stock_rocket.m_MaxFuelCapacity, rand[3]));
        rocket.m_MaxDistance = uint64(stock_rocket.m_Distance);
        //

        OwnershipTypes.Ownership memory ownership;
        ownership.m_Owner = target;
        ownership.m_OwnerInventoryIndex = uint32(inventory_count) - 1;

        profit_funds += msg.value;

        m_Database.Store(target, InventoryCategory, inventory_count, bytes32(next_rocket_id));
        m_Database.Store(target, InventoryCategory, 0, bytes32(inventory_count));
        m_Database.Store(NullAddress, RocketCategory, next_rocket_id, RocketTypes.SerializeRocket(rocket));
        m_Database.Store(NullAddress, OwnershipCategory, next_rocket_id, OwnershipTypes.SerializeOwnership(ownership));
        m_Database.Store(NullAddress, GlobalCategory, 0, GlobalTypes.SerializeGlobal(global));
        if (buying)
        {
            m_Database.Store(NullAddress, ProfitFundsCategory, 0, bytes32(profit_funds));

            m_Database.transfer(msg.value);
        }
        BuyStockRocketEvent(target, stock_id, next_rocket_id, referrer);
    }

    // 2 writes
    function PlaceRocketForSale(uint32 rocket_id, uint80 price) NotWhilePaused() public
    {
        RocketTypes.Rocket memory rocket = RocketTypes.DeserializeRocket(m_Database.Load(NullAddress, RocketCategory, rocket_id));
        require(rocket.m_Version > 0);

        OwnershipTypes.Ownership memory ownership = OwnershipTypes.DeserializeOwnership(m_Database.Load(NullAddress, OwnershipCategory, rocket_id));
        require(ownership.m_Owner == msg.sender);

        require(rocket.m_IsForSale == 0);

        MarketTypes.MarketListing memory listing;
        listing.m_Price = price;

        rocket.m_IsForSale = 1;

        m_Database.Store(NullAddress, RocketCategory, rocket_id, RocketTypes.SerializeRocket(rocket));
        m_Database.Store(NullAddress, MarketCategory, rocket_id, MarketTypes.SerializeMarketListing(listing));

        PlaceRocketForSaleEvent(msg.sender, rocket_id, price);
    }

    // 1 write
    function RemoveRocketForSale(uint32 rocket_id) NotWhilePaused() public
    {
        RocketTypes.Rocket memory rocket = RocketTypes.DeserializeRocket(m_Database.Load(NullAddress, RocketCategory, rocket_id));
        require(rocket.m_Version > 0);
        require(rocket.m_IsForSale == 1);

        OwnershipTypes.Ownership memory ownership = OwnershipTypes.DeserializeOwnership(m_Database.Load(NullAddress, OwnershipCategory, rocket_id));
        require(ownership.m_Owner == msg.sender);

        rocket.m_IsForSale = 0;

        m_Database.Store(NullAddress, RocketCategory, rocket_id, RocketTypes.SerializeRocket(rocket));

        RemoveRocketForSaleEvent(msg.sender, rocket_id);
    }

    // 9-11 writes
    function BuyRocketForSale(uint32 rocket_id) payable NotWhilePaused() public
    {
        RocketTypes.Rocket memory rocket = RocketTypes.DeserializeRocket(m_Database.Load(NullAddress, RocketCategory, rocket_id));
        require(rocket.m_Version > 0);

        require(rocket.m_IsForSale == 1);

        OwnershipTypes.Ownership memory ownership = OwnershipTypes.DeserializeOwnership(m_Database.Load(NullAddress, OwnershipCategory, rocket_id));
        require(ownership.m_Owner != msg.sender);

        MarketTypes.MarketListing memory listing = MarketTypes.DeserializeMarketListing(m_Database.Load(NullAddress, MarketCategory, rocket_id));
        require(msg.value == listing.m_Price);

        uint256 seller_inventory_count = uint256(m_Database.Load(ownership.m_Owner, InventoryCategory, 0));
        uint256 buyer_inventory_count = uint256(m_Database.Load(msg.sender, InventoryCategory, 0));

        uint256 profit_funds_or_last_rocket_id;
        uint256 wei_for_profit_funds;
        uint256 buyer_price_or_wei_for_seller = uint256(listing.m_Price);

        address beneficiary = ownership.m_Owner;
        ownership.m_Owner = msg.sender;
        rocket.m_IsForSale = 0;

        listing.m_Price = 0;

        buyer_inventory_count++;
        profit_funds_or_last_rocket_id = uint256(m_Database.Load(beneficiary, InventoryCategory, seller_inventory_count));

        m_Database.Store(beneficiary, InventoryCategory, seller_inventory_count, bytes32(0));

        if (ownership.m_OwnerInventoryIndex + 1 != seller_inventory_count)
        {
            m_Database.Store(beneficiary, InventoryCategory, ownership.m_OwnerInventoryIndex + 1, bytes32(profit_funds_or_last_rocket_id));

            OwnershipTypes.Ownership memory last_rocket_ownership = OwnershipTypes.DeserializeOwnership(m_Database.Load(NullAddress, OwnershipCategory, profit_funds_or_last_rocket_id));
            last_rocket_ownership.m_OwnerInventoryIndex = uint32(ownership.m_OwnerInventoryIndex);

            m_Database.Store(NullAddress, OwnershipCategory, profit_funds_or_last_rocket_id, OwnershipTypes.SerializeOwnership(last_rocket_ownership));
        }

        ownership.m_OwnerInventoryIndex = uint32(buyer_inventory_count);
        m_Database.Store(msg.sender, InventoryCategory, buyer_inventory_count, bytes32(rocket_id));

        wei_for_profit_funds = buyer_price_or_wei_for_seller / 20;
        buyer_price_or_wei_for_seller = buyer_price_or_wei_for_seller - wei_for_profit_funds;

        profit_funds_or_last_rocket_id = uint256(m_Database.Load(NullAddress, ProfitFundsCategory, 0));
        profit_funds_or_last_rocket_id += wei_for_profit_funds;

        seller_inventory_count--;
        m_Database.Store(msg.sender, InventoryCategory, 0, bytes32(buyer_inventory_count));
        m_Database.Store(beneficiary, InventoryCategory, 0, bytes32(seller_inventory_count));

        m_Database.Store(NullAddress, OwnershipCategory, rocket_id, OwnershipTypes.SerializeOwnership(ownership));
        m_Database.Store(NullAddress, RocketCategory, rocket_id, RocketTypes.SerializeRocket(rocket));
        m_Database.Store(NullAddress, MarketCategory, rocket_id, MarketTypes.SerializeMarketListing(listing));
        m_Database.Store(NullAddress, ProfitFundsCategory, 0, bytes32(profit_funds_or_last_rocket_id));

        buyer_price_or_wei_for_seller += uint256(m_Database.Load(beneficiary, WithdrawalFundsCategory, 0)); // Reuse variable
        m_Database.Store(beneficiary, WithdrawalFundsCategory, 0, bytes32(buyer_price_or_wei_for_seller));

        m_Database.transfer(msg.value);
        BuyRocketForSaleEvent(msg.sender, beneficiary, rocket_id);
    }

    // 3 writes + 1-12 writes = 4-15 writes
    function LaunchRocket(uint32 competition_id, uint32 rocket_id, uint32 launch_thrust, uint32 fuel_to_use, uint32 fuel_allocation_for_launch, uint32 stabilizer_setting) payable NotWhilePaused() public
    {
        GameCommon.LaunchRocketStackFrame memory stack;
        stack.m_Rocket = RocketTypes.DeserializeRocket(m_Database.Load(NullAddress, RocketCategory, rocket_id));
        stack.m_Mission =  MissionParametersTypes.DeserializeMissionParameters(m_Database.Load(NullAddress, MissionParametersCategory, competition_id));
        stack.m_Ownership = OwnershipTypes.DeserializeOwnership(m_Database.Load(NullAddress, OwnershipCategory, rocket_id));

        require(stack.m_Mission.m_IsStarted == 1);
        require(stack.m_Rocket.m_Version > 0);
        require(stack.m_Rocket.m_IsForSale == 0);
        require(msg.value == uint256(stack.m_Mission.m_LaunchCost));
        require(stack.m_Ownership.m_Owner == msg.sender);
        require(launch_thrust <= stack.m_Rocket.m_Thrust);

        stack.m_MissionWindSpeed = stack.m_Mission.m_WindSpeed;
        stack.m_MissionLaunchLocation = stack.m_Mission.m_LaunchLocation;
        stack.m_MissionWeatherType = stack.m_Mission.m_WeatherType;
        stack.m_MissionWeatherCoverage = stack.m_Mission.m_WeatherCoverage;
        stack.m_MissionTargetDistance = stack.m_Mission.m_TargetDistance;
        stack.m_DebugExtraDistance = stack.m_Mission.m_DebugExtraDistance;

        stack.m_RocketTopSpeed = stack.m_Rocket.m_TopSpeed;
        stack.m_RocketThrust = stack.m_Rocket.m_Thrust;
        stack.m_RocketMass = stack.m_Rocket.m_Weight;
        stack.m_RocketFuelCapacity = stack.m_Rocket.m_FuelCapacity;
        stack.m_RocketMaxDistance = int64(stack.m_Rocket.m_MaxDistance);

        stack.m_CompetitionId = competition_id;
        stack.m_RocketId = rocket_id;
        stack.m_LaunchThrust = launch_thrust * 100 / stack.m_Rocket.m_Thrust;
        stack.m_FuelToUse = fuel_to_use;
        stack.m_FuelAllocationForLaunch = fuel_allocation_for_launch;
        stack.m_StabilizerSetting = stabilizer_setting;
        stack.m_Launcher = msg.sender;

        LaunchRocketInternal(stack);
    }

    // 3 writes
    function LaunchRocketInternal(GameCommon.LaunchRocketStackFrame memory stack) internal
    {
        stack.SerializeLaunchRocketStackFrame();

        (stack.m_DisplacementFromLowEarthOrbit, stack.m_DisplacementFromPlanet, stack.m_FinalDistance) = m_GameHidden.CalculateFinalDistance(
            stack.m_Raw0,
            stack.m_Raw1,
            stack.m_Raw2,
            stack.m_Raw3
        );

        AddScore(stack);

        stack.m_ProfitFunds = msg.value / 10;
        stack.m_CompetitionFunds = msg.value - stack.m_ProfitFunds;

        stack.m_ProfitFunds += uint256(m_Database.Load(NullAddress, ProfitFundsCategory, 0));
        stack.m_CompetitionFunds += uint256(m_Database.Load(NullAddress, CompetitionFundsCategory, stack.m_CompetitionId));

        m_Database.Store(NullAddress, ProfitFundsCategory, 0, bytes32(stack.m_ProfitFunds));
        m_Database.Store(NullAddress, CompetitionFundsCategory, stack.m_CompetitionId, bytes32(stack.m_CompetitionFunds));
        m_Database.Store(NullAddress, MissionParametersCategory, stack.m_CompetitionId, stack.m_Mission.SerializeMissionParameters());

        m_Database.transfer(msg.value);
        LaunchRocketEvent(msg.sender, stack.m_CompetitionId, stack.m_DisplacementFromLowEarthOrbit, stack.m_DisplacementFromPlanet);
    }

    // 0-1 writes
    function AddScore(GameCommon.LaunchRocketStackFrame memory stack) internal
    {
        CompetitionScoreTypes.CompetitionScore memory new_score;
        new_score.m_Owner = stack.m_Launcher;
        new_score.m_Distance = stack.m_FinalDistance;
        new_score.m_RocketId = stack.m_RocketId;

        CompetitionScoreTypes.CompetitionScore memory score;

        for (uint32 i = 0; i < stack.m_Mission.m_ValidCompetitionScores; i++)
        {
            // Check if the new score is better than the score that this user already has (if they are in the top x)
            score = CompetitionScoreTypes.DeserializeCompetitionScore(m_Database.Load(stack.m_CompetitionId, CompetitionScoresCategory, i));

            if (score.m_Owner == stack.m_Launcher)
            {
                if (stack.m_FinalDistance < score.m_Distance)
                {
                    m_Database.Store(stack.m_CompetitionId, CompetitionScoresCategory, i, CompetitionScoreTypes.SerializeCompetitionScore(new_score));
                }
                return;
            }
        }

        if (stack.m_Mission.m_ValidCompetitionScores < MaxCompetitionScores)
        {
            // Not enough scores, so this one is automatically one of the best
            m_Database.Store(stack.m_CompetitionId, CompetitionScoresCategory, stack.m_Mission.m_ValidCompetitionScores, CompetitionScoreTypes.SerializeCompetitionScore(new_score));

            stack.m_Mission.m_ValidCompetitionScores++;
            return;
        }

        uint64 highest_distance = 0;
        uint32 highest_index = 0xFFFFFFFF;
        for (i = 0; i < stack.m_Mission.m_ValidCompetitionScores; i++)
        {
            score = CompetitionScoreTypes.DeserializeCompetitionScore(m_Database.Load(stack.m_CompetitionId, CompetitionScoresCategory, i));

            if (score.m_Distance > highest_distance)
            {
                highest_distance = score.m_Distance;
                highest_index = i;
            }
        }

        if (highest_index != 0xFFFFFFFF)
        {
            score = CompetitionScoreTypes.DeserializeCompetitionScore(m_Database.Load(stack.m_CompetitionId, CompetitionScoresCategory, highest_index));

            // Check if the new score is better than the highest score
            if (stack.m_FinalDistance < score.m_Distance)
            {
                m_Database.Store(stack.m_CompetitionId, CompetitionScoresCategory, highest_index, CompetitionScoreTypes.SerializeCompetitionScore(new_score));
                return;
            }
        }
    }

    function GetCompetitionInfo(uint32 competition_id) view NotWhilePaused() public returns (bool in_progress, uint8 wind_speed, uint8 launch_location, uint8 weather_type, uint8 weather_coverage, uint80 launch_cost, uint32 target_distance)
    {
        MissionParametersTypes.MissionParameters memory parameters = MissionParametersTypes.DeserializeMissionParameters(m_Database.Load(NullAddress, MissionParametersCategory, competition_id));

        in_progress = parameters.m_IsStarted == 1;
        wind_speed = parameters.m_WindSpeed;
        launch_location = parameters.m_LaunchLocation;
        weather_type = parameters.m_WeatherType;
        weather_coverage = parameters.m_WeatherCoverage;
        launch_cost = parameters.m_LaunchCost;
        target_distance = parameters.m_TargetDistance;
    }

    function SetDebugExtra(uint32 competition_id, uint8 extra) public OnlyOwner()
    {
        MissionParametersTypes.MissionParameters memory parameters = MissionParametersTypes.DeserializeMissionParameters(m_Database.Load(NullAddress, MissionParametersCategory, competition_id));

        parameters.m_DebugExtraDistance = extra;

        m_Database.Store(NullAddress, MissionParametersCategory, competition_id, parameters.SerializeMissionParameters());
    }

    // 2 writes
    function StartCompetition(uint8 wind_speed, uint8 launch_location, uint8 weather_type, uint8 weather_coverage, uint80 launch_cost, uint32 target_distance) public NotWhilePaused() OnlyOwner()
    {
        GlobalTypes.Global memory global = GlobalTypes.DeserializeGlobal(m_Database.Load(NullAddress, GlobalCategory, 0));

        MissionParametersTypes.MissionParameters memory parameters;
        parameters.m_WindSpeed = wind_speed;
        parameters.m_LaunchLocation = launch_location;
        parameters.m_WeatherType = weather_type;
        parameters.m_WeatherCoverage = weather_coverage;
        parameters.m_LaunchCost = launch_cost;
        parameters.m_TargetDistance = target_distance;
        parameters.m_IsStarted = 1;

        global.m_CompetitionNumber++;

        uint32 competition_id = global.m_CompetitionNumber;

        m_Database.Store(NullAddress, MissionParametersCategory, competition_id, parameters.SerializeMissionParameters());
        m_Database.Store(NullAddress, GlobalCategory, 0, GlobalTypes.SerializeGlobal(global));

        StartCompetitionEvent(competition_id);
    }

    function GetCompetitionResults(uint32 competition_id, bool first_half) public view returns (address[], uint64[])
    {
        CompetitionScoreTypes.CompetitionScore memory score;

        uint256 offset = (first_half == true ? 0 : 5);
        address[] memory winners = new address[](5);
        uint64[] memory distances = new uint64[](5);

        for (uint32 i = 0; i < 5; i++)
        {
            score = CompetitionScoreTypes.DeserializeCompetitionScore(m_Database.Load(competition_id, CompetitionScoresCategory, offset + i));
            winners[i] = score.m_Owner;
            distances[i] = score.m_Distance;
        }

        return (winners, distances);
    }

    function SortCompetitionScores(uint32 competition_id) public NotWhilePaused() OnlyOwner()
    {
        CompetitionScoreTypes.CompetitionScore[] memory scores;
        MissionParametersTypes.MissionParameters memory parameters;

        (scores, parameters) = MakeAndSortCompetitionScores(competition_id);

        for (uint256 i = 0; i < parameters.m_ValidCompetitionScores; i++)
        {
            m_Database.Store(competition_id, CompetitionScoresCategory, i, CompetitionScoreTypes.SerializeCompetitionScore(scores[i]));
        }
    }

    function MakeAndSortCompetitionScores(uint32 competition_id) internal view returns (CompetitionScoreTypes.CompetitionScore[] memory scores, MissionParametersTypes.MissionParameters memory parameters)
    {
        parameters = MissionParametersTypes.DeserializeMissionParameters(m_Database.Load(NullAddress, MissionParametersCategory, competition_id));
        scores = new CompetitionScoreTypes.CompetitionScore[](MaxCompetitionScores + 1);

        for (uint256 i = 0; i < parameters.m_ValidCompetitionScores; i++)
        {
            scores[i] = CompetitionScoreTypes.DeserializeCompetitionScore(m_Database.Load(competition_id, CompetitionScoresCategory, i));
        }

        BubbleSort(scores, parameters.m_ValidCompetitionScores);
    }

    // 22 writes (full competition)
    function FinishCompetition(uint32 competition_id) public NotWhilePaused() OnlyOwner()
    {
        CompetitionScoreTypes.CompetitionScore[] memory scores;
        MissionParametersTypes.MissionParameters memory parameters;

        (scores, parameters) = MakeAndSortCompetitionScores(competition_id);

        require(parameters.m_IsStarted == 1);

        parameters.m_IsStarted = 0;

        uint256 original_competition_funds = uint256(m_Database.Load(NullAddress, CompetitionFundsCategory, competition_id));
        uint256 competition_funds_remaining = original_competition_funds;

        for (uint256 i = 0; i < parameters.m_ValidCompetitionScores; i++)
        {
            RocketTypes.Rocket memory rocket = RocketTypes.DeserializeRocket(m_Database.Load(NullAddress, RocketCategory, scores[i].m_RocketId));
            RocketTypes.StockRocket storage stock_rocket = m_InitialRockets[rocket.m_StockId];

            // Fix Lerps in BuyStockRocket if anything is added here
            // This will increase even if they change owners, which is fine
            rocket.m_TopSpeed = uint32(LerpExtra(stock_rocket.m_MinTopSpeed, stock_rocket.m_MaxTopSpeed, rocket.m_TopSpeed, bytes1(10 - i)));
            rocket.m_Thrust = uint32(LerpExtra(stock_rocket.m_MinThrust, stock_rocket.m_MaxThrust, rocket.m_Thrust, bytes1(10 - i)));
            rocket.m_Weight = uint32(LerpLess(stock_rocket.m_MinWeight, stock_rocket.m_MaxWeight, rocket.m_Weight, bytes1(10 - i)));
            rocket.m_FuelCapacity = uint32(LerpExtra(stock_rocket.m_MinFuelCapacity, stock_rocket.m_MaxFuelCapacity, rocket.m_FuelCapacity, bytes1(10 - i)));
            //

            m_Database.Store(NullAddress, RocketCategory, scores[i].m_RocketId, RocketTypes.SerializeRocket(rocket));

            uint256 existing_funds = uint256(m_Database.Load(scores[i].m_Owner, WithdrawalFundsCategory, 0));

            uint256 funds_won = original_competition_funds / (2 ** (i + 1));

            if (funds_won > competition_funds_remaining)
                funds_won = competition_funds_remaining;

            existing_funds += funds_won;
            competition_funds_remaining -= funds_won;

            m_Database.Store(scores[i].m_Owner, WithdrawalFundsCategory, 0, bytes32(existing_funds));
        }

        if (competition_funds_remaining > 0)
        {
            scores[MaxCompetitionScores] = CompetitionScoreTypes.DeserializeCompetitionScore(m_Database.Load(competition_id, CompetitionScoresCategory, 0));
            existing_funds = uint256(m_Database.Load(scores[MaxCompetitionScores].m_Owner, WithdrawalFundsCategory, 0));
            existing_funds += competition_funds_remaining;
            m_Database.Store(scores[MaxCompetitionScores].m_Owner, WithdrawalFundsCategory, 0, bytes32(existing_funds));
        }

        m_Database.Store(NullAddress, MissionParametersCategory, competition_id, parameters.SerializeMissionParameters());

        FinishCompetitionEvent(competition_id);
    }

    function Lerp(uint256 min, uint256 max, bytes1 percent) internal pure returns(uint256)
    {
        uint256 real_percent = (uint256(percent) % 100);
        return uint256(min + (real_percent * (max - min)) / 100);
    }

    function LerpExtra(uint256 min, uint256 max, uint256 current, bytes1 total_extra_percent) internal pure returns (uint256)
    {
        current += Lerp(min, max, total_extra_percent) - min;
        if (current < min || current > max)
            current = max;
        return current;
    }

    function LerpLess(uint256 min, uint256 max, uint256 current, bytes1 total_less_percent) internal pure returns (uint256)
    {
        current -= Lerp(min, max, total_less_percent) - min;
        if (current < min || current > max)
            current = min;
        return current;
    }

    function BubbleSort(CompetitionScoreTypes.CompetitionScore[] memory scores, uint32 length) internal pure
    {
        uint32 n = length;
        while (true)
        {
            bool swapped = false;
            for (uint32 i = 1; i < n; i++)
            {
                if (scores[i - 1].m_Distance > scores[i].m_Distance)
                {
                    scores[MaxCompetitionScores] = scores[i - 1];
                    scores[i - 1] = scores[i];
                    scores[i] = scores[MaxCompetitionScores];
                    swapped = true;
                }
            }
            n--;
            if (!swapped)
                break;
        }
    }
}

library GameCommon
{
    using Serializer for Serializer.DataComponent;

    struct LaunchRocketStackFrame
    {
        int64 m_RocketTopSpeed; // 0
        int64 m_RocketThrust; // 8
        int64 m_RocketMass; // 16
        int64 m_RocketFuelCapacity; // 24

        int64 m_RocketMaxDistance; // 0
        int64 m_MissionWindSpeed; // 8
        int64 m_MissionLaunchLocation; // 16
        int64 m_MissionWeatherType; // 24

        int64 m_MissionWeatherCoverage; // 0
        int64 m_MissionTargetDistance; // 8
        int64 m_FuelToUse; // 16
        int64 m_FuelAllocationForLaunch; // 24

        int64 m_StabilizerSetting; // 0
        int64 m_DebugExtraDistance; // 8
        int64 m_LaunchThrust; // 16

        RocketTypes.Rocket m_Rocket;
        OwnershipTypes.Ownership m_Ownership;
        MissionParametersTypes.MissionParameters m_Mission;

        bytes32 m_Raw0;
        bytes32 m_Raw1;
        bytes32 m_Raw2;
        bytes32 m_Raw3;

        uint32 m_CompetitionId;
        uint32 m_RocketId;
        int64 m_LowEarthOrbitPosition;
        int64 m_DisplacementFromLowEarthOrbit;
        int64 m_DisplacementFromPlanet;
        address m_Launcher;
        uint256 m_ProfitFunds;
        uint256 m_CompetitionFunds;
        uint64 m_FinalDistance;
    }

    function SerializeLaunchRocketStackFrame(LaunchRocketStackFrame memory stack) internal pure
    {
        SerializeRaw0(stack);
        SerializeRaw1(stack);
        SerializeRaw2(stack);
        SerializeRaw3(stack);
    }

    function DeserializeLaunchRocketStackFrame(LaunchRocketStackFrame memory stack) internal pure
    {
        DeserializeRaw0(stack);
        DeserializeRaw1(stack);
        DeserializeRaw2(stack);
        DeserializeRaw3(stack);
    }

    function SerializeRaw0(LaunchRocketStackFrame memory stack) internal pure
    {
        Serializer.DataComponent memory data;

        data.WriteUint64(0, uint64(stack.m_RocketTopSpeed));
        data.WriteUint64(8, uint64(stack.m_RocketThrust));
        data.WriteUint64(16, uint64(stack.m_RocketMass));
        data.WriteUint64(24, uint64(stack.m_RocketFuelCapacity));

        stack.m_Raw0 = data.m_Raw;
    }

    function DeserializeRaw0(LaunchRocketStackFrame memory stack) internal pure
    {
        Serializer.DataComponent memory data;
        data.m_Raw = stack.m_Raw0;

        stack.m_RocketTopSpeed = int64(data.ReadUint64(0));
        stack.m_RocketThrust = int64(data.ReadUint64(8));
        stack.m_RocketMass = int64(data.ReadUint64(16));
        stack.m_RocketFuelCapacity = int64(data.ReadUint64(24));
    }

    function SerializeRaw1(LaunchRocketStackFrame memory stack) internal pure
    {
        Serializer.DataComponent memory data;

        data.WriteUint64(0, uint64(stack.m_RocketMaxDistance));
        data.WriteUint64(8, uint64(stack.m_MissionWindSpeed));
        data.WriteUint64(16, uint64(stack.m_MissionLaunchLocation));
        data.WriteUint64(24, uint64(stack.m_MissionWeatherType));

        stack.m_Raw1 = data.m_Raw;
    }

    function DeserializeRaw1(LaunchRocketStackFrame memory stack) internal pure
    {
        Serializer.DataComponent memory data;
        data.m_Raw = stack.m_Raw1;

        stack.m_RocketMaxDistance = int64(data.ReadUint64(0));
        stack.m_MissionWindSpeed = int64(data.ReadUint64(8));
        stack.m_MissionLaunchLocation = int64(data.ReadUint64(16));
        stack.m_MissionWeatherType = int64(data.ReadUint64(24));
    }

    function SerializeRaw2(LaunchRocketStackFrame memory stack) internal pure
    {
        Serializer.DataComponent memory data;

        data.WriteUint64(0, uint64(stack.m_MissionWeatherCoverage));
        data.WriteUint64(8, uint64(stack.m_MissionTargetDistance));
        data.WriteUint64(16, uint64(stack.m_FuelToUse));
        data.WriteUint64(24, uint64(stack.m_FuelAllocationForLaunch));

        stack.m_Raw2 = data.m_Raw;
    }

    function DeserializeRaw2(LaunchRocketStackFrame memory stack) internal pure
    {
        Serializer.DataComponent memory data;
        data.m_Raw = stack.m_Raw2;

        stack.m_MissionWeatherCoverage = int64(data.ReadUint64(0));
        stack.m_MissionTargetDistance = int64(data.ReadUint64(8));
        stack.m_FuelToUse = int64(data.ReadUint64(16));
        stack.m_FuelAllocationForLaunch = int64(data.ReadUint64(24));
    }

    function SerializeRaw3(LaunchRocketStackFrame memory stack) internal pure
    {
        Serializer.DataComponent memory data;

        data.WriteUint64(0, uint64(stack.m_StabilizerSetting));
        data.WriteUint64(8, uint64(stack.m_DebugExtraDistance));
        data.WriteUint64(16, uint64(stack.m_LaunchThrust));

        stack.m_Raw3 = data.m_Raw;
    }

    function DeserializeRaw3(LaunchRocketStackFrame memory stack) internal pure
    {
        Serializer.DataComponent memory data;
        data.m_Raw = stack.m_Raw3;

        stack.m_StabilizerSetting = int64(data.ReadUint64(0));
        stack.m_DebugExtraDistance = int64(data.ReadUint64(8));
        stack.m_LaunchThrust = int64(data.ReadUint64(16));
    }
}

library GlobalTypes
{
    using Serializer for Serializer.DataComponent;

    struct Global
    {
        uint32 m_LastRocketId; // 0
        uint32 m_CompetitionNumber; // 4
        uint8 m_Unused8; // 8
        uint8 m_Unused9; // 9
        uint8 m_Unused10; // 10
        uint8 m_Unused11; // 11
    }

    function SerializeGlobal(Global global) internal pure returns (bytes32)
    {
        Serializer.DataComponent memory data;
        data.WriteUint32(0, global.m_LastRocketId);
        data.WriteUint32(4, global.m_CompetitionNumber);
        data.WriteUint8(8, global.m_Unused8);
        data.WriteUint8(9, global.m_Unused9);
        data.WriteUint8(10, global.m_Unused10);
        data.WriteUint8(11, global.m_Unused11);

        return data.m_Raw;
    }

    function DeserializeGlobal(bytes32 raw) internal pure returns (Global)
    {
        Global memory global;

        Serializer.DataComponent memory data;
        data.m_Raw = raw;

        global.m_LastRocketId = data.ReadUint32(0);
        global.m_CompetitionNumber = data.ReadUint32(4);
        global.m_Unused8 = data.ReadUint8(8);
        global.m_Unused9 = data.ReadUint8(9);
        global.m_Unused10 = data.ReadUint8(10);
        global.m_Unused11 = data.ReadUint8(11);

        return global;
    }
}

library MarketTypes
{
    using Serializer for Serializer.DataComponent;

    struct MarketListing
    {
        uint80 m_Price; // 0
    }

    function SerializeMarketListing(MarketListing listing) internal pure returns (bytes32)
    {
        Serializer.DataComponent memory data;
        data.WriteUint80(0, listing.m_Price);

        return data.m_Raw;
    }

    function DeserializeMarketListing(bytes32 raw) internal pure returns (MarketListing)
    {
        MarketListing memory listing;

        Serializer.DataComponent memory data;
        data.m_Raw = raw;

        listing.m_Price = data.ReadUint80(0);

        return listing;
    }
}

library MissionParametersTypes
{
    using Serializer for Serializer.DataComponent;

    struct MissionParameters
    {
        uint8 m_WindSpeed; // 0
        uint8 m_LaunchLocation; // 1
        uint8 m_WeatherType; // 2
        uint8 m_WeatherCoverage; // 3
        uint80 m_LaunchCost; // 4
        uint8 m_IsStarted; // 14
        uint32 m_TargetDistance; // 15
        uint32 m_ValidCompetitionScores; // 19
        uint8 m_DebugExtraDistance; // 23
    }

    function SerializeMissionParameters(MissionParameters mission) internal pure returns (bytes32)
    {
        Serializer.DataComponent memory data;

        data.WriteUint8(0, mission.m_WindSpeed);
        data.WriteUint8(1, mission.m_LaunchLocation);
        data.WriteUint8(2, mission.m_WeatherType);
        data.WriteUint8(3, mission.m_WeatherCoverage);
        data.WriteUint80(4, mission.m_LaunchCost);
        data.WriteUint8(14, mission.m_IsStarted);
        data.WriteUint32(15, mission.m_TargetDistance);
        data.WriteUint32(19, mission.m_ValidCompetitionScores);
        data.WriteUint8(23, mission.m_DebugExtraDistance);

        return data.m_Raw;
    }

    function DeserializeMissionParameters(bytes32 raw) internal pure returns (MissionParameters)
    {
        MissionParameters memory mission;

        Serializer.DataComponent memory data;
        data.m_Raw = raw;

        mission.m_WindSpeed = data.ReadUint8(0);
        mission.m_LaunchLocation = data.ReadUint8(1);
        mission.m_WeatherType = data.ReadUint8(2);
        mission.m_WeatherCoverage = data.ReadUint8(3);
        mission.m_LaunchCost = data.ReadUint80(4);
        mission.m_IsStarted = data.ReadUint8(14);
        mission.m_TargetDistance = data.ReadUint32(15);
        mission.m_ValidCompetitionScores = data.ReadUint32(19);
        mission.m_DebugExtraDistance = data.ReadUint8(23);

        return mission;
    }
}

library OwnershipTypes
{
    using Serializer for Serializer.DataComponent;

    struct Ownership
    {
        address m_Owner; // 0
        uint32 m_OwnerInventoryIndex; // 20
    }

    function SerializeOwnership(Ownership ownership) internal pure returns (bytes32)
    {
        Serializer.DataComponent memory data;
        data.WriteAddress(0, ownership.m_Owner);
        data.WriteUint32(20, ownership.m_OwnerInventoryIndex);

        return data.m_Raw;
    }

    function DeserializeOwnership(bytes32 raw) internal pure returns (Ownership)
    {
        Ownership memory ownership;

        Serializer.DataComponent memory data;
        data.m_Raw = raw;

        ownership.m_Owner = data.ReadAddress(0);
        ownership.m_OwnerInventoryIndex = data.ReadUint32(20);

        return ownership;
    }
}

library RocketTypes
{
    using Serializer for Serializer.DataComponent;

    struct Rocket
    {
        uint8 m_Version; // 0
        uint8 m_Unused1; // 1
        uint8 m_IsForSale; // 2
        uint8 m_Unused3; // 3

        uint32 m_TopSpeed; // 4
        uint32 m_Thrust; // 8
        uint32 m_Weight; // 12
        uint32 m_FuelCapacity; // 16

        uint16 m_StockId; // 20
        uint16 m_Unused22; // 22
        uint64 m_MaxDistance; // 24
    }

    struct StockRocket
    {
        bool m_IsValid; // 0
        uint64 m_Cost; // 1

        uint32 m_MinTopSpeed; // 5
        uint32 m_MaxTopSpeed; // 9

        uint32 m_MinThrust; // 13
        uint32 m_MaxThrust; // 17

        uint32 m_MinWeight; // 21
        uint32 m_MaxWeight; // 25

        uint32 m_MinFuelCapacity; // 29
        uint32 m_MaxFuelCapacity; // 33

        uint64 m_Distance; // 37
    }

    function SerializeRocket(Rocket rocket) internal pure returns (bytes32)
    {
        Serializer.DataComponent memory data;
        data.WriteUint8(0, rocket.m_Version);
        //data.WriteUint8(1, rocket.m_Unused1);
        data.WriteUint8(2, rocket.m_IsForSale);
        //data.WriteUint8(3, rocket.m_Unused3);
        data.WriteUint32(4, rocket.m_TopSpeed);
        data.WriteUint32(8, rocket.m_Thrust);
        data.WriteUint32(12, rocket.m_Weight);
        data.WriteUint32(16, rocket.m_FuelCapacity);
        data.WriteUint16(20, rocket.m_StockId);
        //data.WriteUint16(22, rocket.m_Unused22);
        data.WriteUint64(24, rocket.m_MaxDistance);

        return data.m_Raw;
    }

    function DeserializeRocket(bytes32 raw) internal pure returns (Rocket)
    {
        Rocket memory rocket;

        Serializer.DataComponent memory data;
        data.m_Raw = raw;

        rocket.m_Version = data.ReadUint8(0);
        //rocket.m_Unused1 = data.ReadUint8(1);
        rocket.m_IsForSale = data.ReadUint8(2);
        //rocket.m_Unused3 = data.ReadUint8(3);
        rocket.m_TopSpeed = data.ReadUint32(4);
        rocket.m_Thrust = data.ReadUint32(8);
        rocket.m_Weight = data.ReadUint32(12);
        rocket.m_FuelCapacity = data.ReadUint32(16);
        rocket.m_StockId = data.ReadUint16(20);
        //rocket.m_Unused22 = data.ReadUint16(22);
        rocket.m_MaxDistance = data.ReadUint64(24);

        return rocket;
    }
}

library Serializer
{
    struct DataComponent
    {
        bytes32 m_Raw;
    }

    function ReadUint8(DataComponent memory self, uint32 offset) internal pure returns (uint8)
    {
        return uint8((self.m_Raw >> (offset * 8)) & 0xFF);
    }

    function WriteUint8(DataComponent memory self, uint32 offset, uint8 value) internal pure
    {
        self.m_Raw |= (bytes32(value) << (offset * 8));
    }

    function ReadUint16(DataComponent memory self, uint32 offset) internal pure returns (uint16)
    {
        return uint16((self.m_Raw >> (offset * 8)) & 0xFFFF);
    }

    function WriteUint16(DataComponent memory self, uint32 offset, uint16 value) internal pure
    {
        self.m_Raw |= (bytes32(value) << (offset * 8));
    }

    function ReadUint32(DataComponent memory self, uint32 offset) internal pure returns (uint32)
    {
        return uint32((self.m_Raw >> (offset * 8)) & 0xFFFFFFFF);
    }

    function WriteUint32(DataComponent memory self, uint32 offset, uint32 value) internal pure
    {
        self.m_Raw |= (bytes32(value) << (offset * 8));
    }

    function ReadUint64(DataComponent memory self, uint32 offset) internal pure returns (uint64)
    {
        return uint64((self.m_Raw >> (offset * 8)) & 0xFFFFFFFFFFFFFFFF);
    }

    function WriteUint64(DataComponent memory self, uint32 offset, uint64 value) internal pure
    {
        self.m_Raw |= (bytes32(value) << (offset * 8));
    }

    function ReadUint80(DataComponent memory self, uint32 offset) internal pure returns (uint80)
    {
        return uint80((self.m_Raw >> (offset * 8)) & 0xFFFFFFFFFFFFFFFFFFFF);
    }

    function WriteUint80(DataComponent memory self, uint32 offset, uint80 value) internal pure
    {
        self.m_Raw |= (bytes32(value) << (offset * 8));
    }

    function ReadAddress(DataComponent memory self, uint32 offset) internal pure returns (address)
    {
        return address((self.m_Raw >> (offset * 8)) & (
            (0xFFFFFFFF << 0)  |
            (0xFFFFFFFF << 32) |
            (0xFFFFFFFF << 64) |
            (0xFFFFFFFF << 96) |
            (0xFFFFFFFF << 128)
        ));
    }

    function WriteAddress(DataComponent memory self, uint32 offset, address value) internal pure
    {
        self.m_Raw |= (bytes32(value) << (offset * 8));
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"withdraw_amount","type":"uint256"},{"name":"beneficiary","type":"address"}],"name":"WithdrawProfitFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"IsPaused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"competition_id","type":"uint32"},{"name":"rocket_id","type":"uint32"},{"name":"launch_thrust","type":"uint32"},{"name":"fuel_to_use","type":"uint32"},{"name":"fuel_allocation_for_launch","type":"uint32"},{"name":"stabilizer_setting","type":"uint32"}],"name":"LaunchRocket","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"stock_id","type":"uint16"},{"name":"target","type":"address"}],"name":"GiveReferralRocket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"hidden","type":"address"}],"name":"ChangeGameHidden","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"target","type":"address"}],"name":"GetWithdrawalFunds","outputs":[{"name":"funds","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"Pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"competition_id","type":"uint32"}],"name":"FinishCompetition","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"withdraw_amount","type":"uint256"}],"name":"WithdrawWinnings","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"Unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"competition_id","type":"uint32"},{"name":"extra","type":"uint8"}],"name":"SetDebugExtra","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"wind_speed","type":"uint8"},{"name":"launch_location","type":"uint8"},{"name":"weather_type","type":"uint8"},{"name":"weather_coverage","type":"uint8"},{"name":"launch_cost","type":"uint80"},{"name":"target_distance","type":"uint32"}],"name":"StartCompetition","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"m_Database","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"rocket_id","type":"uint32"},{"name":"price","type":"uint80"}],"name":"PlaceRocketForSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"competition_id","type":"uint32"}],"name":"GetCompetitionInfo","outputs":[{"name":"in_progress","type":"bool"},{"name":"wind_speed","type":"uint8"},{"name":"launch_location","type":"uint8"},{"name":"weather_type","type":"uint8"},{"name":"weather_coverage","type":"uint8"},{"name":"launch_cost","type":"uint80"},{"name":"target_distance","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"rocket_id","type":"uint32"}],"name":"BuyRocketForSale","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"m_Paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"stock_id","type":"uint32"},{"name":"cost","type":"uint64"},{"name":"min_top_speed","type":"uint32"},{"name":"max_top_speed","type":"uint32"},{"name":"min_thrust","type":"uint32"},{"name":"max_thrust","type":"uint32"},{"name":"min_weight","type":"uint32"},{"name":"max_weight","type":"uint32"},{"name":"min_fuel_capacity","type":"uint32"},{"name":"max_fuel_capacity","type":"uint32"},{"name":"distance","type":"uint64"},{"name":"max_stock","type":"uint32"}],"name":"AddRocket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"competition_id","type":"uint32"}],"name":"GetCompetitionFunds","outputs":[{"name":"funds","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_GameHidden","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"rocket_id","type":"uint32"}],"name":"GetAuction","outputs":[{"name":"is_for_sale","type":"bool"},{"name":"owner","type":"address"},{"name":"price","type":"uint80"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"target","type":"address"},{"name":"start_index","type":"uint256"}],"name":"GetInventory","outputs":[{"name":"rocket_ids","type":"uint32[8]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"stock_id","type":"uint16"},{"name":"referrer","type":"address"}],"name":"BuyStockRocket","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"stock_id","type":"uint16"}],"name":"GetRocketStock","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_Owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"rocket_id","type":"uint32"}],"name":"GetRocket","outputs":[{"name":"is_valid","type":"bool"},{"name":"top_speed","type":"uint32"},{"name":"thrust","type":"uint32"},{"name":"weight","type":"uint32"},{"name":"fuel_capacity","type":"uint32"},{"name":"stock_id","type":"uint16"},{"name":"max_distance","type":"uint64"},{"name":"is_for_sale","type":"bool"},{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"target","type":"address"}],"name":"GetInventoryCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"competition_id","type":"uint32"},{"name":"first_half","type":"bool"}],"name":"GetCompetitionResults","outputs":[{"name":"","type":"address[]"},{"name":"","type":"uint64[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"rocket_id","type":"uint32"}],"name":"RemoveRocketForSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"db","type":"address"}],"name":"ChangeDatabase","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"GetProfitFunds","outputs":[{"name":"funds","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"new_owner","type":"address"}],"name":"ChangeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"competition_id","type":"uint32"}],"name":"SortCompetitionScores","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"},{"indexed":false,"name":"stock_id","type":"uint32"},{"indexed":false,"name":"rocket_id","type":"uint32"},{"indexed":false,"name":"referrer","type":"address"}],"name":"BuyStockRocketEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"seller","type":"address"},{"indexed":false,"name":"rocket_id","type":"uint32"},{"indexed":false,"name":"price","type":"uint80"}],"name":"PlaceRocketForSaleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"seller","type":"address"},{"indexed":false,"name":"rocket_id","type":"uint32"}],"name":"RemoveRocketForSaleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"},{"indexed":true,"name":"seller","type":"address"},{"indexed":false,"name":"rocket_id","type":"uint32"}],"name":"BuyRocketForSaleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"launcher","type":"address"},{"indexed":false,"name":"competition_id","type":"uint32"},{"indexed":false,"name":"leo_displacement","type":"int64"},{"indexed":false,"name":"planet_displacement","type":"int64"}],"name":"LaunchRocketEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"competition_id","type":"uint32"}],"name":"StartCompetitionEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"competition_id","type":"uint32"}],"name":"FinishCompetitionEvent","type":"event"}]

6060604052341561000f57600080fd5b60008054600160a060020a033316600160a060020a03199091161790556002805460a060020a60ff02191674010000000000000000000000000000000000000000179055615e5e80620000636000396000f3006060604052600436106101875763ffffffff60e060020a6000350416630dccfde4811461018c5780631309a563146101b05780631f15e163146101d7578063258f6b8f146102065780632b8a789b1461022c5780633285f4061461024b5780636985a0221461027c578063734f28381461028f57806374f760e4146102ab5780637805862f146102c15780638c5f6d5a146102d45780638cd41fae146102f657806391bb4816146103395780639875958c1461036857806399c75517146103935780639d44210214610407578063a756588814610418578063ae68c80a1461042b578063bd7095db14610497578063bdaeb0a0146104b3578063c022abbe146104c6578063c55f3b4c1461051c578063c6cc68b914610577578063c959ec5714610592578063ca75d770146105c5578063daf017a9146105d8578063dbcf194a14610665578063e190903514610684578063e20348341461073e578063ebc046491461075a578063ec35576e14610779578063f28532921461078c578063ffef2b00146107ab575b600080fd5b341561019757600080fd5b6101ae600435600160a060020a03602435166107c7565b005b34156101bb57600080fd5b6101c36109dc565b604051901515815260200160405180910390f35b6101ae63ffffffff60043581169060243581169060443581169060643581169060843581169060a435166109ec565b341561021157600080fd5b6101ae61ffff60043516600160a060020a0360243516610e40565b341561023757600080fd5b6101ae600160a060020a0360043516610f94565b341561025657600080fd5b61026a600160a060020a0360043516610fde565b60405190815260200160405180910390f35b341561028757600080fd5b6101ae611081565b341561029a57600080fd5b6101ae63ffffffff600435166110d9565b34156102b657600080fd5b6101ae600435611899565b34156102cc57600080fd5b6101ae611a41565b34156102df57600080fd5b6101ae63ffffffff6004351660ff60243516611a7c565b341561030157600080fd5b6101ae60ff6004358116906024358116906044358116906064351669ffffffffffffffffffff6084351663ffffffff60a43516611b94565b341561034457600080fd5b61034c611e19565b604051600160a060020a03909116815260200160405180910390f35b341561037357600080fd5b6101ae63ffffffff6004351669ffffffffffffffffffff60243516611e28565b341561039e57600080fd5b6103af63ffffffff60043516612110565b604051961515875260ff958616602088015293851660408088019190915292851660608701529316608085015269ffffffffffffffffffff90921660a084015263ffffffff1660c083015260e0909101905180910390f35b6101ae63ffffffff600435166121f1565b341561042357600080fd5b6101c3612de5565b341561043657600080fd5b6101ae63ffffffff60043581169067ffffffffffffffff60243581169160443581169160643582169160843581169160a43582169160c43581169160e435821691610104358116916101243582169161014435909116906101643516612df5565b34156104a257600080fd5b61026a63ffffffff6004351661327b565b34156104be57600080fd5b61034c6132eb565b34156104d157600080fd5b6104e263ffffffff600435166132fa565b6040519215158352600160a060020a03909116602083015269ffffffffffffffffffff166040808301919091526060909101905180910390f35b341561052757600080fd5b61053e600160a060020a0360043516602435613498565b604051808261010080838360005b8381101561056457808201518382015260200161054c565b5050505090500191505060405180910390f35b6101ae61ffff60043516600160a060020a036024351661359a565b341561059d57600080fd5b6105ac61ffff60043516613657565b60405163ffffffff909116815260200160405180910390f35b34156105d057600080fd5b61034c6136c6565b34156105e357600080fd5b6105f463ffffffff600435166136d5565b604051981515895263ffffffff97881660208a01529587166040808a0191909152948716606089015292909516608087015261ffff1660a086015267ffffffffffffffff90931660c085015291151560e0840152600160a060020a0316610100830152610120909101905180910390f35b341561067057600080fd5b61026a600160a060020a03600435166137c0565b341561068f57600080fd5b6106a563ffffffff600435166024351515613862565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156106e95780820151838201526020016106d1565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610728578082015183820152602001610710565b5050505090500194505050505060405180910390f35b341561074957600080fd5b6101ae63ffffffff600435166139dd565b341561076557600080fd5b6101ae600160a060020a0360043516613c11565b341561078457600080fd5b61026a613c5b565b341561079757600080fd5b6101ae600160a060020a0360043516613ce2565b34156107b657600080fd5b6101ae63ffffffff60043516613d2c565b60025460009060a060020a900460ff16156107e157600080fd5b60005433600160a060020a039081169116146107fc57600080fd5b600154600160a060020a0316630bd6c7696000600581806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561086557600080fd5b6102c65a03f1151561087657600080fd5b50505060405180519150506000831161088e57600080fd5b8083111561089b57600080fd5b600160a060020a03821615156108b057600080fd5b30600160a060020a031682600160a060020a0316141515156108d157600080fd5b600154600160a060020a03838116911614156108ec57600080fd5b6001549083900390600160a060020a0316630647b10660006005818560405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b151561095857600080fd5b6102c65a03f1151561096957600080fd5b5050600154600160a060020a0316905063c95f8b91838560405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156109c357600080fd5b6102c65a03f115156109d457600080fd5b505050505050565b60025460a060020a900460ff1690565b6109f4615bdc565b60025460a060020a900460ff1615610a0b57600080fd5b60018054610aa191600160a060020a0390911690630bd6c769906000908a826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b6102c65a03f11515610a9257600080fd5b50505060405180519050613e35565b6101e0820152600154610b3990600160a060020a0316630bd6c769600060078b826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610b1957600080fd5b6102c65a03f11515610b2a57600080fd5b50505060405180519050613f32565b610220820152600154610bd190600160a060020a0316630bd6c769600060028a826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610bb157600080fd5b6102c65a03f11515610bc257600080fd5b50505060405180519050614042565b61020082015261022081015160a0015160ff166001141515610bf257600080fd5b6000816101e001515160ff1611610c0857600080fd5b806101e001516040015160ff1615610c1f57600080fd5b8061022001516080015169ffffffffffffffffffff1634141515610c4257600080fd5b33600160a060020a031681610200015151600160a060020a031614610c6657600080fd5b806101e0015160a0015163ffffffff168563ffffffff1611151515610c8a57600080fd5b8061022001515160ff16600790810b900b60a08201526102208101516020015160ff16600790810b900b60c08201526102208101516040015160ff16600790810b900b60e08201526102208101516060015160ff16600790810b900b61010082015261022081015160c0015163ffffffff16600790810b900b610120820152610220810151610100015160ff16600790810b900b6101a08201526101e08101516080015163ffffffff16600790810b900b81526101e081015160a0015163ffffffff16600790810b900b60208201526101e081015160c0015163ffffffff16600790810b900b60408201526101e081015160e0015163ffffffff16600790810b900b60608201526101e08101516101400151600790810b900b608082015263ffffffff8088166102c083015286166102e08201526101e081015160a0015163ffffffff168560640263ffffffff16811515610de157fe5b0463ffffffff908116600790810b810b6101c0840152858216810b810b610140840152848216810b810b610160840152908316810b900b61018082015233600160a060020a0316610360820152610e378161409c565b50505050505050565b60025460009060a060020a900460ff1615610e5a57600080fd5b60005433600160a060020a03908116911614610e7557600080fd5b600154600160a060020a0316630bd6c76983600a6000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b1515610ede57600080fd5b6102c65a03f11515610eef57600080fd5b50505060405180519150508015610f0557600080fd5b5060018054600160a060020a0316630647b10683600a60008560405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515610f6e57600080fd5b6102c65a03f11515610f7f57600080fd5b505050610f8f83836000806144ff565b505050565b60005433600160a060020a03908116911614610faf57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60025460009060a060020a900460ff1615610ff857600080fd5b600154600160a060020a0316630bd6c7698360096000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561106157600080fd5b6102c65a03f1151561107257600080fd5b50505060405180519392505050565b60005433600160a060020a0390811691161461109c57600080fd5b60025460a060020a900460ff16156110b357600080fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a179055565b6110e1615ce3565b6110e9615cf5565b60008060006110f6615d41565b6002546000908190819060a060020a900460ff161561111457600080fd5b60005433600160a060020a0390811691161461112f57600080fd5b6111388a614c0b565b909950975060a088015160ff16600114151561115357600080fd5b600060a08901819052600154600160a060020a031690630bd6c7699060068d826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b15156111ca57600080fd5b6102c65a03f115156111db57600080fd5b5050506040518051975087965060009550505b8760e0015163ffffffff168510156115ef576001805461129091600160a060020a0390911690630bd6c769906000908d8a8151811061122957fe5b906020019060200201516040015160006040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b93506003600085610100015161ffff168152602081019190915260400160002080549093506112fa9063ffffffff690100000000000000000082048116916d0100000000000000000000000000900416608087015163ffffffff1688600a0360f860020a02614d89565b63ffffffff9081166080860152835461135991710100000000000000000000000000000000008204811691750100000000000000000000000000000000000000000090041660a087015163ffffffff1688600a0360f860020a02614d89565b63ffffffff90811660a0860152835460018501546113979260c860020a9092048216911660c087015163ffffffff1688600a0360f860020a02614dbb565b63ffffffff90811660c086015260018401546113df9164010000000082048116916801000000000000000090041660e087015163ffffffff1688600a0360f860020a02614d89565b63ffffffff1660e085015260018054600160a060020a031690630647b106906000908c898151811061140d57fe5b906020019060200201516040015161142489614de9565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561147b57600080fd5b6102c65a03f1151561148c57600080fd5b5050600154600160a060020a03169050630bd6c7698a87815181106114ad57fe5b906020019060200201515160096000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561150f57600080fd5b6102c65a03f1151561152057600080fd5b50505060405180519250506001850160020a8781151561153c57fe5b0490508581111561154a5750845b600154958190039591810191600160a060020a0316630647b1068a878151811061157057fe5b9060200190602002015151600960008660405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b15156115d057600080fd5b6102c65a03f115156115e157600080fd5b5050600190950194506111ee565b60008611156117c95760015461167f90600160a060020a0316630bd6c7698c60086000806040516020015260405163ffffffff85811660e060020a02825293909316600484015260248301919091526044820152606401602060405180830381600087803b151561165f57600080fd5b6102c65a03f1151561167057600080fd5b50505060405180519050614ebb565b89600a8151811061168c57fe5b60209081029091010152600154600160a060020a0316630bd6c7698a600a815181106116b457fe5b906020019060200201515160096000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561171657600080fd5b6102c65a03f1151561172757600080fd5b50505060405180516001549088019350600160a060020a03169050630647b1068a600a8151811061175457fe5b9060200190602002015151600960008660405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b15156117b457600080fd5b6102c65a03f115156117c557600080fd5b5050505b600154600160a060020a0316630647b106600060078d6117e88d614f35565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561183f57600080fd5b6102c65a03f1151561185057600080fd5b5050507f621ded8b7024f7261900c87ffcf043a3611e1157cf40f9a3a7949a8c54ce316e8a60405163ffffffff909116815260200160405180910390a150505050505050505050565b60025460009060a060020a900460ff16156118b357600080fd5b600082116118c057600080fd5b600154600160a060020a0316630bd6c7693360096000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561192957600080fd5b6102c65a03f1151561193a57600080fd5b50505060405180519150508082111561195257600080fd5b6001549082900390600160a060020a0316630647b10633600960008560405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b15156119be57600080fd5b6102c65a03f115156119cf57600080fd5b5050600154600160a060020a0316905063c95f8b91338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611a2957600080fd5b6102c65a03f11515611a3a57600080fd5b5050505050565b60005433600160a060020a03908116911614611a5c57600080fd5b6002805474ff000000000000000000000000000000000000000019169055565b611a84615cf5565b60005433600160a060020a03908116911614611a9f57600080fd5b600154611b1190600160a060020a0316630bd6c7696000600787826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610b1957600080fd5b60ff8316610100820152600154909150600160a060020a0316630647b1066000600786611b3d86614f35565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b15156109c357600080fd5b611b9c615d9d565b611ba4615cf5565b60025460009060a060020a900460ff1615611bbe57600080fd5b60005433600160a060020a03908116911614611bd957600080fd5b600154611c6590600160a060020a0316630bd6c76960008080806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b1515611c4557600080fd5b6102c65a03f11515611c5657600080fd5b50505060405180519050615015565b60ff808b1684528981166020808601919091528982166040860152908816606085015269ffffffffffffffffffff8716608085015263ffffffff861660c0850152600160a08501529093508301805160010163ffffffff1690526020830151600154909150600160a060020a0316630647b1066000600784611ce687614f35565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b1515611d3d57600080fd5b6102c65a03f11515611d4e57600080fd5b5050600154600160a060020a03169050630647b10660008080611d70886150d0565b60405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515611dc057600080fd5b6102c65a03f11515611dd157600080fd5b5050507fa4039098a3bc54729b2ea56d9b9c10da33618d8b141b7ef6b5c9c6b3bd2fdef88160405163ffffffff909116815260200160405180910390a1505050505050505050565b600154600160a060020a031681565b611e30615d41565b611e38615dd2565b611e40615ce3565b60025460a060020a900460ff1615611e5757600080fd5b60018054611ecd91600160a060020a0390911690630bd6c7699060009089826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b92506000835160ff1611611ee057600080fd5b600154611f5290600160a060020a0316630bd6c7696000600289826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610bb157600080fd5b9150600160a060020a0333168251600160a060020a031614611f7357600080fd5b826040015160ff1615611f8557600080fd5b69ffffffffffffffffffff841681526001604084018190528054600160a060020a031690630647b1069060009088611fbc88614de9565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561201357600080fd5b6102c65a03f1151561202457600080fd5b5050600154600160a060020a03169050630647b106600060048861204786615167565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561209e57600080fd5b6102c65a03f115156120af57600080fd5b50505033600160a060020a03167fb4b714502735fdcccb277397b149541771cf47f0fe9ac9ff8cedbede62867549868660405163ffffffff909216825269ffffffffffffffffffff1660208201526040908101905180910390a25050505050565b6000806000806000806000612123615cf5565b60025460a060020a900460ff161561213a57600080fd5b6001546121ac90600160a060020a0316630bd6c769600060078d826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610b1957600080fd5b90508060a0015160ff16600114975080600001519650806020015195508060400151945080606001519350806080015192508060c00151915050919395979092949650565b6121f9615d41565b612201615dd2565b612209615ce3565b60008060008060008061221a615dd2565b60025460a060020a900460ff161561223157600080fd5b600180546122a791600160a060020a0390911690630bd6c769906000908f826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b995060008a5160ff16116122ba57600080fd5b896040015160ff1660011415156122d057600080fd5b60015461234290600160a060020a0316630bd6c769600060028f826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610bb157600080fd5b9850600160a060020a0333168951600160a060020a0316141561236457600080fd5b6001546123f690600160a060020a0316630bd6c769600060048f826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b15156123d657600080fd5b6102c65a03f115156123e757600080fd5b50505060405180519050615186565b9750875169ffffffffffffffffffff163414151561241357600080fd5b600154600160a060020a0316630bd6c7698a5160036000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561247d57600080fd5b6102c65a03f1151561248e57600080fd5b5050506040518051600154909850600160a060020a03169050630bd6c7693360036000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561250457600080fd5b6102c65a03f1151561251557600080fd5b505050604051805196508890505169ffffffffffffffffffff1692508851600160a060020a033381168b5260006040808e01829052818c52600180549a01999395509290911691630bd6c7699185916003918c91516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b15156125b957600080fd5b6102c65a03f115156125ca57600080fd5b5050506040518051600154909650600160a060020a03169050630647b1068360038a600060405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b151561263e57600080fd5b6102c65a03f1151561264f57600080fd5b50505086896020015160010163ffffffff161415156127f357600154600160a060020a0316630647b10683600360208d01516001018960405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b15156126dc57600080fd5b6102c65a03f115156126ed57600080fd5b505060015461275d9150600160a060020a0316630bd6c7696000600289826040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b1515610bb157600080fd5b9050886020015163ffffffff166020820152600154600160a060020a0316630647b106600060028861278e866151c7565b60405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b15156127de57600080fd5b6102c65a03f115156127ef57600080fd5b5050505b85896020019063ffffffff16908163ffffffff1681525050600160009054906101000a9004600160a060020a0316600160a060020a0316630647b106336003898f63ffffffff1660010260405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b151561288d57600080fd5b6102c65a03f1151561289e57600080fd5b50506001546014850495509385900393600160a060020a03169050630bd6c7696000600581806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561291657600080fd5b6102c65a03f1151561292757600080fd5b5050506040518051600154600019909901989086019650600160a060020a03169050630647b10633600360008a60405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b15156129a457600080fd5b6102c65a03f115156129b557600080fd5b5050600154600160a060020a03169050630647b10683600360008b60405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515612a2057600080fd5b6102c65a03f11515612a3157600080fd5b5050600154600160a060020a03169050630647b106600060028e612a548e6151c7565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b1515612aab57600080fd5b6102c65a03f11515612abc57600080fd5b505060018054600160a060020a03169150630647b106906000908e612ae08f614de9565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b1515612b3757600080fd5b6102c65a03f11515612b4857600080fd5b5050600154600160a060020a03169050630647b106600060048e612b6b8d615167565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b1515612bc257600080fd5b6102c65a03f11515612bd357600080fd5b5050600154600160a060020a03169050630647b10660006005818960405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515612c3e57600080fd5b6102c65a03f11515612c4f57600080fd5b5050600154600160a060020a03169050630bd6c7698360096000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b1515612cbc57600080fd5b6102c65a03f11515612ccd57600080fd5b5050506040518051600154940193600160a060020a03169050630647b10683600960008760405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515612d4157600080fd5b6102c65a03f11515612d5257600080fd5b5050600154600160a060020a031690503480156108fc0290604051600060405180830381858888f193505050501515612d8a57600080fd5b81600160a060020a031633600160a060020a03167f6f9d73dbd7c6ce8ede881a6e9c8e862e8b77a2128e5a62b1eef167c7e0d2f84c8d60405163ffffffff909116815260200160405180910390a35050505050505050505050565b60025460a060020a900460ff1681565b60005433600160a060020a03908116911614612e1057600080fd5b61016060405190810160409081526001825267ffffffffffffffff808e1660208085019190915263ffffffff808f16848601528d811660608601528c811660808601528b811660a08601528a811660c086015289811660e0860152888116610100860152878116610120860152918616610140850152908f1660009081526003909152208151815460ff19169015151781556020820151815467ffffffffffffffff919091166101000268ffffffffffffffff00199091161781556040820151815463ffffffff919091166901000000000000000000026cffffffff000000000000000000199091161781556060820151815463ffffffff919091166d01000000000000000000000000000270ffffffff00000000000000000000000000199091161781556080820151815463ffffffff91909116710100000000000000000000000000000000000274ffffffff00000000000000000000000000000000001990911617815560a0820151815463ffffffff9190911675010000000000000000000000000000000000000000000278ffffffff0000000000000000000000000000000000000000001990911617815560c0820151815463ffffffff9190911660c860020a027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90911617815560e082015160018201805463ffffffff191663ffffffff929092169190911790556101008201518160010160046101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160010160086101000a81548163ffffffff021916908363ffffffff1602179055506101408201516001918201805467ffffffffffffffff929092166c010000000000000000000000000273ffffffffffffffff0000000000000000000000001990921691909117905554600160a060020a03169050630bd6c7696000600c8f826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b151561312357600080fd5b6102c65a03f1151561313457600080fd5b50505060405180519a505063ffffffff8a16151561326d57600154600160a060020a0316630647b1066000600b8f63ffffffff861660405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b15156131c057600080fd5b6102c65a03f115156131d157600080fd5b505050600160009054906101000a9004600160a060020a0316600160a060020a0316630647b1066000600c8f6001800260405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561325857600080fd5b6102c65a03f1151561326957600080fd5b5050505b505050505050505050505050565b600154600090600160a060020a0316630bd6c76982600685826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b151561106157600080fd5b600254600160a060020a031681565b6000806000613307615d41565b61330f615dd2565b613317615ce3565b6001805461338d91600160a060020a0390911690630bd6c769906000908b826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b925082604001516001805460ff9290921614965061341090600160a060020a0316630bd6c769600060028b826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610bb157600080fd5b9150815160015490955061348990600160a060020a0316630bd6c769600060048b826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b15156123d657600080fd5b90508051959794965050505050565b6134a0615de9565b60008080600160a060020a03861615156134b957600080fd5b6134c2866137c0565b9250846008019150828211156134d6578291505b50835b818110156135915760018054600160a060020a031690630bd6c769908890600390850160006040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561355057600080fd5b6102c65a03f1151561356157600080fd5b50505060405180519050848683036008811061357957fe5b63ffffffff90921660209290920201526001016134d9565b50505092915050565b60025460009060a060020a900460ff16156135b457600080fd5b6135bd83613657565b9050600063ffffffff8216116135d257600080fd5b6135df83336001856144ff565b60015460001990910190600160a060020a0316630647b1066000600b8663ffffffff861660405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925261ffff1660448301526064820152608401600060405180830381600087803b15156109c357600080fd5b600154600090600160a060020a0316630bd6c76982600b85826040516020015260405160e060020a63ffffffff8616028152600160a060020a039093166004840152602483019190915261ffff166044820152606401602060405180830381600087803b151561106157600080fd5b600054600160a060020a031681565b60008060008060008060008060006136eb615d41565b6001805461376191600160a060020a0390911690630bd6c769906000908f826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b90506001815160ff1610159950806040015160ff166001149250806080015198508060a0015197508060c0015196508060e001519550806101000151945080610140015193506137b08b6151fe565b9150509193959799909294969850565b600080600160a060020a03831615156137d857600080fd5b600154600160a060020a0316630bd6c7698460036000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561384157600080fd5b6102c65a03f1151561385257600080fd5b5050506040518051949350505050565b61386a615ce3565b613872615ce3565b61387a615e12565b6000613884615ce3565b61388c615ce3565b600060018815151461389f5760056138a2565b60005b60ff16935060056040518059106138b65750595b9080825280602002602001820160405250925060056040518059106138d85750595b90808252806020026020018201604052509150600090505b60058163ffffffff1610156139cf5760015461396e90600160a060020a0316630bd6c7698b600863ffffffff8616890160006040516020015260405163ffffffff85811660e060020a02825293909316600484015260248301919091526044820152606401602060405180830381600087803b151561165f57600080fd5b94508451838263ffffffff168151811061398457fe5b600160a060020a039092166020928302909101820152850151828263ffffffff16815181106139af57fe5b67ffffffffffffffff9092166020928302909101909101526001016138f0565b509097909650945050505050565b6139e5615d41565b6139ed615dd2565b60025460a060020a900460ff1615613a0457600080fd5b60018054613a7a91600160a060020a0390911690630bd6c7699060009087826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b91506000825160ff1611613a8d57600080fd5b816040015160ff166001141515613aa357600080fd5b600154613b1590600160a060020a0316630bd6c7696000600287826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610bb157600080fd5b9050600160a060020a0333168151600160a060020a031614613b3657600080fd5b60006040830181905260018054600160a060020a031691630647b1069186613b5d87614de9565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b1515613bb457600080fd5b6102c65a03f11515613bc557600080fd5b50505033600160a060020a03167f1fb384cbe837fb1441757fd8f31fa39bd2364252604125b500e1897ae8e555348460405163ffffffff909116815260200160405180910390a2505050565b60005433600160a060020a03908116911614613c2c57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008054819033600160a060020a03908116911614613c7957600080fd5b600154600160a060020a0316630bd6c7696000600581806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561106157600080fd5b60005433600160a060020a03908116911614613cfd57600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b613d34615ce3565b613d3c615cf5565b60025460009060a060020a900460ff1615613d5657600080fd5b60005433600160a060020a03908116911614613d7157600080fd5b613d7a84614c0b565b9093509150600090505b8160e0015163ffffffff16811015613e2f57600154600160a060020a0316630647b10685600884613dc9888281518110613dba57fe5b90602001906020020151615285565b60405163ffffffff86811660e060020a028252949094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515613e1357600080fd5b6102c65a03f11515613e2457600080fd5b505050600101613d84565b50505050565b613e3d615d41565b613e45615d41565b613e4d615ce3565b838152613e6181600063ffffffff6152d416565b60ff168252613e7781600263ffffffff6152d416565b60ff166040830152613e9081600463ffffffff6152f416565b63ffffffff9081166080840152613eac9082906008906152f416565b63ffffffff90811660a0840152613ec8908290600c906152f416565b63ffffffff90811660c0840152613ee49082906010906152f416565b63ffffffff90811660e0840152613f0090829060149061531716565b61ffff16610100830152613f1b81601863ffffffff61533816565b67ffffffffffffffff166101408301525092915050565b613f3a615cf5565b613f42615cf5565b613f4a615ce3565b838152613f5e81600063ffffffff6152d416565b60ff168252613f7481600163ffffffff6152d416565b60ff166020830152613f8d81600263ffffffff6152d416565b60ff166040830152613fa681600363ffffffff6152d416565b60ff166060830152613fbf81600463ffffffff61535f16565b69ffffffffffffffffffff166080830152613fe181600e63ffffffff6152d416565b60ff1660a0830152613ffa81600f63ffffffff6152f416565b63ffffffff90811660c08401526140169082906013906152f416565b63ffffffff90811660e08401526140329082906017906152d416565b60ff166101008301525092915050565b61404a615dd2565b614052615dd2565b61405a615ce3565b83815261406e81600063ffffffff61538816565b600160a060020a0316825261408a81601463ffffffff6152f416565b63ffffffff1660208301525092915050565b6140a5816153ae565b600254600160a060020a0316637e638974610240830151836102600151846102800151856102a0015160006040516060015260405160e060020a63ffffffff87160281526004810194909452602484019290925260448301526064820152608401606060405180830381600087803b151561411f57600080fd5b6102c65a03f1151561413057600080fd5b505050604051805190602001805190602001805167ffffffffffffffff166103c085015250600790810b810b61034084015290810b900b610320820152614176816153d5565b600a340461038082019081525134036103a0820152600154600160a060020a0316630bd6c7696000600581806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b15156141f457600080fd5b6102c65a03f1151561420557600080fd5b50505060405180519050610380820181815101905250600154600160a060020a0316630bd6c769600060066102c085015160006040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b151561428f57600080fd5b6102c65a03f115156142a057600080fd5b505050604051805190506103a0820181815101905250600154600160a060020a0316630647b106600060058161038086015160405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b151561432257600080fd5b6102c65a03f1151561433357600080fd5b5050600154600160a060020a03169050630647b106600060066102c0850151856103a0015160405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b15156143af57600080fd5b6102c65a03f115156143c057600080fd5b5050600154600160a060020a03169050630647b106600060076102c08501516143ed866102200151614f35565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561444457600080fd5b6102c65a03f1151561445557600080fd5b5050600154600160a060020a031690503480156108fc0290604051600060405180830381858888f19350505050151561448d57600080fd5b33600160a060020a03167fbc6a49a3bfd3c950d55a640741c984eb090baca50cd8433c70b74bd2617950ab826102c0015183610320015184610340015160405163ffffffff9093168352600791820b820b6020840152810b900b6040808301919091526060909101905180910390a250565b6000614509615d9d565b6000806000614516615d41565b6000614520615dd2565b61ffff8c166000908152600360205260409020805490985060ff16151561454657600080fd5b8915614568578754610100900467ffffffffffffffff16341461456857600080fd5b6001546145d490600160a060020a0316630bd6c76960008080806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b1515611c4557600080fd5b600154909750600160a060020a0316630bd6c7696000600581806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561464057600080fd5b6102c65a03f1151561465157600080fd5b50505060405180519650879050805160010163ffffffff169052865194506146788b6137c0565b600180855261ffff8e16610100860152600060408601520193506002424189516000604051602001526040518084815260200183600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018263ffffffff1663ffffffff1660e060020a028152600401935050505060206040518083038160008661646e5a03f1151561470c57600080fd5b505060405180518954909350614754915063ffffffff690100000000000000000082048116916d01000000000000000000000000009004168460005b1a60f860020a026157e5565b63ffffffff908116608085015288546147a1917101000000000000000000000000000000000082048116917501000000000000000000000000000000000000000000900416846001614748565b63ffffffff90811660a0850152885460018a01546147cd9260c860020a90920482169116846002614748565b63ffffffff90811660c0850152600189015461480391640100000000820481169168010000000000000000900416846003614748565b63ffffffff90811660e08501526001898101546c01000000000000000000000000900467ffffffffffffffff16610140860152600160a060020a038d8116845260001987018316602085015290543498909801971690630647b106908d9060039088908a1660405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b15156148b857600080fd5b6102c65a03f115156148c957600080fd5b5050600154600160a060020a03169050630647b1068c600360008860405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b151561493457600080fd5b6102c65a03f1151561494557600080fd5b505060018054600160a060020a03169150630647b106906000908861496988614de9565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b15156149c057600080fd5b6102c65a03f115156149d157600080fd5b5050600154600160a060020a03169050630647b10660006002886149f4866151c7565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b1515614a4b57600080fd5b6102c65a03f11515614a5c57600080fd5b5050600154600160a060020a03169050630647b10660008080614a7e8c6150d0565b60405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515614ace57600080fd5b6102c65a03f11515614adf57600080fd5b5050508915614b9857600154600160a060020a0316630647b10660006005818a60405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515614b4f57600080fd5b6102c65a03f11515614b6057600080fd5b5050600154600160a060020a031690503480156108fc0290604051600060405180830381858888f193505050501515614b9857600080fd5b8a600160a060020a03167fea0aee148209a01ccf8bff07fa316fc18ab073d469a1c9870818b3e5913ff0e38d878c60405161ffff909316835263ffffffff919091166020830152600160a060020a03166040808301919091526060909101905180910390a2505050505050505050505050565b614c13615ce3565b614c1b615cf5565b600154600090614c8f90600160a060020a0316630bd6c76983600788826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610b1957600080fd5b9150600b604051805910614ca05750595b908082528060200260200182016040528015614cd657816020015b614cc3615e12565b815260200190600190039081614cbb5790505b509250600090505b8160e0015163ffffffff16811015614d7557600154614d5790600160a060020a0316630bd6c7698660088560006040516020015260405163ffffffff85811660e060020a02825293909316600484015260248301919091526044820152606401602060405180830381600087803b151561165f57600080fd5b838281518110614d6357fe5b60209081029091010152600101614cde565b614d83838360e001516157fc565b50915091565b600084614d978686856157e5565b038301925084831080614da957508383115b15614db2578392505b50909392505050565b600084614dc98686856157e5565b038303925084831080614ddb57508383115b15614db25750929392505050565b6000614df3615ce3565b614e086000845183919063ffffffff61594316565b614e206002846040015183919063ffffffff61594316565b614e386004846080015183919063ffffffff61596216565b614e5060088460a0015183919063ffffffff61596216565b614e68600c8460c0015183919063ffffffff61596216565b614e8060108460e0015183919063ffffffff61596216565b614e99601484610100015183919063ffffffff61598116565b614eb2601884610140015183919063ffffffff6159a116565b80519392505050565b614ec3615e12565b614ecb615e12565b614ed3615ce3565b838152614ee781600063ffffffff61538816565b600160a060020a03168252614f0381601463ffffffff61533816565b67ffffffffffffffff166020830152614f2381601c63ffffffff6152f416565b63ffffffff1660408301525092915050565b6000614f3f615ce3565b614f546000845183919063ffffffff61594316565b614f6c6001846020015183919063ffffffff61594316565b614f846002846040015183919063ffffffff61594316565b614f9c6003846060015183919063ffffffff61594316565b614fb46004846080015183919063ffffffff6159c716565b614fcc600e8460a0015183919063ffffffff61594316565b614fe4600f8460c0015183919063ffffffff61596216565b614ffc60138460e0015183919063ffffffff61596216565b614eb2601784610100015183919063ffffffff61594316565b61501d615d9d565b615025615d9d565b61502d615ce3565b83815261504181600063ffffffff6152f416565b63ffffffff908116835261505a9082906004906152f416565b63ffffffff90811660208401526150769082906008906152d416565b60ff16604083015261508f81600963ffffffff6152d416565b60ff1660608301526150a881600a63ffffffff6152d416565b60ff1660808301526150c181600b63ffffffff6152d416565b60ff1660a08301525092915050565b60006150da615ce3565b6150ef6000845183919063ffffffff61596216565b6151076004846020015183919063ffffffff61596216565b61511f6008846040015183919063ffffffff61594316565b6151376009846060015183919063ffffffff61594316565b61514f600a846080015183919063ffffffff61594316565b614eb2600b8460a0015183919063ffffffff61594316565b6000615171615ce3565b614eb26000845183919063ffffffff6159c716565b61518e615ce3565b615196615ce3565b61519e615ce3565b8381526151b281600063ffffffff61535f16565b69ffffffffffffffffffff1682525092915050565b60006151d1615ce3565b6151e66000845183919063ffffffff6159ef16565b614eb26014846020015183919063ffffffff61596216565b6000615208615dd2565b60015461527a90600160a060020a0316630bd6c7696000600287826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610bb157600080fd5b905080519392505050565b600061528f615ce3565b6152a46000845183919063ffffffff6159ef16565b6152bc6014846020015183919063ffffffff6159a116565b614eb2601c846040015183919063ffffffff61596216565b600063ffffffff6008830216835160029190910a900460ff169392505050565b600063ffffffff6008830216835160029190910a900463ffffffff169392505050565b600063ffffffff6008830216835160029190910a900461ffff169392505050565b600063ffffffff6008830216835160029190910a900467ffffffffffffffff169392505050565b600063ffffffff6008830216835160029190910a900469ffffffffffffffffffff169392505050565b600063ffffffff6008830216835160029190910a9004600160a060020a03169392505050565b6153b781615a14565b6153c081615a88565b6153c981615aff565b6153d281615b7a565b50565b6153dd615e12565b6153e5615e12565b6000806000856103600151600160a060020a031685526103c086015167ffffffffffffffff1660208601526102e086015163ffffffff166040860152600092505b85610220015160e0015163ffffffff168363ffffffff16101561558e576001546154b190600160a060020a0316630bd6c7696102c089015160088760006040516020015260405163ffffffff85811660e060020a028252938416600482015260248101929092529091166044820152606401602060405180830381600087803b151561165f57600080fd5b9350856103600151600160a060020a03168451600160a060020a0316141561558357836020015167ffffffffffffffff16866103c0015167ffffffffffffffff16101561557e57600154600160a060020a0316630647b1066102c088015160088661551b8a615285565b60405163ffffffff86811660e060020a02825294851660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561556957600080fd5b6102c65a03f1151561557a57600080fd5b5050505b6109d4565b600190920191615426565b600a86610220015160e0015163ffffffff16101561564f57600154600160a060020a0316630647b1066102c0880151600889610220015160e001516155d28a615285565b60405163ffffffff86811660e060020a02825294851660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561562057600080fd5b6102c65a03f1151561563157600080fd5b50505085610220015160e001805160010163ffffffff1690526109d4565b506000915081905063ffffffff5b85610220015160e0015163ffffffff168363ffffffff161015615720576001546156e890600160a060020a0316630bd6c7696102c089015160088760006040516020015260405163ffffffff85811660e060020a028252938416600482015260248101929092529091166044820152606401602060405180830381600087803b151561165f57600080fd5b93508167ffffffffffffffff16846020015167ffffffffffffffff16111561571557836020015191508290505b60019092019161565d565b63ffffffff808216146109d45760015461579b90600160a060020a0316630bd6c7696102c089015160088560006040516020015260405163ffffffff85811660e060020a028252938416600482015260248101929092529091166044820152606401602060405180830381600087803b151561165f57600080fd5b9350836020015167ffffffffffffffff16866103c0015167ffffffffffffffff1610156109d457600154600160a060020a0316630647b1066102c088015160088461551b8a615285565b60649183900360f860020a90910482900602040190565b806000805b506000905060015b8263ffffffff168163ffffffff16101561592b57848163ffffffff168151811061582f57fe5b906020019060200201516020015167ffffffffffffffff16856001830363ffffffff168151811061585c57fe5b906020019060200201516020015167ffffffffffffffff16111561592357846001820363ffffffff168151811061588f57fe5b9060200190602002015185600a815181106158a657fe5b602090810290910101528463ffffffff8216815181106158c257fe5b90602001906020020151856001830363ffffffff16815181106158e157fe5b6020908102909101015284600a815181106158f857fe5b90602001906020020151858263ffffffff168151811061591457fe5b60209081029091010152600191505b600101615809565b6000199092019181151561593e57611a3a565b615801565b63ffffffff600883021660020a60ff8216028381815117905250505050565b63ffffffff60088302811660020a908216028381815117905250505050565b63ffffffff600883021660020a61ffff8216028381815117905250505050565b63ffffffff600883021660020a67ffffffffffffffff8216028381815117905250505050565b63ffffffff600883021660020a69ffffffffffffffffffff8216028381815117905250505050565b63ffffffff600883021660020a600160a060020a038216028381815117905250505050565b615a1c615ce3565b615a316000835183919063ffffffff6159a116565b615a496008836020015183919063ffffffff6159a116565b615a616010836040015183919063ffffffff6159a116565b615a796018836060015183919063ffffffff6159a116565b80516102409092019190915250565b615a90615ce3565b615aa86000836080015183919063ffffffff6159a116565b615ac060088360a0015183919063ffffffff6159a116565b615ad860108360c0015183919063ffffffff6159a116565b615af060188360e0015183919063ffffffff6159a116565b80516102609092019190915250565b615b07615ce3565b615b20600083610100015183919063ffffffff6159a116565b615b39600883610120015183919063ffffffff6159a116565b615b52601083610140015183919063ffffffff6159a116565b615b6b601883610160015183919063ffffffff6159a116565b80516102809092019190915250565b615b82615ce3565b615b9b600083610180015183919063ffffffff6159a116565b615bb46008836101a0015183919063ffffffff6159a116565b615bcd6010836101c0015183919063ffffffff6159a116565b80516102a09092019190915250565b6106406040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c08201526101e08101615c62615d41565b8152602001615c6f615dd2565b8152602001615c7c615cf5565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a09091015290565b60206040519081016040526000815290565b6101206040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082015290565b6101606040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052610120820181905261014082015290565b60c06040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a082015290565b604080519081016040526000808252602082015290565b6101006040519081016040526008815b600081526000199091019060200181615df95790505090565b6060604051908101604090815260008083526020830181905290820152905600a165627a7a72305820ea854ea4a55143f54b23e92811990e289365f5cf1940197a6d67b24e17a1232a0029

Deployed Bytecode

0x6060604052600436106101875763ffffffff60e060020a6000350416630dccfde4811461018c5780631309a563146101b05780631f15e163146101d7578063258f6b8f146102065780632b8a789b1461022c5780633285f4061461024b5780636985a0221461027c578063734f28381461028f57806374f760e4146102ab5780637805862f146102c15780638c5f6d5a146102d45780638cd41fae146102f657806391bb4816146103395780639875958c1461036857806399c75517146103935780639d44210214610407578063a756588814610418578063ae68c80a1461042b578063bd7095db14610497578063bdaeb0a0146104b3578063c022abbe146104c6578063c55f3b4c1461051c578063c6cc68b914610577578063c959ec5714610592578063ca75d770146105c5578063daf017a9146105d8578063dbcf194a14610665578063e190903514610684578063e20348341461073e578063ebc046491461075a578063ec35576e14610779578063f28532921461078c578063ffef2b00146107ab575b600080fd5b341561019757600080fd5b6101ae600435600160a060020a03602435166107c7565b005b34156101bb57600080fd5b6101c36109dc565b604051901515815260200160405180910390f35b6101ae63ffffffff60043581169060243581169060443581169060643581169060843581169060a435166109ec565b341561021157600080fd5b6101ae61ffff60043516600160a060020a0360243516610e40565b341561023757600080fd5b6101ae600160a060020a0360043516610f94565b341561025657600080fd5b61026a600160a060020a0360043516610fde565b60405190815260200160405180910390f35b341561028757600080fd5b6101ae611081565b341561029a57600080fd5b6101ae63ffffffff600435166110d9565b34156102b657600080fd5b6101ae600435611899565b34156102cc57600080fd5b6101ae611a41565b34156102df57600080fd5b6101ae63ffffffff6004351660ff60243516611a7c565b341561030157600080fd5b6101ae60ff6004358116906024358116906044358116906064351669ffffffffffffffffffff6084351663ffffffff60a43516611b94565b341561034457600080fd5b61034c611e19565b604051600160a060020a03909116815260200160405180910390f35b341561037357600080fd5b6101ae63ffffffff6004351669ffffffffffffffffffff60243516611e28565b341561039e57600080fd5b6103af63ffffffff60043516612110565b604051961515875260ff958616602088015293851660408088019190915292851660608701529316608085015269ffffffffffffffffffff90921660a084015263ffffffff1660c083015260e0909101905180910390f35b6101ae63ffffffff600435166121f1565b341561042357600080fd5b6101c3612de5565b341561043657600080fd5b6101ae63ffffffff60043581169067ffffffffffffffff60243581169160443581169160643582169160843581169160a43582169160c43581169160e435821691610104358116916101243582169161014435909116906101643516612df5565b34156104a257600080fd5b61026a63ffffffff6004351661327b565b34156104be57600080fd5b61034c6132eb565b34156104d157600080fd5b6104e263ffffffff600435166132fa565b6040519215158352600160a060020a03909116602083015269ffffffffffffffffffff166040808301919091526060909101905180910390f35b341561052757600080fd5b61053e600160a060020a0360043516602435613498565b604051808261010080838360005b8381101561056457808201518382015260200161054c565b5050505090500191505060405180910390f35b6101ae61ffff60043516600160a060020a036024351661359a565b341561059d57600080fd5b6105ac61ffff60043516613657565b60405163ffffffff909116815260200160405180910390f35b34156105d057600080fd5b61034c6136c6565b34156105e357600080fd5b6105f463ffffffff600435166136d5565b604051981515895263ffffffff97881660208a01529587166040808a0191909152948716606089015292909516608087015261ffff1660a086015267ffffffffffffffff90931660c085015291151560e0840152600160a060020a0316610100830152610120909101905180910390f35b341561067057600080fd5b61026a600160a060020a03600435166137c0565b341561068f57600080fd5b6106a563ffffffff600435166024351515613862565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156106e95780820151838201526020016106d1565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610728578082015183820152602001610710565b5050505090500194505050505060405180910390f35b341561074957600080fd5b6101ae63ffffffff600435166139dd565b341561076557600080fd5b6101ae600160a060020a0360043516613c11565b341561078457600080fd5b61026a613c5b565b341561079757600080fd5b6101ae600160a060020a0360043516613ce2565b34156107b657600080fd5b6101ae63ffffffff60043516613d2c565b60025460009060a060020a900460ff16156107e157600080fd5b60005433600160a060020a039081169116146107fc57600080fd5b600154600160a060020a0316630bd6c7696000600581806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561086557600080fd5b6102c65a03f1151561087657600080fd5b50505060405180519150506000831161088e57600080fd5b8083111561089b57600080fd5b600160a060020a03821615156108b057600080fd5b30600160a060020a031682600160a060020a0316141515156108d157600080fd5b600154600160a060020a03838116911614156108ec57600080fd5b6001549083900390600160a060020a0316630647b10660006005818560405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b151561095857600080fd5b6102c65a03f1151561096957600080fd5b5050600154600160a060020a0316905063c95f8b91838560405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156109c357600080fd5b6102c65a03f115156109d457600080fd5b505050505050565b60025460a060020a900460ff1690565b6109f4615bdc565b60025460a060020a900460ff1615610a0b57600080fd5b60018054610aa191600160a060020a0390911690630bd6c769906000908a826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b6102c65a03f11515610a9257600080fd5b50505060405180519050613e35565b6101e0820152600154610b3990600160a060020a0316630bd6c769600060078b826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610b1957600080fd5b6102c65a03f11515610b2a57600080fd5b50505060405180519050613f32565b610220820152600154610bd190600160a060020a0316630bd6c769600060028a826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610bb157600080fd5b6102c65a03f11515610bc257600080fd5b50505060405180519050614042565b61020082015261022081015160a0015160ff166001141515610bf257600080fd5b6000816101e001515160ff1611610c0857600080fd5b806101e001516040015160ff1615610c1f57600080fd5b8061022001516080015169ffffffffffffffffffff1634141515610c4257600080fd5b33600160a060020a031681610200015151600160a060020a031614610c6657600080fd5b806101e0015160a0015163ffffffff168563ffffffff1611151515610c8a57600080fd5b8061022001515160ff16600790810b900b60a08201526102208101516020015160ff16600790810b900b60c08201526102208101516040015160ff16600790810b900b60e08201526102208101516060015160ff16600790810b900b61010082015261022081015160c0015163ffffffff16600790810b900b610120820152610220810151610100015160ff16600790810b900b6101a08201526101e08101516080015163ffffffff16600790810b900b81526101e081015160a0015163ffffffff16600790810b900b60208201526101e081015160c0015163ffffffff16600790810b900b60408201526101e081015160e0015163ffffffff16600790810b900b60608201526101e08101516101400151600790810b900b608082015263ffffffff8088166102c083015286166102e08201526101e081015160a0015163ffffffff168560640263ffffffff16811515610de157fe5b0463ffffffff908116600790810b810b6101c0840152858216810b810b610140840152848216810b810b610160840152908316810b900b61018082015233600160a060020a0316610360820152610e378161409c565b50505050505050565b60025460009060a060020a900460ff1615610e5a57600080fd5b60005433600160a060020a03908116911614610e7557600080fd5b600154600160a060020a0316630bd6c76983600a6000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b1515610ede57600080fd5b6102c65a03f11515610eef57600080fd5b50505060405180519150508015610f0557600080fd5b5060018054600160a060020a0316630647b10683600a60008560405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515610f6e57600080fd5b6102c65a03f11515610f7f57600080fd5b505050610f8f83836000806144ff565b505050565b60005433600160a060020a03908116911614610faf57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60025460009060a060020a900460ff1615610ff857600080fd5b600154600160a060020a0316630bd6c7698360096000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561106157600080fd5b6102c65a03f1151561107257600080fd5b50505060405180519392505050565b60005433600160a060020a0390811691161461109c57600080fd5b60025460a060020a900460ff16156110b357600080fd5b6002805474ff0000000000000000000000000000000000000000191660a060020a179055565b6110e1615ce3565b6110e9615cf5565b60008060006110f6615d41565b6002546000908190819060a060020a900460ff161561111457600080fd5b60005433600160a060020a0390811691161461112f57600080fd5b6111388a614c0b565b909950975060a088015160ff16600114151561115357600080fd5b600060a08901819052600154600160a060020a031690630bd6c7699060068d826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b15156111ca57600080fd5b6102c65a03f115156111db57600080fd5b5050506040518051975087965060009550505b8760e0015163ffffffff168510156115ef576001805461129091600160a060020a0390911690630bd6c769906000908d8a8151811061122957fe5b906020019060200201516040015160006040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b93506003600085610100015161ffff168152602081019190915260400160002080549093506112fa9063ffffffff690100000000000000000082048116916d0100000000000000000000000000900416608087015163ffffffff1688600a0360f860020a02614d89565b63ffffffff9081166080860152835461135991710100000000000000000000000000000000008204811691750100000000000000000000000000000000000000000090041660a087015163ffffffff1688600a0360f860020a02614d89565b63ffffffff90811660a0860152835460018501546113979260c860020a9092048216911660c087015163ffffffff1688600a0360f860020a02614dbb565b63ffffffff90811660c086015260018401546113df9164010000000082048116916801000000000000000090041660e087015163ffffffff1688600a0360f860020a02614d89565b63ffffffff1660e085015260018054600160a060020a031690630647b106906000908c898151811061140d57fe5b906020019060200201516040015161142489614de9565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561147b57600080fd5b6102c65a03f1151561148c57600080fd5b5050600154600160a060020a03169050630bd6c7698a87815181106114ad57fe5b906020019060200201515160096000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561150f57600080fd5b6102c65a03f1151561152057600080fd5b50505060405180519250506001850160020a8781151561153c57fe5b0490508581111561154a5750845b600154958190039591810191600160a060020a0316630647b1068a878151811061157057fe5b9060200190602002015151600960008660405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b15156115d057600080fd5b6102c65a03f115156115e157600080fd5b5050600190950194506111ee565b60008611156117c95760015461167f90600160a060020a0316630bd6c7698c60086000806040516020015260405163ffffffff85811660e060020a02825293909316600484015260248301919091526044820152606401602060405180830381600087803b151561165f57600080fd5b6102c65a03f1151561167057600080fd5b50505060405180519050614ebb565b89600a8151811061168c57fe5b60209081029091010152600154600160a060020a0316630bd6c7698a600a815181106116b457fe5b906020019060200201515160096000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561171657600080fd5b6102c65a03f1151561172757600080fd5b50505060405180516001549088019350600160a060020a03169050630647b1068a600a8151811061175457fe5b9060200190602002015151600960008660405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b15156117b457600080fd5b6102c65a03f115156117c557600080fd5b5050505b600154600160a060020a0316630647b106600060078d6117e88d614f35565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561183f57600080fd5b6102c65a03f1151561185057600080fd5b5050507f621ded8b7024f7261900c87ffcf043a3611e1157cf40f9a3a7949a8c54ce316e8a60405163ffffffff909116815260200160405180910390a150505050505050505050565b60025460009060a060020a900460ff16156118b357600080fd5b600082116118c057600080fd5b600154600160a060020a0316630bd6c7693360096000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561192957600080fd5b6102c65a03f1151561193a57600080fd5b50505060405180519150508082111561195257600080fd5b6001549082900390600160a060020a0316630647b10633600960008560405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b15156119be57600080fd5b6102c65a03f115156119cf57600080fd5b5050600154600160a060020a0316905063c95f8b91338460405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611a2957600080fd5b6102c65a03f11515611a3a57600080fd5b5050505050565b60005433600160a060020a03908116911614611a5c57600080fd5b6002805474ff000000000000000000000000000000000000000019169055565b611a84615cf5565b60005433600160a060020a03908116911614611a9f57600080fd5b600154611b1190600160a060020a0316630bd6c7696000600787826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610b1957600080fd5b60ff8316610100820152600154909150600160a060020a0316630647b1066000600786611b3d86614f35565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b15156109c357600080fd5b611b9c615d9d565b611ba4615cf5565b60025460009060a060020a900460ff1615611bbe57600080fd5b60005433600160a060020a03908116911614611bd957600080fd5b600154611c6590600160a060020a0316630bd6c76960008080806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b1515611c4557600080fd5b6102c65a03f11515611c5657600080fd5b50505060405180519050615015565b60ff808b1684528981166020808601919091528982166040860152908816606085015269ffffffffffffffffffff8716608085015263ffffffff861660c0850152600160a08501529093508301805160010163ffffffff1690526020830151600154909150600160a060020a0316630647b1066000600784611ce687614f35565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b1515611d3d57600080fd5b6102c65a03f11515611d4e57600080fd5b5050600154600160a060020a03169050630647b10660008080611d70886150d0565b60405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515611dc057600080fd5b6102c65a03f11515611dd157600080fd5b5050507fa4039098a3bc54729b2ea56d9b9c10da33618d8b141b7ef6b5c9c6b3bd2fdef88160405163ffffffff909116815260200160405180910390a1505050505050505050565b600154600160a060020a031681565b611e30615d41565b611e38615dd2565b611e40615ce3565b60025460a060020a900460ff1615611e5757600080fd5b60018054611ecd91600160a060020a0390911690630bd6c7699060009089826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b92506000835160ff1611611ee057600080fd5b600154611f5290600160a060020a0316630bd6c7696000600289826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610bb157600080fd5b9150600160a060020a0333168251600160a060020a031614611f7357600080fd5b826040015160ff1615611f8557600080fd5b69ffffffffffffffffffff841681526001604084018190528054600160a060020a031690630647b1069060009088611fbc88614de9565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561201357600080fd5b6102c65a03f1151561202457600080fd5b5050600154600160a060020a03169050630647b106600060048861204786615167565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561209e57600080fd5b6102c65a03f115156120af57600080fd5b50505033600160a060020a03167fb4b714502735fdcccb277397b149541771cf47f0fe9ac9ff8cedbede62867549868660405163ffffffff909216825269ffffffffffffffffffff1660208201526040908101905180910390a25050505050565b6000806000806000806000612123615cf5565b60025460a060020a900460ff161561213a57600080fd5b6001546121ac90600160a060020a0316630bd6c769600060078d826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610b1957600080fd5b90508060a0015160ff16600114975080600001519650806020015195508060400151945080606001519350806080015192508060c00151915050919395979092949650565b6121f9615d41565b612201615dd2565b612209615ce3565b60008060008060008061221a615dd2565b60025460a060020a900460ff161561223157600080fd5b600180546122a791600160a060020a0390911690630bd6c769906000908f826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b995060008a5160ff16116122ba57600080fd5b896040015160ff1660011415156122d057600080fd5b60015461234290600160a060020a0316630bd6c769600060028f826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610bb157600080fd5b9850600160a060020a0333168951600160a060020a0316141561236457600080fd5b6001546123f690600160a060020a0316630bd6c769600060048f826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b15156123d657600080fd5b6102c65a03f115156123e757600080fd5b50505060405180519050615186565b9750875169ffffffffffffffffffff163414151561241357600080fd5b600154600160a060020a0316630bd6c7698a5160036000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561247d57600080fd5b6102c65a03f1151561248e57600080fd5b5050506040518051600154909850600160a060020a03169050630bd6c7693360036000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561250457600080fd5b6102c65a03f1151561251557600080fd5b505050604051805196508890505169ffffffffffffffffffff1692508851600160a060020a033381168b5260006040808e01829052818c52600180549a01999395509290911691630bd6c7699185916003918c91516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b15156125b957600080fd5b6102c65a03f115156125ca57600080fd5b5050506040518051600154909650600160a060020a03169050630647b1068360038a600060405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b151561263e57600080fd5b6102c65a03f1151561264f57600080fd5b50505086896020015160010163ffffffff161415156127f357600154600160a060020a0316630647b10683600360208d01516001018960405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b15156126dc57600080fd5b6102c65a03f115156126ed57600080fd5b505060015461275d9150600160a060020a0316630bd6c7696000600289826040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b1515610bb157600080fd5b9050886020015163ffffffff166020820152600154600160a060020a0316630647b106600060028861278e866151c7565b60405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b15156127de57600080fd5b6102c65a03f115156127ef57600080fd5b5050505b85896020019063ffffffff16908163ffffffff1681525050600160009054906101000a9004600160a060020a0316600160a060020a0316630647b106336003898f63ffffffff1660010260405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b151561288d57600080fd5b6102c65a03f1151561289e57600080fd5b50506001546014850495509385900393600160a060020a03169050630bd6c7696000600581806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561291657600080fd5b6102c65a03f1151561292757600080fd5b5050506040518051600154600019909901989086019650600160a060020a03169050630647b10633600360008a60405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b15156129a457600080fd5b6102c65a03f115156129b557600080fd5b5050600154600160a060020a03169050630647b10683600360008b60405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515612a2057600080fd5b6102c65a03f11515612a3157600080fd5b5050600154600160a060020a03169050630647b106600060028e612a548e6151c7565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b1515612aab57600080fd5b6102c65a03f11515612abc57600080fd5b505060018054600160a060020a03169150630647b106906000908e612ae08f614de9565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b1515612b3757600080fd5b6102c65a03f11515612b4857600080fd5b5050600154600160a060020a03169050630647b106600060048e612b6b8d615167565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b1515612bc257600080fd5b6102c65a03f11515612bd357600080fd5b5050600154600160a060020a03169050630647b10660006005818960405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515612c3e57600080fd5b6102c65a03f11515612c4f57600080fd5b5050600154600160a060020a03169050630bd6c7698360096000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b1515612cbc57600080fd5b6102c65a03f11515612ccd57600080fd5b5050506040518051600154940193600160a060020a03169050630647b10683600960008760405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515612d4157600080fd5b6102c65a03f11515612d5257600080fd5b5050600154600160a060020a031690503480156108fc0290604051600060405180830381858888f193505050501515612d8a57600080fd5b81600160a060020a031633600160a060020a03167f6f9d73dbd7c6ce8ede881a6e9c8e862e8b77a2128e5a62b1eef167c7e0d2f84c8d60405163ffffffff909116815260200160405180910390a35050505050505050505050565b60025460a060020a900460ff1681565b60005433600160a060020a03908116911614612e1057600080fd5b61016060405190810160409081526001825267ffffffffffffffff808e1660208085019190915263ffffffff808f16848601528d811660608601528c811660808601528b811660a08601528a811660c086015289811660e0860152888116610100860152878116610120860152918616610140850152908f1660009081526003909152208151815460ff19169015151781556020820151815467ffffffffffffffff919091166101000268ffffffffffffffff00199091161781556040820151815463ffffffff919091166901000000000000000000026cffffffff000000000000000000199091161781556060820151815463ffffffff919091166d01000000000000000000000000000270ffffffff00000000000000000000000000199091161781556080820151815463ffffffff91909116710100000000000000000000000000000000000274ffffffff00000000000000000000000000000000001990911617815560a0820151815463ffffffff9190911675010000000000000000000000000000000000000000000278ffffffff0000000000000000000000000000000000000000001990911617815560c0820151815463ffffffff9190911660c860020a027fffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffffff90911617815560e082015160018201805463ffffffff191663ffffffff929092169190911790556101008201518160010160046101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160010160086101000a81548163ffffffff021916908363ffffffff1602179055506101408201516001918201805467ffffffffffffffff929092166c010000000000000000000000000273ffffffffffffffff0000000000000000000000001990921691909117905554600160a060020a03169050630bd6c7696000600c8f826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b151561312357600080fd5b6102c65a03f1151561313457600080fd5b50505060405180519a505063ffffffff8a16151561326d57600154600160a060020a0316630647b1066000600b8f63ffffffff861660405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b15156131c057600080fd5b6102c65a03f115156131d157600080fd5b505050600160009054906101000a9004600160a060020a0316600160a060020a0316630647b1066000600c8f6001800260405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561325857600080fd5b6102c65a03f1151561326957600080fd5b5050505b505050505050505050505050565b600154600090600160a060020a0316630bd6c76982600685826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b151561106157600080fd5b600254600160a060020a031681565b6000806000613307615d41565b61330f615dd2565b613317615ce3565b6001805461338d91600160a060020a0390911690630bd6c769906000908b826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b925082604001516001805460ff9290921614965061341090600160a060020a0316630bd6c769600060028b826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610bb157600080fd5b9150815160015490955061348990600160a060020a0316630bd6c769600060048b826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b15156123d657600080fd5b90508051959794965050505050565b6134a0615de9565b60008080600160a060020a03861615156134b957600080fd5b6134c2866137c0565b9250846008019150828211156134d6578291505b50835b818110156135915760018054600160a060020a031690630bd6c769908890600390850160006040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561355057600080fd5b6102c65a03f1151561356157600080fd5b50505060405180519050848683036008811061357957fe5b63ffffffff90921660209290920201526001016134d9565b50505092915050565b60025460009060a060020a900460ff16156135b457600080fd5b6135bd83613657565b9050600063ffffffff8216116135d257600080fd5b6135df83336001856144ff565b60015460001990910190600160a060020a0316630647b1066000600b8663ffffffff861660405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925261ffff1660448301526064820152608401600060405180830381600087803b15156109c357600080fd5b600154600090600160a060020a0316630bd6c76982600b85826040516020015260405160e060020a63ffffffff8616028152600160a060020a039093166004840152602483019190915261ffff166044820152606401602060405180830381600087803b151561106157600080fd5b600054600160a060020a031681565b60008060008060008060008060006136eb615d41565b6001805461376191600160a060020a0390911690630bd6c769906000908f826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b90506001815160ff1610159950806040015160ff166001149250806080015198508060a0015197508060c0015196508060e001519550806101000151945080610140015193506137b08b6151fe565b9150509193959799909294969850565b600080600160a060020a03831615156137d857600080fd5b600154600160a060020a0316630bd6c7698460036000806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561384157600080fd5b6102c65a03f1151561385257600080fd5b5050506040518051949350505050565b61386a615ce3565b613872615ce3565b61387a615e12565b6000613884615ce3565b61388c615ce3565b600060018815151461389f5760056138a2565b60005b60ff16935060056040518059106138b65750595b9080825280602002602001820160405250925060056040518059106138d85750595b90808252806020026020018201604052509150600090505b60058163ffffffff1610156139cf5760015461396e90600160a060020a0316630bd6c7698b600863ffffffff8616890160006040516020015260405163ffffffff85811660e060020a02825293909316600484015260248301919091526044820152606401602060405180830381600087803b151561165f57600080fd5b94508451838263ffffffff168151811061398457fe5b600160a060020a039092166020928302909101820152850151828263ffffffff16815181106139af57fe5b67ffffffffffffffff9092166020928302909101909101526001016138f0565b509097909650945050505050565b6139e5615d41565b6139ed615dd2565b60025460a060020a900460ff1615613a0457600080fd5b60018054613a7a91600160a060020a0390911690630bd6c7699060009087826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610a8157600080fd5b91506000825160ff1611613a8d57600080fd5b816040015160ff166001141515613aa357600080fd5b600154613b1590600160a060020a0316630bd6c7696000600287826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610bb157600080fd5b9050600160a060020a0333168151600160a060020a031614613b3657600080fd5b60006040830181905260018054600160a060020a031691630647b1069186613b5d87614de9565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b1515613bb457600080fd5b6102c65a03f11515613bc557600080fd5b50505033600160a060020a03167f1fb384cbe837fb1441757fd8f31fa39bd2364252604125b500e1897ae8e555348460405163ffffffff909116815260200160405180910390a2505050565b60005433600160a060020a03908116911614613c2c57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b60008054819033600160a060020a03908116911614613c7957600080fd5b600154600160a060020a0316630bd6c7696000600581806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561106157600080fd5b60005433600160a060020a03908116911614613cfd57600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b613d34615ce3565b613d3c615cf5565b60025460009060a060020a900460ff1615613d5657600080fd5b60005433600160a060020a03908116911614613d7157600080fd5b613d7a84614c0b565b9093509150600090505b8160e0015163ffffffff16811015613e2f57600154600160a060020a0316630647b10685600884613dc9888281518110613dba57fe5b90602001906020020151615285565b60405163ffffffff86811660e060020a028252949094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515613e1357600080fd5b6102c65a03f11515613e2457600080fd5b505050600101613d84565b50505050565b613e3d615d41565b613e45615d41565b613e4d615ce3565b838152613e6181600063ffffffff6152d416565b60ff168252613e7781600263ffffffff6152d416565b60ff166040830152613e9081600463ffffffff6152f416565b63ffffffff9081166080840152613eac9082906008906152f416565b63ffffffff90811660a0840152613ec8908290600c906152f416565b63ffffffff90811660c0840152613ee49082906010906152f416565b63ffffffff90811660e0840152613f0090829060149061531716565b61ffff16610100830152613f1b81601863ffffffff61533816565b67ffffffffffffffff166101408301525092915050565b613f3a615cf5565b613f42615cf5565b613f4a615ce3565b838152613f5e81600063ffffffff6152d416565b60ff168252613f7481600163ffffffff6152d416565b60ff166020830152613f8d81600263ffffffff6152d416565b60ff166040830152613fa681600363ffffffff6152d416565b60ff166060830152613fbf81600463ffffffff61535f16565b69ffffffffffffffffffff166080830152613fe181600e63ffffffff6152d416565b60ff1660a0830152613ffa81600f63ffffffff6152f416565b63ffffffff90811660c08401526140169082906013906152f416565b63ffffffff90811660e08401526140329082906017906152d416565b60ff166101008301525092915050565b61404a615dd2565b614052615dd2565b61405a615ce3565b83815261406e81600063ffffffff61538816565b600160a060020a0316825261408a81601463ffffffff6152f416565b63ffffffff1660208301525092915050565b6140a5816153ae565b600254600160a060020a0316637e638974610240830151836102600151846102800151856102a0015160006040516060015260405160e060020a63ffffffff87160281526004810194909452602484019290925260448301526064820152608401606060405180830381600087803b151561411f57600080fd5b6102c65a03f1151561413057600080fd5b505050604051805190602001805190602001805167ffffffffffffffff166103c085015250600790810b810b61034084015290810b900b610320820152614176816153d5565b600a340461038082019081525134036103a0820152600154600160a060020a0316630bd6c7696000600581806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b15156141f457600080fd5b6102c65a03f1151561420557600080fd5b50505060405180519050610380820181815101905250600154600160a060020a0316630bd6c769600060066102c085015160006040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b151561428f57600080fd5b6102c65a03f115156142a057600080fd5b505050604051805190506103a0820181815101905250600154600160a060020a0316630647b106600060058161038086015160405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b151561432257600080fd5b6102c65a03f1151561433357600080fd5b5050600154600160a060020a03169050630647b106600060066102c0850151856103a0015160405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b15156143af57600080fd5b6102c65a03f115156143c057600080fd5b5050600154600160a060020a03169050630647b106600060076102c08501516143ed866102200151614f35565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561444457600080fd5b6102c65a03f1151561445557600080fd5b5050600154600160a060020a031690503480156108fc0290604051600060405180830381858888f19350505050151561448d57600080fd5b33600160a060020a03167fbc6a49a3bfd3c950d55a640741c984eb090baca50cd8433c70b74bd2617950ab826102c0015183610320015184610340015160405163ffffffff9093168352600791820b820b6020840152810b900b6040808301919091526060909101905180910390a250565b6000614509615d9d565b6000806000614516615d41565b6000614520615dd2565b61ffff8c166000908152600360205260409020805490985060ff16151561454657600080fd5b8915614568578754610100900467ffffffffffffffff16341461456857600080fd5b6001546145d490600160a060020a0316630bd6c76960008080806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b1515611c4557600080fd5b600154909750600160a060020a0316630bd6c7696000600581806040516020015260405160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091526044820152606401602060405180830381600087803b151561464057600080fd5b6102c65a03f1151561465157600080fd5b50505060405180519650879050805160010163ffffffff169052865194506146788b6137c0565b600180855261ffff8e16610100860152600060408601520193506002424189516000604051602001526040518084815260200183600160a060020a0316600160a060020a03166c010000000000000000000000000281526014018263ffffffff1663ffffffff1660e060020a028152600401935050505060206040518083038160008661646e5a03f1151561470c57600080fd5b505060405180518954909350614754915063ffffffff690100000000000000000082048116916d01000000000000000000000000009004168460005b1a60f860020a026157e5565b63ffffffff908116608085015288546147a1917101000000000000000000000000000000000082048116917501000000000000000000000000000000000000000000900416846001614748565b63ffffffff90811660a0850152885460018a01546147cd9260c860020a90920482169116846002614748565b63ffffffff90811660c0850152600189015461480391640100000000820481169168010000000000000000900416846003614748565b63ffffffff90811660e08501526001898101546c01000000000000000000000000900467ffffffffffffffff16610140860152600160a060020a038d8116845260001987018316602085015290543498909801971690630647b106908d9060039088908a1660405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b15156148b857600080fd5b6102c65a03f115156148c957600080fd5b5050600154600160a060020a03169050630647b1068c600360008860405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b151561493457600080fd5b6102c65a03f1151561494557600080fd5b505060018054600160a060020a03169150630647b106906000908861496988614de9565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b15156149c057600080fd5b6102c65a03f115156149d157600080fd5b5050600154600160a060020a03169050630647b10660006002886149f4866151c7565b60405163ffffffff86811660e060020a028252600160a060020a039590951660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b1515614a4b57600080fd5b6102c65a03f11515614a5c57600080fd5b5050600154600160a060020a03169050630647b10660008080614a7e8c6150d0565b60405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515614ace57600080fd5b6102c65a03f11515614adf57600080fd5b5050508915614b9857600154600160a060020a0316630647b10660006005818a60405160e060020a63ffffffff8716028152600160a060020a039094166004850152602484019290925260448301526064820152608401600060405180830381600087803b1515614b4f57600080fd5b6102c65a03f11515614b6057600080fd5b5050600154600160a060020a031690503480156108fc0290604051600060405180830381858888f193505050501515614b9857600080fd5b8a600160a060020a03167fea0aee148209a01ccf8bff07fa316fc18ab073d469a1c9870818b3e5913ff0e38d878c60405161ffff909316835263ffffffff919091166020830152600160a060020a03166040808301919091526060909101905180910390a2505050505050505050505050565b614c13615ce3565b614c1b615cf5565b600154600090614c8f90600160a060020a0316630bd6c76983600788826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610b1957600080fd5b9150600b604051805910614ca05750595b908082528060200260200182016040528015614cd657816020015b614cc3615e12565b815260200190600190039081614cbb5790505b509250600090505b8160e0015163ffffffff16811015614d7557600154614d5790600160a060020a0316630bd6c7698660088560006040516020015260405163ffffffff85811660e060020a02825293909316600484015260248301919091526044820152606401602060405180830381600087803b151561165f57600080fd5b838281518110614d6357fe5b60209081029091010152600101614cde565b614d83838360e001516157fc565b50915091565b600084614d978686856157e5565b038301925084831080614da957508383115b15614db2578392505b50909392505050565b600084614dc98686856157e5565b038303925084831080614ddb57508383115b15614db25750929392505050565b6000614df3615ce3565b614e086000845183919063ffffffff61594316565b614e206002846040015183919063ffffffff61594316565b614e386004846080015183919063ffffffff61596216565b614e5060088460a0015183919063ffffffff61596216565b614e68600c8460c0015183919063ffffffff61596216565b614e8060108460e0015183919063ffffffff61596216565b614e99601484610100015183919063ffffffff61598116565b614eb2601884610140015183919063ffffffff6159a116565b80519392505050565b614ec3615e12565b614ecb615e12565b614ed3615ce3565b838152614ee781600063ffffffff61538816565b600160a060020a03168252614f0381601463ffffffff61533816565b67ffffffffffffffff166020830152614f2381601c63ffffffff6152f416565b63ffffffff1660408301525092915050565b6000614f3f615ce3565b614f546000845183919063ffffffff61594316565b614f6c6001846020015183919063ffffffff61594316565b614f846002846040015183919063ffffffff61594316565b614f9c6003846060015183919063ffffffff61594316565b614fb46004846080015183919063ffffffff6159c716565b614fcc600e8460a0015183919063ffffffff61594316565b614fe4600f8460c0015183919063ffffffff61596216565b614ffc60138460e0015183919063ffffffff61596216565b614eb2601784610100015183919063ffffffff61594316565b61501d615d9d565b615025615d9d565b61502d615ce3565b83815261504181600063ffffffff6152f416565b63ffffffff908116835261505a9082906004906152f416565b63ffffffff90811660208401526150769082906008906152d416565b60ff16604083015261508f81600963ffffffff6152d416565b60ff1660608301526150a881600a63ffffffff6152d416565b60ff1660808301526150c181600b63ffffffff6152d416565b60ff1660a08301525092915050565b60006150da615ce3565b6150ef6000845183919063ffffffff61596216565b6151076004846020015183919063ffffffff61596216565b61511f6008846040015183919063ffffffff61594316565b6151376009846060015183919063ffffffff61594316565b61514f600a846080015183919063ffffffff61594316565b614eb2600b8460a0015183919063ffffffff61594316565b6000615171615ce3565b614eb26000845183919063ffffffff6159c716565b61518e615ce3565b615196615ce3565b61519e615ce3565b8381526151b281600063ffffffff61535f16565b69ffffffffffffffffffff1682525092915050565b60006151d1615ce3565b6151e66000845183919063ffffffff6159ef16565b614eb26014846020015183919063ffffffff61596216565b6000615208615dd2565b60015461527a90600160a060020a0316630bd6c7696000600287826040516020015260405163ffffffff85811660e060020a028252600160a060020a0394909416600482015260248101929092529091166044820152606401602060405180830381600087803b1515610bb157600080fd5b905080519392505050565b600061528f615ce3565b6152a46000845183919063ffffffff6159ef16565b6152bc6014846020015183919063ffffffff6159a116565b614eb2601c846040015183919063ffffffff61596216565b600063ffffffff6008830216835160029190910a900460ff169392505050565b600063ffffffff6008830216835160029190910a900463ffffffff169392505050565b600063ffffffff6008830216835160029190910a900461ffff169392505050565b600063ffffffff6008830216835160029190910a900467ffffffffffffffff169392505050565b600063ffffffff6008830216835160029190910a900469ffffffffffffffffffff169392505050565b600063ffffffff6008830216835160029190910a9004600160a060020a03169392505050565b6153b781615a14565b6153c081615a88565b6153c981615aff565b6153d281615b7a565b50565b6153dd615e12565b6153e5615e12565b6000806000856103600151600160a060020a031685526103c086015167ffffffffffffffff1660208601526102e086015163ffffffff166040860152600092505b85610220015160e0015163ffffffff168363ffffffff16101561558e576001546154b190600160a060020a0316630bd6c7696102c089015160088760006040516020015260405163ffffffff85811660e060020a028252938416600482015260248101929092529091166044820152606401602060405180830381600087803b151561165f57600080fd5b9350856103600151600160a060020a03168451600160a060020a0316141561558357836020015167ffffffffffffffff16866103c0015167ffffffffffffffff16101561557e57600154600160a060020a0316630647b1066102c088015160088661551b8a615285565b60405163ffffffff86811660e060020a02825294851660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561556957600080fd5b6102c65a03f1151561557a57600080fd5b5050505b6109d4565b600190920191615426565b600a86610220015160e0015163ffffffff16101561564f57600154600160a060020a0316630647b1066102c0880151600889610220015160e001516155d28a615285565b60405163ffffffff86811660e060020a02825294851660048201526024810193909352921660448201526064810191909152608401600060405180830381600087803b151561562057600080fd5b6102c65a03f1151561563157600080fd5b50505085610220015160e001805160010163ffffffff1690526109d4565b506000915081905063ffffffff5b85610220015160e0015163ffffffff168363ffffffff161015615720576001546156e890600160a060020a0316630bd6c7696102c089015160088760006040516020015260405163ffffffff85811660e060020a028252938416600482015260248101929092529091166044820152606401602060405180830381600087803b151561165f57600080fd5b93508167ffffffffffffffff16846020015167ffffffffffffffff16111561571557836020015191508290505b60019092019161565d565b63ffffffff808216146109d45760015461579b90600160a060020a0316630bd6c7696102c089015160088560006040516020015260405163ffffffff85811660e060020a028252938416600482015260248101929092529091166044820152606401602060405180830381600087803b151561165f57600080fd5b9350836020015167ffffffffffffffff16866103c0015167ffffffffffffffff1610156109d457600154600160a060020a0316630647b1066102c088015160088461551b8a615285565b60649183900360f860020a90910482900602040190565b806000805b506000905060015b8263ffffffff168163ffffffff16101561592b57848163ffffffff168151811061582f57fe5b906020019060200201516020015167ffffffffffffffff16856001830363ffffffff168151811061585c57fe5b906020019060200201516020015167ffffffffffffffff16111561592357846001820363ffffffff168151811061588f57fe5b9060200190602002015185600a815181106158a657fe5b602090810290910101528463ffffffff8216815181106158c257fe5b90602001906020020151856001830363ffffffff16815181106158e157fe5b6020908102909101015284600a815181106158f857fe5b90602001906020020151858263ffffffff168151811061591457fe5b60209081029091010152600191505b600101615809565b6000199092019181151561593e57611a3a565b615801565b63ffffffff600883021660020a60ff8216028381815117905250505050565b63ffffffff60088302811660020a908216028381815117905250505050565b63ffffffff600883021660020a61ffff8216028381815117905250505050565b63ffffffff600883021660020a67ffffffffffffffff8216028381815117905250505050565b63ffffffff600883021660020a69ffffffffffffffffffff8216028381815117905250505050565b63ffffffff600883021660020a600160a060020a038216028381815117905250505050565b615a1c615ce3565b615a316000835183919063ffffffff6159a116565b615a496008836020015183919063ffffffff6159a116565b615a616010836040015183919063ffffffff6159a116565b615a796018836060015183919063ffffffff6159a116565b80516102409092019190915250565b615a90615ce3565b615aa86000836080015183919063ffffffff6159a116565b615ac060088360a0015183919063ffffffff6159a116565b615ad860108360c0015183919063ffffffff6159a116565b615af060188360e0015183919063ffffffff6159a116565b80516102609092019190915250565b615b07615ce3565b615b20600083610100015183919063ffffffff6159a116565b615b39600883610120015183919063ffffffff6159a116565b615b52601083610140015183919063ffffffff6159a116565b615b6b601883610160015183919063ffffffff6159a116565b80516102809092019190915250565b615b82615ce3565b615b9b600083610180015183919063ffffffff6159a116565b615bb46008836101a0015183919063ffffffff6159a116565b615bcd6010836101c0015183919063ffffffff6159a116565b80516102a09092019190915250565b6106406040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a082018190526101c08201526101e08101615c62615d41565b8152602001615c6f615dd2565b8152602001615c7c615cf5565b815260006020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082018190526101408201819052610160820181905261018082018190526101a09091015290565b60206040519081016040526000815290565b6101206040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e0820181905261010082015290565b6101606040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a0820181905260c0820181905260e082018190526101008201819052610120820181905261014082015290565b60c06040519081016040908152600080835260208301819052908201819052606082018190526080820181905260a082015290565b604080519081016040526000808252602082015290565b6101006040519081016040526008815b600081526000199091019060200181615df95790505090565b6060604051908101604090815260008083526020830181905290820152905600a165627a7a72305820ea854ea4a55143f54b23e92811990e289365f5cf1940197a6d67b24e17a1232a0029

Swarm Source

bzzr://ea854ea4a55143f54b23e92811990e289365f5cf1940197a6d67b24e17a1232a

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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