Contract 0x94e34F68d66b5DD954b56A513cf7c48f08036F19

 
 
Txn Hash
Method
Block
From
To
Value
0x75ee582ecddd93e2a67976e639a999137b640f3cbd26b1f685db5565d23e34c5Transfer Ownersh...67903282018-11-28 21:03:451356 days 22 hrs agoDragonereum Egg: Deployer IN  Dragonereum: Battle Controller0 Ether0.‍001522550
0xcd19d9a89da55da0824e462612b64da2b1bc2abf04d02d7669cf8d4d97d74e58Set External Dep...67903192018-11-28 21:01:011356 days 22 hrs agoDragonereum Egg: Deployer IN  Dragonereum: Battle Controller0 Ether0.‍0042579550
0x783d9240dab0d9f0d4109a55e5ab82399c2a3a9269e3d4eb834edcc2a4fe3455Set Internal Dep...67903192018-11-28 21:01:011356 days 22 hrs agoDragonereum Egg: Deployer IN  Dragonereum: Battle Controller0 Ether0.‍0127194550
0xbbdfd6021ff04b2b5fa421aaea0bd9dca49dc072e3bf110a83ec1dd1b607f0960x6080604067902892018-11-28 20:54:581356 days 22 hrs agoDragonereum Egg: Deployer IN  Create: BattleController0 Ether0.‍195249150
[ Download CSV Export 
View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
BattleController

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-11-30
*/

pragma solidity 0.4.25;

library SafeMath8 {

    function mul(uint8 a, uint8 b) internal pure returns (uint8) {
        if (a == 0) {
            return 0;
        }
        uint8 c = a * b;
        assert(c / a == b);
        return c;
    }

    function div(uint8 a, uint8 b) internal pure returns (uint8) {
        return a / b;
    }

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

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

    function pow(uint8 a, uint8 b) internal pure returns (uint8) {
        if (a == 0) return 0;
        if (b == 0) return 1;

        uint8 c = a ** b;
        assert(c / (a ** (b - 1)) == a);
        return c;
    }
}

library SafeMath16 {

    function mul(uint16 a, uint16 b) internal pure returns (uint16) {
        if (a == 0) {
            return 0;
        }
        uint16 c = a * b;
        assert(c / a == b);
        return c;
    }

    function div(uint16 a, uint16 b) internal pure returns (uint16) {
        return a / b;
    }

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

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

    function pow(uint16 a, uint16 b) internal pure returns (uint16) {
        if (a == 0) return 0;
        if (b == 0) return 1;

        uint16 c = a ** b;
        assert(c / (a ** (b - 1)) == a);
        return c;
    }
}

library SafeMath32 {

    function mul(uint32 a, uint32 b) internal pure returns (uint32) {
        if (a == 0) {
            return 0;
        }
        uint32 c = a * b;
        assert(c / a == b);
        return c;
    }

    function div(uint32 a, uint32 b) internal pure returns (uint32) {
        return a / b;
    }

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

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

    function pow(uint32 a, uint32 b) internal pure returns (uint32) {
        if (a == 0) return 0;
        if (b == 0) return 1;

        uint32 c = a ** b;
        assert(c / (a ** (b - 1)) == a);
        return c;
    }
}

library SafeMath256 {

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

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

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

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

    function pow(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        if (b == 0) return 1;

        uint256 c = a ** b;
        assert(c / (a ** (b - 1)) == a);
        return c;
    }
}

contract Ownable {
    address public owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    function _validateAddress(address _addr) internal pure {
        require(_addr != address(0), "invalid address");
    }

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner() {
        require(msg.sender == owner, "not a contract owner");
        _;
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _validateAddress(newOwner);
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
    }

}

contract Pausable is Ownable {
    event Pause();
    event Unpause();

    bool public paused = false;

    modifier whenNotPaused() {
        require(!paused, "contract is paused");
        _;
    }

    modifier whenPaused() {
        require(paused, "contract is not paused");
        _;
    }

    function pause() public onlyOwner whenNotPaused {
        paused = true;
        emit Pause();
    }

    function unpause() public onlyOwner whenPaused {
        paused = false;
        emit Unpause();
    }
}

contract Controllable is Ownable {
    mapping(address => bool) controllers;

    modifier onlyController {
        require(_isController(msg.sender), "no controller rights");
        _;
    }

    function _isController(address _controller) internal view returns (bool) {
        return controllers[_controller];
    }

    function _setControllers(address[] _controllers) internal {
        for (uint256 i = 0; i < _controllers.length; i++) {
            _validateAddress(_controllers[i]);
            controllers[_controllers[i]] = true;
        }
    }
}

contract Upgradable is Controllable {
    address[] internalDependencies;
    address[] externalDependencies;

    function getInternalDependencies() public view returns(address[]) {
        return internalDependencies;
    }

    function getExternalDependencies() public view returns(address[]) {
        return externalDependencies;
    }

    function setInternalDependencies(address[] _newDependencies) public onlyOwner {
        for (uint256 i = 0; i < _newDependencies.length; i++) {
            _validateAddress(_newDependencies[i]);
        }
        internalDependencies = _newDependencies;
    }

    function setExternalDependencies(address[] _newDependencies) public onlyOwner {
        externalDependencies = _newDependencies;
        _setControllers(_newDependencies);
    }
}

contract Getter {
    function getDragonProfile(uint256) external view returns (bytes32, uint16, uint256, uint8, uint8, uint16, bool, uint32);
    function getDragonStrength(uint256) external view returns (uint32);
    function getDragonCurrentHealthAndMana(uint256) external view returns (uint32, uint32, uint8, uint8);
    function getDragonHealthAndMana(uint256) external view returns (uint256, uint32, uint32, uint32, uint32);
    function getDragonsAmount() external view returns (uint256);
    function isDragonOwner(address, uint256) external view returns (bool);
    function ownerOfDragon(uint256) public view returns (address);
    function isDragonInGladiatorBattle(uint256) public view returns (bool);
}

contract Core is Upgradable {
    function setDragonRemainingHealthAndMana(uint256, uint32, uint32) external;
    function increaseDragonExperience(uint256, uint256) external;
    function increaseDragonWins(uint256) external;
    function increaseDragonDefeats(uint256) external;
    function resetDragonBuffs(uint256) external;
    function getDragonFullRegenerationTime(uint256) external view returns (uint32);
}

contract Battle {
    function start(uint256, uint256, uint8[2], uint8[2], uint256, bool) external returns (uint256[2], uint32, uint32, uint32, uint32, uint256);
}

contract Treasury {
    uint256 public hatchingPrice;
    function giveGold(address, uint256) external;
    function remainingGold() external view returns (uint256);
}

contract Random {
    function random(uint256) external view returns (uint256);
}




//////////////CONTRACT//////////////




contract BattleController is Upgradable {
    using SafeMath8 for uint8;
    using SafeMath16 for uint16;
    using SafeMath32 for uint32;
    using SafeMath256 for uint256;

    Core core;
    Battle battle;
    Treasury treasury;
    Getter getter;
    Random random;

    // stores date to which dragon is untouchable as opponent for the battle
    mapping (uint256 => uint256) lastBattleDate;

    uint8 constant MAX_PERCENTAGE = 100;
    uint8 constant MIN_HEALTH_PERCENTAGE = 50;
    uint8 constant MAX_TACTICS_PERCENTAGE = 80;
    uint8 constant MIN_TACTICS_PERCENTAGE = 20;
    uint8 constant PERCENT_MULTIPLIER = 100;
    uint8 constant DRAGON_STRENGTH_DIFFERENCE_PERCENTAGE = 10;

    uint256 constant GOLD_REWARD_MULTIPLIER = 10 ** 18;

    function _min(uint256 lth, uint256 rth) internal pure returns (uint256) {
        return lth > rth ? rth : lth;
    }

    function _isTouchable(uint256 _id) internal view returns (bool) {
        uint32 _regenerationTime = core.getDragonFullRegenerationTime(_id);
        return lastBattleDate[_id].add(_regenerationTime.mul(4)) < now;
    }

    function _checkBattlePossibility(
        address _sender,
        uint256 _id,
        uint256 _opponentId,
        uint8[2] _tactics
    ) internal view {
        require(getter.isDragonOwner(_sender, _id), "not an owner");
        require(!getter.isDragonOwner(_sender, _opponentId), "can't be owner of opponent dragon");
        require(!getter.isDragonOwner(address(0), _opponentId), "opponent dragon has no owner");

        require(!getter.isDragonInGladiatorBattle(_id), "your dragon participates in gladiator battle");
        require(!getter.isDragonInGladiatorBattle(_opponentId), "opponent dragon participates in gladiator battle");

        require(_isTouchable(_opponentId), "opponent dragon is untouchable");

        require(
            _tactics[0] >= MIN_TACTICS_PERCENTAGE &&
            _tactics[0] <= MAX_TACTICS_PERCENTAGE &&
            _tactics[1] >= MIN_TACTICS_PERCENTAGE &&
            _tactics[1] <= MAX_TACTICS_PERCENTAGE,
            "tactics value must be between 20 and 80"
        );

        uint8 _attackerHealthPercentage;
        uint8 _attackerManaPercentage;
        ( , , _attackerHealthPercentage, _attackerManaPercentage) = getter.getDragonCurrentHealthAndMana(_id);
        require(
            _attackerHealthPercentage >= MIN_HEALTH_PERCENTAGE,
            "dragon's health less than 50%"
        );
        uint8 _opponentHealthPercentage;
        uint8 _opponentManaPercentage;
        ( , , _opponentHealthPercentage, _opponentManaPercentage) = getter.getDragonCurrentHealthAndMana(_opponentId);
        require(
            _opponentHealthPercentage == MAX_PERCENTAGE &&
            _opponentManaPercentage == MAX_PERCENTAGE,
            "opponent health and/or mana is not full"
        );
    }

    function startBattle(
        address _sender,
        uint256 _id,
        uint256 _opponentId,
        uint8[2] _tactics
    ) external onlyController returns (
        uint256 battleId,
        uint256 seed,
        uint256[2] winnerLooserIds
    ) {
        _checkBattlePossibility(_sender, _id, _opponentId, _tactics);

        seed = random.random(2**256 - 1);

        uint32 _winnerHealth;
        uint32 _winnerMana;
        uint32 _looserHealth;
        uint32 _looserMana;

        (
            winnerLooserIds,
            _winnerHealth, _winnerMana,
            _looserHealth, _looserMana,
            battleId
        ) = battle.start(
            _id,
            _opponentId,
            _tactics,
            [0, 0],
            seed,
            false
        );

        core.setDragonRemainingHealthAndMana(winnerLooserIds[0], _winnerHealth, _winnerMana);
        core.setDragonRemainingHealthAndMana(winnerLooserIds[1], _looserHealth, _looserMana);

        core.increaseDragonWins(winnerLooserIds[0]);
        core.increaseDragonDefeats(winnerLooserIds[1]);

        lastBattleDate[_opponentId] = now;

        _payBattleRewards(
            _sender,
            _id,
            _opponentId,
            winnerLooserIds[0]
        );
    }

    function _payBattleRewards(
        address _sender,
        uint256 _id,
        uint256 _opponentId,
        uint256 _winnerId
    ) internal {
        uint32 _strength = getter.getDragonStrength(_id);
        uint32 _opponentStrength = getter.getDragonStrength(_opponentId);
        bool _isAttackerWinner = _id == _winnerId;

        uint256 _xpFactor = _calculateExperience(_isAttackerWinner, _strength, _opponentStrength);
        core.increaseDragonExperience(_winnerId, _xpFactor);

        if (_isAttackerWinner) {
            uint256 _factor = _calculateGoldRewardFactor(_strength, _opponentStrength);
            _payGoldReward(_sender, _id, _factor);
        }
    }

    function _calculateExperience(
        bool _isAttackerWinner,
        uint32 _attackerStrength,
        uint32 _opponentStrength
    ) internal pure returns (uint256) {

        uint8 _attackerFactor;
        uint256 _winnerStrength;
        uint256 _looserStrength;

        uint8 _degree;

        if (_isAttackerWinner) {
            _attackerFactor = 10;
            _winnerStrength = _attackerStrength;
            _looserStrength = _opponentStrength;
            _degree = _winnerStrength <= _looserStrength ? 2 : 5;
        } else {
            _attackerFactor = 5;
            _winnerStrength = _opponentStrength;
            _looserStrength = _attackerStrength;
            _degree = _winnerStrength <= _looserStrength ? 1 : 5;
        }

        uint256 _factor = _looserStrength.pow(_degree).mul(_attackerFactor).div(_winnerStrength.pow(_degree));

        if (_isAttackerWinner) {
            return _factor;
        }
        return _min(_factor, 10); // 1
    }

    function _calculateGoldRewardFactor(
        uint256 _winnerStrength,
        uint256 _looserStrength
    ) internal pure returns (uint256) {
        uint8 _degree = _winnerStrength <= _looserStrength ? 1 : 8;
        return _looserStrength.pow(_degree).mul(GOLD_REWARD_MULTIPLIER).div(_winnerStrength.pow(_degree));
    }

    function _getMaxGoldReward(
        uint256 _hatchingPrice,
        uint256 _dragonsAmount
    ) internal pure returns (uint256) {
        uint8 _factor;

        if (_dragonsAmount < 15000) _factor = 20;
        else if (_dragonsAmount < 30000) _factor = 10;
        else _factor = 5;

        return _hatchingPrice.mul(_factor).div(PERCENT_MULTIPLIER);
    }

    function _payGoldReward(
        address _sender,
        uint256 _id,
        uint256 _factor
    ) internal {
        uint256 _goldRemain = treasury.remainingGold();
        uint256 _dragonsAmount = getter.getDragonsAmount();
        uint32 _coolness;
        (, , , , , , , _coolness) = getter.getDragonProfile(_id);
        uint256 _hatchingPrice = treasury.hatchingPrice();
        // dragon coolness is multyplied by 100
        uint256 _value = _goldRemain.mul(_coolness).mul(10).div(_dragonsAmount.pow(2)).div(100);
        _value = _value.mul(_factor).div(GOLD_REWARD_MULTIPLIER);

        uint256 _maxReward = _getMaxGoldReward(_hatchingPrice, _dragonsAmount);
        if (_value > _maxReward) _value = _maxReward;
        if (_value > _goldRemain) _value = _goldRemain;
        treasury.giveGold(_sender, _value);
    }

    struct Opponent {
        uint256 id;
        uint256 timestamp;
        uint32 strength;
    }

    function _iterateTimestampIndex(uint8 _index) internal pure returns (uint8) {
        return _index < 5 ? _index.add(1) : 0;
    }

    function _getPercentOfValue(uint32 _value, uint8 _percent) internal pure returns (uint32) {
        return _value.mul(_percent).div(PERCENT_MULTIPLIER);
    }

    function matchOpponents(uint256 _attackerId) external view returns (uint256[6]) {
        uint32 _attackerStrength = getter.getDragonStrength(_attackerId);
        uint32 _strengthDiff = _getPercentOfValue(_attackerStrength, DRAGON_STRENGTH_DIFFERENCE_PERCENTAGE);
        uint32 _minStrength = _attackerStrength.sub(_strengthDiff);
        uint32 _maxStrength = _attackerStrength.add(_strengthDiff);
        uint32 _strength;
        uint256 _timestamp; // usually the date of the last battle
        uint8 _timestampIndex;
        uint8 _healthPercentage;
        uint8 _manaPercentage;

        address _owner = getter.ownerOfDragon(_attackerId);

        Opponent[6] memory _opponents;
        _opponents[0].timestamp =
        _opponents[1].timestamp =
        _opponents[2].timestamp =
        _opponents[3].timestamp =
        _opponents[4].timestamp =
        _opponents[5].timestamp = now;

        for (uint256 _id = 1; _id <= getter.getDragonsAmount(); _id++) { // no dragon with id = 0

            if (
                _attackerId != _id
                && !getter.isDragonOwner(_owner, _id)
                && !getter.isDragonInGladiatorBattle(_id)
                && _isTouchable(_id)
            ) {
                _strength = getter.getDragonStrength(_id);
                if (_strength >= _minStrength && _strength <= _maxStrength) {

                    ( , , _healthPercentage, _manaPercentage) = getter.getDragonCurrentHealthAndMana(_id);
                    if (_healthPercentage == MAX_PERCENTAGE && _manaPercentage == MAX_PERCENTAGE) {

                        (_timestamp, , , , ) = getter.getDragonHealthAndMana(_id);
                        if (_timestamp < _opponents[_timestampIndex].timestamp) {

                            _opponents[_timestampIndex] = Opponent(_id, _timestamp, _strength);
                            _timestampIndex = _iterateTimestampIndex(_timestampIndex);
                        }
                    }
                }
            }
        }
        return [
            _opponents[0].id,
            _opponents[1].id,
            _opponents[2].id,
            _opponents[3].id,
            _opponents[4].id,
            _opponents[5].id
        ];
    }

    function resetDragonBuffs(uint256 _id) external onlyController {
        core.resetDragonBuffs(_id);
    }

    // UPDATE CONTRACT

    function setInternalDependencies(address[] _newDependencies) public onlyOwner {
        super.setInternalDependencies(_newDependencies);

        core = Core(_newDependencies[0]);
        battle = Battle(_newDependencies[1]);
        treasury = Treasury(_newDependencies[2]);
        getter = Getter(_newDependencies[3]);
        random = Random(_newDependencies[4]);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[{"name":"_attackerId","type":"uint256"}],"name":"matchOpponents","outputs":[{"name":"","type":"uint256[6]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newDependencies","type":"address[]"}],"name":"setExternalDependencies","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"}],"name":"resetDragonBuffs","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newDependencies","type":"address[]"}],"name":"setInternalDependencies","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInternalDependencies","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_sender","type":"address"},{"name":"_id","type":"uint256"},{"name":"_opponentId","type":"uint256"},{"name":"_tactics","type":"uint8[2]"}],"name":"startBattle","outputs":[{"name":"battleId","type":"uint256"},{"name":"seed","type":"uint256"},{"name":"winnerLooserIds","type":"uint256[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getExternalDependencies","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061398c806100536000396000f300608060405260043610610099576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680635cc53bc71461009e57806365fc125314610107578063686623011461016d57806369c0ad931461019a5780638da5cb5b14610200578063b75c4f8014610257578063d71c9cf3146102c3578063e6458f6e1461036e578063f2fde38b146103da575b600080fd5b3480156100aa57600080fd5b506100c96004803603810190808035906020019092919050505061041d565b6040518082600660200280838360005b838110156100f45780820151818401526020810190506100d9565b5050505090500191505060405180910390f35b34801561011357600080fd5b5061016b60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610de1565b005b34801561017957600080fd5b5061019860048036038101908080359060200190929190505050610ec8565b005b3480156101a657600080fd5b506101fe60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610ff1565b005b34801561020c57600080fd5b5061021561127e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561026357600080fd5b5061026c6112a3565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102af578082015181840152602081019050610294565b505050509050019250505060405180910390f35b3480156102cf57600080fd5b50610322600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080604001909192919290505050611331565b6040518084815260200183815260200182600260200280838360005b8381101561035957808201518184015260208101905061033e565b50505050905001935050505060405180910390f35b34801561037a57600080fd5b506103836119fe565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156103c65780820151818401526020810190506103ab565b505050509050019250505060405180910390f35b3480156103e657600080fd5b5061041b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a8c565b005b6104256137f7565b60008060008060008060008060008061043c61381a565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b5de17188f6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1580156104cf57600080fd5b505af11580156104e3573d6000803e3d6000fd5b505050506040513d60208110156104f957600080fd5b81019080805190602001909291905050509b506105178c600a611c17565b9a506105328b8d63ffffffff16611c5990919063ffffffff16565b995061054d8b8d63ffffffff16611c7e90919063ffffffff16565b9850600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4d5d69d8f6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1580156105e057600080fd5b505af11580156105f4573d6000803e3d6000fd5b505050506040513d602081101561060a57600080fd5b810190808051906020019092919050505092504282600560068110151561062d57fe5b60200201516020018181525082600460068110151561064857fe5b60200201516020018181525082600360068110151561066357fe5b60200201516020018181525082600260068110151561067e57fe5b60200201516020018181525082600160068110151561069957fe5b6020020151602001818152508260006006811015156106b457fe5b60200201516020018181525050600190505b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663846a7f806040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561074c57600080fd5b505af1158015610760573d6000803e3d6000fd5b505050506040513d602081101561077657600080fd5b810190808051906020019092919050505081111515610d1657808e1415801561089c5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339b823e784836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561085f57600080fd5b505af1158015610873573d6000803e3d6000fd5b505050506040513d602081101561088957600080fd5b8101908080519060200190929190505050155b80156109715750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638792178b826040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561093457600080fd5b505af1158015610948573d6000803e3d6000fd5b505050506040513d602081101561095e57600080fd5b8101908080519060200190929190505050155b8015610982575061098181611ca8565b5b15610d0957600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b5de1718826040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015610a1857600080fd5b505af1158015610a2c573d6000803e3d6000fd5b505050506040513d6020811015610a4257600080fd5b810190808051906020019092919050505097508963ffffffff168863ffffffff1610158015610a7d57508863ffffffff168863ffffffff1611155b15610d0857600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8640dc7826040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050608060405180830381600087803b158015610b1357600080fd5b505af1158015610b27573d6000803e3d6000fd5b505050506040513d6080811015610b3d57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190505050909192509091508095508196505050606460ff168560ff16148015610b975750606460ff168460ff16145b15610d0757600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fcede2e5826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060a060405180830381600087803b158015610c2d57600080fd5b505af1158015610c41573d6000803e3d6000fd5b505050506040513d60a0811015610c5757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050509091925090915090505080975050818660ff16600681101515610caf57fe5b602002015160200151871015610d06576060604051908101604052808281526020018881526020018963ffffffff16815250828760ff16600681101515610cf257fe5b6020020181905250610d0386611dc8565b95505b5b5b5b80806001019150506106c6565b60c060405190810160405280836000600681101515610d3157fe5b6020020151600001518152602001836001600681101515610d4e57fe5b6020020151600001518152602001836002600681101515610d6b57fe5b6020020151600001518152602001836003600681101515610d8857fe5b6020020151600001518152602001836004600681101515610da557fe5b6020020151600001518152602001836005600681101515610dc257fe5b6020020151600001518152509c50505050505050505050505050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610ea5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f74206120636f6e7472616374206f776e657200000000000000000000000081525060200191505060405180910390fd5b8060039080519060200190610ebb929190613849565b50610ec581611dfb565b50565b610ed133611ea9565b1515610f45576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f20636f6e74726f6c6c65722072696768747300000000000000000000000081525060200191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166368662301826040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b158015610fd657600080fd5b505af1158015610fea573d6000803e3d6000fd5b5050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f74206120636f6e7472616374206f776e657200000000000000000000000081525060200191505060405180910390fd5b6110be81611eff565b8060008151811015156110cd57fe5b90602001906020020151600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600181518110151561112657fe5b90602001906020020151600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600281518110151561117f57fe5b90602001906020020151600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060038151811015156111d857fe5b90602001906020020151600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600481518110151561123157fe5b90602001906020020151600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060600280548060200260200160405190810160405280929190818152602001828054801561132757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116112dd575b5050505050905090565b60008061133c6138d3565b60008060008061134b33611ea9565b15156113bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f20636f6e74726f6c6c65722072696768747300000000000000000000000081525060200191505060405180910390fd5b6113f08b8b8b8b6002806020026040519081016040528092919082600260200280828437820191505050505061201b565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b863bd377fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1580156114a157600080fd5b505af11580156114b5573d6000803e3d6000fd5b505050506040513d60208110156114cb57600080fd5b81019080805190602001909291905050509550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663730599ee8b8b8b6040805190810160405280600060ff168152602001600060ff168152508b60006040518763ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018087815260200186815260200185600260200280828437820191505084600260200280838360005b838110156115b0578082015181840152602081019050611595565b5050505090500183815260200182151515158152602001965050505050505060e060405180830381600087803b1580156115e957600080fd5b505af11580156115fd573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525060e081101561162257600080fd5b810190809190826040018051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050809c50819650829750839850849950859a50505050505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7de6208660006002811015156116c657fe5b602002015186866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681526020019350505050600060405180830381600087803b15801561174557600080fd5b505af1158015611759573d6000803e3d6000fd5b50505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf7de6208660016002811015156117aa57fe5b602002015184846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018363ffffffff1663ffffffff1681526020018263ffffffff1663ffffffff1681526020019350505050600060405180830381600087803b15801561182957600080fd5b505af115801561183d573d6000803e3d6000fd5b50505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631cc1147f86600060028110151561188e57fe5b60200201516040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b1580156118e557600080fd5b505af11580156118f9573d6000803e3d6000fd5b50505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637c32898086600160028110151561194a57fe5b60200201516040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b1580156119a157600080fd5b505af11580156119b5573d6000803e3d6000fd5b5050505042600960008b8152602001908152602001600020819055506119f08b8b8b8860006002811015156119e657fe5b6020020151612c4c565b505050509450945094915050565b60606003805480602002602001604051908101604052809291908181526020018280548015611a8257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611a38575b5050505050905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b50576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f74206120636f6e7472616374206f776e657200000000000000000000000081525060200191505060405180910390fd5b611b5981612ee8565b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611c51606460ff16611c3d8460ff168663ffffffff16612f9090919063ffffffff16565b63ffffffff16612fe990919063ffffffff16565b905092915050565b60008263ffffffff168263ffffffff1611151515611c7357fe5b818303905092915050565b60008082840190508363ffffffff168163ffffffff1610151515611c9e57fe5b8091505092915050565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633c6f730e846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015611d3c57600080fd5b505af1158015611d50573d6000803e3d6000fd5b505050506040513d6020811015611d6657600080fd5b8101908080519060200190929190505050905042611dbf611d9760048463ffffffff16612f9090919063ffffffff16565b63ffffffff16600960008781526020019081526020016000205461300b90919063ffffffff16565b10915050919050565b600060058260ff1610611ddc576000611df4565b611df360018360ff1661302990919063ffffffff16565b5b9050919050565b60008090505b8151811015611ea557611e2a8282815181101515611e1b57fe5b90602001906020020151612ee8565b60018060008484815181101515611e3d57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080600101915050611e01565b5050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f6e6f74206120636f6e7472616374206f776e657200000000000000000000000081525060200191505060405180910390fd5b600090505b815181101561200057611ff38282815181101515611fe457fe5b90602001906020020151612ee8565b8080600101915050611fca565b8160029080519060200190612016929190613849565b505050565b600080600080600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339b823e789896040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156120e657600080fd5b505af11580156120fa573d6000803e3d6000fd5b505050506040513d602081101561211057600080fd5b81019080805190602001909291905050501515612195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f6e6f7420616e206f776e6572000000000000000000000000000000000000000081525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339b823e789886040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561225a57600080fd5b505af115801561226e573d6000803e3d6000fd5b505050506040513d602081101561228457600080fd5b8101908080519060200190929190505050151515612330576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f63616e2774206265206f776e6572206f66206f70706f6e656e7420647261676f81526020017f6e0000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339b823e76000886040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156123f657600080fd5b505af115801561240a573d6000803e3d6000fd5b505050506040513d602081101561242057600080fd5b81019080805190602001909291905050501515156124a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f6f70706f6e656e7420647261676f6e20686173206e6f206f776e65720000000081525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638792178b886040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561253757600080fd5b505af115801561254b573d6000803e3d6000fd5b505050506040513d602081101561256157600080fd5b810190808051906020019092919050505015151561260d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f796f757220647261676f6e2070617274696369706174657320696e20676c616481526020017f6961746f7220626174746c65000000000000000000000000000000000000000081525060400191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638792178b876040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561269e57600080fd5b505af11580156126b2573d6000803e3d6000fd5b505050506040513d60208110156126c857600080fd5b8101908080519060200190929190505050151515612774576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f6f70706f6e656e7420647261676f6e2070617274696369706174657320696e2081526020017f676c61646961746f7220626174746c650000000000000000000000000000000081525060400191505060405180910390fd5b61277d86611ca8565b15156127f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f6f70706f6e656e7420647261676f6e20697320756e746f75636861626c65000081525060200191505060405180910390fd5b601460ff1685600060028110151561280557fe5b602002015160ff16101580156128355750605060ff1685600060028110151561282a57fe5b602002015160ff1611155b801561285b5750601460ff1685600160028110151561285057fe5b602002015160ff1610155b80156128815750605060ff1685600160028110151561287657fe5b602002015160ff1611155b151561291b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f746163746963732076616c7565206d757374206265206265747765656e20323081526020017f20616e642038300000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8640dc7886040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050608060405180830381600087803b1580156129ac57600080fd5b505af11580156129c0573d6000803e3d6000fd5b505050506040513d60808110156129d657600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190505050909192509091508094508195505050603260ff168460ff1610151515612a93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f647261676f6e2773206865616c7468206c657373207468616e2035302500000081525060200191505060405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8640dc7876040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050608060405180830381600087803b158015612b2457600080fd5b505af1158015612b38573d6000803e3d6000fd5b505050506040513d6080811015612b4e57600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190505050909192509091508092508193505050606460ff168260ff16148015612ba85750606460ff168160ff16145b1515612c42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f6f70706f6e656e74206865616c746820616e642f6f72206d616e61206973206e81526020017f6f742066756c6c0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b5050505050505050565b6000806000806000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b5de1718896040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015612ce557600080fd5b505af1158015612cf9573d6000803e3d6000fd5b505050506040513d6020811015612d0f57600080fd5b81019080805190602001909291905050509450600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b5de1718886040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015612db357600080fd5b505af1158015612dc7573d6000803e3d6000fd5b505050506040513d6020811015612ddd57600080fd5b810190808051906020019092919050505093508588149250612e0083868661304d565b9150600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166314521d3c87846040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083815260200182815260200192505050600060405180830381600087803b158015612e9b57600080fd5b505af1158015612eaf573d6000803e3d6000fd5b505050508215612edd57612ecf8563ffffffff168563ffffffff16613132565b9050612edc8989836131a9565b5b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612f8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f696e76616c69642061646472657373000000000000000000000000000000000081525060200191505060405180910390fd5b50565b60008060008463ffffffff161415612fab5760009150612fe2565b82840290508263ffffffff168463ffffffff168263ffffffff16811515612fce57fe5b0463ffffffff16141515612fde57fe5b8091505b5092915050565b60008163ffffffff168363ffffffff1681151561300257fe5b04905092915050565b600080828401905083811015151561301f57fe5b8091505092915050565b60008082840190508360ff168160ff161015151561304357fe5b8091505092915050565b600080600080600080881561308b57600a94508763ffffffff1693508663ffffffff16925082841115613081576005613084565b60025b91506130b6565b600594508663ffffffff1693508763ffffffff169250828411156130b05760056130b3565b60015b91505b6131086130cf8360ff16866136d790919063ffffffff16565b6130fa8760ff166130ec8660ff16886136d790919063ffffffff16565b61372990919063ffffffff16565b61376490919063ffffffff16565b9050881561311857809550613126565b61312381600a61377a565b95505b50505050509392505050565b60008082841115613144576008613147565b60015b90506131a06131628260ff16866136d790919063ffffffff16565b613192670de0b6b3a76400006131848560ff16886136d790919063ffffffff16565b61372990919063ffffffff16565b61376490919063ffffffff16565b91505092915050565b600080600080600080600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b95e94846040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561323857600080fd5b505af115801561324c573d6000803e3d6000fd5b505050506040513d602081101561326257600080fd5b81019080805190602001909291905050509550600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663846a7f806040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156132fb57600080fd5b505af115801561330f573d6000803e3d6000fd5b505050506040513d602081101561332557600080fd5b81019080805190602001909291905050509450600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e79ab76a896040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505061010060405180830381600087803b1580156133ca57600080fd5b505af11580156133de573d6000803e3d6000fd5b505050506040513d6101008110156133f557600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050909192939495965090919293949550909192939450909192935090919250909150905080945050600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663529e89346040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156134f957600080fd5b505af115801561350d573d6000803e3d6000fd5b505050506040513d602081101561352357600080fd5b8101908080519060200190929190505050925061359a606461358c6135526002896136d790919063ffffffff16565b61357e600a6135708a63ffffffff168d61372990919063ffffffff16565b61372990919063ffffffff16565b61376490919063ffffffff16565b61376490919063ffffffff16565b91506135c9670de0b6b3a76400006135bb898561372990919063ffffffff16565b61376490919063ffffffff16565b91506135d58386613793565b9050808211156135e3578091505b858211156135ef578591505b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c47bf45f8a846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b1580156136b457600080fd5b505af11580156136c8573d6000803e3d6000fd5b50505050505050505050505050565b60008060008414156136ec5760009150613722565b60008314156136fe5760019150613722565b82840a90508360018403850a8281151561371457fe5b0414151561371e57fe5b8091505b5092915050565b600080600084141561373e576000915061375d565b828402905082848281151561374f57fe5b0414151561375957fe5b8091505b5092915050565b6000818381151561377157fe5b04905092915050565b6000818311613789578261378b565b815b905092915050565b600080613a988310156137a957601490506137c2565b6175308310156137bc57600a90506137c1565b600590505b5b6137ee606460ff166137e08360ff168761372990919063ffffffff16565b61376490919063ffffffff16565b91505092915050565b60c060405190810160405280600690602082028038833980820191505090505090565b610240604051908101604052806006905b6138336138f5565b81526020019060019003908161382b5790505090565b8280548282559060005260206000209081019282156138c2579160200282015b828111156138c15782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613869565b5b5090506138cf919061391d565b5090565b6040805190810160405280600290602082028038833980820191505090505090565b6060604051908101604052806000815260200160008152602001600063ffffffff1681525090565b61395d91905b8082111561395957600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101613923565b5090565b905600a165627a7a723058204463819678926bbd25a0ede9dce48ef0fde766e33eac252c9666baad6c5f59a00029

Swarm Source

bzzr://4463819678926bbd25a0ede9dce48ef0fde766e33eac252c9666baad6c5f59a0
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.