ETH Price: $3,220.31 (+3.30%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Stop70856572019-01-18 6:14:042204 days ago1547792044IN
0x0aDADF6B...AdA64074C
0 ETH0.000809313
Sell Character70816962019-01-17 13:20:482204 days ago1547731248IN
0x0aDADF6B...AdA64074C
0 ETH0.000076111.5
Fight70812272019-01-17 11:15:012205 days ago1547723701IN
0x0aDADF6B...AdA64074C
0 ETH0.000171312.1
Trigger Volcano ...70811702019-01-17 11:00:182205 days ago1547722818IN
0x0aDADF6B...AdA64074C
0 ETH0.000212455.6
Trigger Volcano ...70793042019-01-17 2:56:082205 days ago1547693768IN
0x0aDADF6B...AdA64074C
0 ETH0.000105672
Exit70786832019-01-17 0:13:112205 days ago1547683991IN
0x0aDADF6B...AdA64074C
0 ETH0.0014319410
Fight70786712019-01-17 0:11:372205 days ago1547683897IN
0x0aDADF6B...AdA64074C
0 ETH0.0005764210
Fight70786622019-01-17 0:10:222205 days ago1547683822IN
0x0aDADF6B...AdA64074C
0 ETH0.000086761.5
Fight70777212019-01-16 20:03:172205 days ago1547668997IN
0x0aDADF6B...AdA64074C
0 ETH0.000105061.4
Fight70777212019-01-16 20:03:172205 days ago1547668997IN
0x0aDADF6B...AdA64074C
0 ETH0.000125741.4
Fight70777212019-01-16 20:03:172205 days ago1547668997IN
0x0aDADF6B...AdA64074C
0 ETH0.0001451.4
Trigger Volcano ...70774562019-01-16 18:53:192205 days ago1547664799IN
0x0aDADF6B...AdA64074C
0 ETH0.000105872
Sell Character70772812019-01-16 18:07:252205 days ago1547662045IN
0x0aDADF6B...AdA64074C
0 ETH0.000113892.1
Sell Character70772802019-01-16 18:07:212205 days ago1547662041IN
0x0aDADF6B...AdA64074C
0 ETH0.000120722.1
Fight70756352019-01-16 11:18:432206 days ago1547637523IN
0x0aDADF6B...AdA64074C
0 ETH0.0006633510
Fight70756232019-01-16 11:16:072206 days ago1547637367IN
0x0aDADF6B...AdA64074C
0 ETH0.0006301510
Fight70756142019-01-16 11:13:262206 days ago1547637206IN
0x0aDADF6B...AdA64074C
0 ETH0.0009345410
Trigger Volcano ...70755312019-01-16 10:50:072206 days ago1547635807IN
0x0aDADF6B...AdA64074C
0 ETH0.000116242.2
Fight70750822019-01-16 8:43:582206 days ago1547628238IN
0x0aDADF6B...AdA64074C
0 ETH0.000403514.3
Fight70750722019-01-16 8:40:572206 days ago1547628057IN
0x0aDADF6B...AdA64074C
0 ETH0.00027634.3
Trigger Volcano ...70737252019-01-16 2:47:442206 days ago1547606864IN
0x0aDADF6B...AdA64074C
0 ETH0.000201163.8
Fight70730092019-01-15 23:40:222206 days ago1547595622IN
0x0aDADF6B...AdA64074C
0 ETH0.0007463910
Fight70729982019-01-15 23:38:352206 days ago1547595515IN
0x0aDADF6B...AdA64074C
0 ETH0.0007008510
Fight70725282019-01-15 21:44:182206 days ago1547588658IN
0x0aDADF6B...AdA64074C
0 ETH0.000096091.6
Trigger Volcano ...70718352019-01-15 18:44:332206 days ago1547577873IN
0x0aDADF6B...AdA64074C
0 ETH0.000212814.02
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
1.41063525 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.0097 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00531217 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00485 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00971661 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00489946 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.01701814 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00487963 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00575736 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00514665 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00529909 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00485 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.01163743 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00974938 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00485 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00487963 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00575736 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.097 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00485 ETH
70856572019-01-18 6:14:042204 days ago1547792044
0x0aDADF6B...AdA64074C
0.00485 ETH
70816962019-01-17 13:20:482204 days ago1547731248
0x0aDADF6B...AdA64074C
0.00485 ETH
70786832019-01-17 0:13:112205 days ago1547683991
0x0aDADF6B...AdA64074C
0.76779675 ETH
70772812019-01-16 18:07:252205 days ago1547662045
0x0aDADF6B...AdA64074C
0.00489938 ETH
70772802019-01-16 18:07:212205 days ago1547662041
0x0aDADF6B...AdA64074C
0.00486646 ETH
70691762019-01-15 7:06:412207 days ago1547536001
0x0aDADF6B...AdA64074C
0.09729632 ETH
View All Internal Transactions
Loading...
Loading
Contract Self Destruct called at Txn Hash 0x0cc2dca7ea1bcb6cf99454d4ba523aa18658570eb1860f904eeaa7f266349966


Contract Source Code Verified (Exact Match)

Contract Name:
DragonKing

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-10-04
*/

/**
  * Dragonking is a blockchain game in which players may purchase dragons and knights of different levels and values.
  * Once every period of time the volcano erupts and wipes a few of them from the board. The value of the killed characters
  * gets distributed amongst all of the survivors. The dragon king receive a bigger share than the others.
  * In contrast to dragons, knights need to be teleported to the battlefield first with the use of teleport tokens.
  * Additionally, they may attack a dragon once per period.
  * Both character types can be protected from death up to three times.
  * Take a look at dragonking.io for more detailed information.
  * @author: Julia Altenried, Yuriy Kashnikov
  * */

pragma solidity ^0.4.24;

// DragonKing v2.0 2e59d4

// File: zeppelin-solidity/contracts/ownership/Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


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


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }


  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }


  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

// File: zeppelin-solidity/contracts/token/ERC20Basic.sol

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  uint256 public totalSupply;
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

// File: zeppelin-solidity/contracts/token/ERC20.sol

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


/**
 * @title Destructible
 * @dev Base contract that can be destroyed by owner. All funds in contract will be sent to the owner.
 */
contract Destructible is Ownable {

  function Destructible() public payable { }

  /**
   * @dev Transfers the current balance to the owner and terminates the contract.
   */
  function destroy() onlyOwner public {
    selfdestruct(owner);
  }

  function destroyAndSend(address _recipient) onlyOwner public {
    selfdestruct(_recipient);
  }
}

contract DragonKingConfig is Ownable {


  /** the Gift token contract **/
  ERC20 public giftToken;
  /** amount of gift tokens to send **/
  uint256 public giftTokenAmount;
  /** the cost of each character type */
  uint128[] public costs;
  /** the value of each character type (cost - fee), so it's not necessary to compute it each time*/
  uint128[] public values;
  /** the fee to be paid each time an character is bought in percent*/
  uint8 fee;
  /** The maximum of characters allowed in the game */
  uint16 public maxCharacters;
  /** the amount of time that should pass since last eruption **/
  uint256 public eruptionThreshold;
  /** the amount of time that should pass ince last castle loot distribution **/
  uint256 public castleLootDistributionThreshold;
  /** how many characters to kill in %, e.g. 20 will stand for 20%, should be < 100 **/
  uint8 public percentageToKill;
  /* Cooldown threshold */
  uint256 public constant CooldownThreshold = 1 days;
  /** fight factor, used to compute extra probability in fight **/
  uint8 public fightFactor;

  /** the price for teleportation*/
  uint256 public teleportPrice;
  /** the price for protection */
  uint256 public protectionPrice;
  /** the luck threshold */
  uint256 public luckThreshold;

  function hasEnoughTokensToPurchase(address buyer, uint8 characterType) external returns (bool canBuy);
}

contract DragonKing is Destructible {

  /**
   * @dev Throws if called by contract not a user 
   */
  modifier onlyUser() {
    require(msg.sender == tx.origin, 
            "contracts cannot execute this method"
           );
    _;
  }


  struct Character {
    uint8 characterType;
    uint128 value;
    address owner;
    uint64 purchaseTimestamp;
    uint8 fightCount;
  }

  DragonKingConfig public config;

  /** the neverdie token contract used to purchase protection from eruptions and fights */
  ERC20 neverdieToken;
  /** the teleport token contract used to send knights to the game scene */
  ERC20 teleportToken;
  /** the luck token contract **/
  ERC20 luckToken;
  /** the SKL token contract **/
  ERC20 sklToken;
  /** the XP token contract **/
  ERC20 xperToken;
  

  /** array holding ids of the curret characters **/
  uint32[] public ids;
  /** the id to be given to the next character **/
  uint32 public nextId;
  /** non-existant character **/
  uint16 public constant INVALID_CHARACTER_INDEX = ~uint16(0);

  /** the castle treasury **/
  uint128 public castleTreasury;
  /** the id of the oldest character **/
  uint32 public oldest;
  /** the character belonging to a given id **/
  mapping(uint32 => Character) characters;
  /** teleported knights **/
  mapping(uint32 => bool) teleported;

  /** constant used to signal that there is no King at the moment **/
  uint32 constant public noKing = ~uint32(0);

  /** total number of characters in the game **/
  uint16 public numCharacters;
  /** number of characters per type **/
  mapping(uint8 => uint16) public numCharactersXType;

  /** timestamp of the last eruption event **/
  uint256 public lastEruptionTimestamp;
  /** timestamp of the last castle loot distribution **/
  uint256 public lastCastleLootDistributionTimestamp;

  /** character type range constants **/
  uint8 public constant DRAGON_MIN_TYPE = 0;
  uint8 public constant DRAGON_MAX_TYPE = 5;

  uint8 public constant KNIGHT_MIN_TYPE = 6;
  uint8 public constant KNIGHT_MAX_TYPE = 11;

  uint8 public constant BALLOON_MIN_TYPE = 12;
  uint8 public constant BALLOON_MAX_TYPE = 14;

  uint8 public constant WIZARD_MIN_TYPE = 15;
  uint8 public constant WIZARD_MAX_TYPE = 20;

  uint8 public constant ARCHER_MIN_TYPE = 21;
  uint8 public constant ARCHER_MAX_TYPE = 26;

  uint8 public constant NUMBER_OF_LEVELS = 6;

  uint8 public constant INVALID_CHARACTER_TYPE = 27;

    /** knight cooldown. contains the timestamp of the earliest possible moment to start a fight */
  mapping(uint32 => uint) public cooldown;

    /** tells the number of times a character is protected */
  mapping(uint32 => uint8) public protection;

  // EVENTS

  /** is fired when new characters are purchased (who bought how many characters of which type?) */
  event NewPurchase(address player, uint8 characterType, uint16 amount, uint32 startId);
  /** is fired when a player leaves the game */
  event NewExit(address player, uint256 totalBalance, uint32[] removedCharacters);
  /** is fired when an eruption occurs */
  event NewEruption(uint32[] hitCharacters, uint128 value, uint128 gasCost);
  /** is fired when a single character is sold **/
  event NewSell(uint32 characterId, address player, uint256 value);
  /** is fired when a knight fights a dragon **/
  event NewFight(uint32 winnerID, uint32 loserID, uint256 value, uint16 probability, uint16 dice);
  /** is fired when a knight is teleported to the field **/
  event NewTeleport(uint32 characterId);
  /** is fired when a protection is purchased **/
  event NewProtection(uint32 characterId, uint8 lifes);
  /** is fired when a castle loot distribution occurs**/
  event NewDistributionCastleLoot(uint128 castleLoot);

  /* initializes the contract parameter */
  constructor(address tptAddress, address ndcAddress, address sklAddress, address xperAddress, address luckAddress, address _configAddress) public {
    nextId = 1;
    teleportToken = ERC20(tptAddress);
    neverdieToken = ERC20(ndcAddress);
    sklToken = ERC20(sklAddress);
    xperToken = ERC20(xperAddress);
    luckToken = ERC20(luckAddress);
    config = DragonKingConfig(_configAddress);
  }

  /** 
    * gifts one character
    * @param receiver gift character owner
    * @param characterType type of the character to create as a gift
    */
  function giftCharacter(address receiver, uint8 characterType) payable public onlyUser {
    _addCharacters(receiver, characterType);
    assert(config.giftToken().transfer(receiver, config.giftTokenAmount()));
  }

  /**
   * buys as many characters as possible with the transfered value of the given type
   * @param characterType the type of the character
   */
  function addCharacters(uint8 characterType) payable public onlyUser {
    _addCharacters(msg.sender, characterType);
  }

  function _addCharacters(address receiver, uint8 characterType) internal {
    uint16 amount = uint16(msg.value / config.costs(characterType));
    require(
      amount > 0,
      "insufficient amount of ether to purchase a given type of character");
    uint16 nchars = numCharacters;
    require(
      config.hasEnoughTokensToPurchase(receiver, characterType),
      "insufficinet amount of tokens to purchase a given type of character"
    );
    if (characterType >= INVALID_CHARACTER_TYPE || msg.value < config.costs(characterType) || nchars + amount > config.maxCharacters()) revert();
    uint32 nid = nextId;
    //if type exists, enough ether was transferred and there are less than maxCharacters characters in the game
    if (characterType <= DRAGON_MAX_TYPE) {
      //dragons enter the game directly
      if (oldest == 0 || oldest == noKing)
        oldest = nid;
      for (uint8 i = 0; i < amount; i++) {
        addCharacter(nid + i, nchars + i);
        characters[nid + i] = Character(characterType, config.values(characterType), receiver, uint64(now), 0);
      }
      numCharactersXType[characterType] += amount;
      numCharacters += amount;
    }
    else {
      // to enter game knights, mages, and archers should be teleported later
      for (uint8 j = 0; j < amount; j++) {
        characters[nid + j] = Character(characterType, config.values(characterType), receiver, uint64(now), 0);
      }
    }
    nextId = nid + amount;
    emit NewPurchase(receiver, characterType, amount, nid);
  }



  /**
   * adds a single dragon of the given type to the ids array, which is used to iterate over all characters
   * @param nId the id the character is about to receive
   * @param nchars the number of characters currently in the game
   */
  function addCharacter(uint32 nId, uint16 nchars) internal {
    if (nchars < ids.length)
      ids[nchars] = nId;
    else
      ids.push(nId);
  }

  /**
   * leave the game.
   * pays out the sender's balance and removes him and his characters from the game
   * */
  function exit() public {
    uint32[] memory removed = new uint32[](50);
    uint8 count;
    uint32 lastId;
    uint playerBalance;
    uint16 nchars = numCharacters;
    for (uint16 i = 0; i < nchars; i++) {
      if (characters[ids[i]].owner == msg.sender 
          && characters[ids[i]].purchaseTimestamp + 1 days < now
          && (characters[ids[i]].characterType < BALLOON_MIN_TYPE || characters[ids[i]].characterType > BALLOON_MAX_TYPE)) {
        //first delete all characters at the end of the array
        while (nchars > 0 
            && characters[ids[nchars - 1]].owner == msg.sender 
            && characters[ids[nchars - 1]].purchaseTimestamp + 1 days < now
            && (characters[ids[i]].characterType < BALLOON_MIN_TYPE || characters[ids[i]].characterType > BALLOON_MAX_TYPE)) {
          nchars--;
          lastId = ids[nchars];
          numCharactersXType[characters[lastId].characterType]--;
          playerBalance += characters[lastId].value;
          removed[count] = lastId;
          count++;
          if (lastId == oldest) oldest = 0;
          delete characters[lastId];
        }
        //replace the players character by the last one
        if (nchars > i + 1) {
          playerBalance += characters[ids[i]].value;
          removed[count] = ids[i];
          count++;
          nchars--;
          replaceCharacter(i, nchars);
        }
      }
    }
    numCharacters = nchars;
    emit NewExit(msg.sender, playerBalance, removed); //fire the event to notify the client
    msg.sender.transfer(playerBalance);
    if (oldest == 0)
      findOldest();
  }

  /**
   * Replaces the character with the given id with the last character in the array
   * @param index the index of the character in the id array
   * @param nchars the number of characters
   * */
  function replaceCharacter(uint16 index, uint16 nchars) internal {
    uint32 characterId = ids[index];
    numCharactersXType[characters[characterId].characterType]--;
    if (characterId == oldest) oldest = 0;
    delete characters[characterId];
    ids[index] = ids[nchars];
    delete ids[nchars];
  }

  /**
   * The volcano eruption can be triggered by anybody but only if enough time has passed since the last eription.
   * The volcano hits up to a certain percentage of characters, but at least one.
   * The percantage is specified in 'percentageToKill'
   * */

  function triggerVolcanoEruption() public onlyUser {
    require(now >= lastEruptionTimestamp + config.eruptionThreshold(),
           "not enough time passed since last eruption");
    require(numCharacters > 0,
           "there are no characters in the game");
    lastEruptionTimestamp = now;
    uint128 pot;
    uint128 value;
    uint16 random;
    uint32 nextHitId;
    uint16 nchars = numCharacters;
    uint32 howmany = nchars * config.percentageToKill() / 100;
    uint128 neededGas = 80000 + 10000 * uint32(nchars);
    if(howmany == 0) howmany = 1;//hit at least 1
    uint32[] memory hitCharacters = new uint32[](howmany);
    bool[] memory alreadyHit = new bool[](nextId);
    uint16 i = 0;
    uint16 j = 0;
    while (i < howmany) {
      j++;
      random = uint16(generateRandomNumber(lastEruptionTimestamp + j) % nchars);
      nextHitId = ids[random];
      if (!alreadyHit[nextHitId]) {
        alreadyHit[nextHitId] = true;
        hitCharacters[i] = nextHitId;
        value = hitCharacter(random, nchars, 0);
        if (value > 0) {
          nchars--;
        }
        pot += value;
        i++;
      }
    }
    uint128 gasCost = uint128(neededGas * tx.gasprice);
    numCharacters = nchars;
    if (pot > gasCost){
      distribute(pot - gasCost); //distribute the pot minus the oraclize gas costs
      emit NewEruption(hitCharacters, pot - gasCost, gasCost);
    }
    else
      emit NewEruption(hitCharacters, 0, gasCost);
  }

  /**
   * Knight can attack a dragon.
   * Archer can attack only a balloon.
   * Dragon can attack wizards and archers.
   * Wizard can attack anyone, except balloon.
   * Balloon cannot attack.
   * The value of the loser is transfered to the winner.
   * @param characterID the ID of the knight to perfrom the attack
   * @param characterIndex the index of the knight in the ids-array. Just needed to save gas costs.
   *            In case it's unknown or incorrect, the index is looked up in the array.
   * */
  function fight(uint32 characterID, uint16 characterIndex) public onlyUser {
    if (characterID != ids[characterIndex])
      characterIndex = getCharacterIndex(characterID);
    Character storage character = characters[characterID];
    require(cooldown[characterID] + config.CooldownThreshold() <= now,
            "not enough time passed since the last fight of this character");
    require(character.owner == msg.sender,
            "only owner can initiate a fight for this character");

    uint8 ctype = character.characterType;
    require(ctype < BALLOON_MIN_TYPE || ctype > BALLOON_MAX_TYPE,
            "balloons cannot fight");

    uint16 adversaryIndex = getRandomAdversary(characterID, ctype);
    assert(adversaryIndex != INVALID_CHARACTER_INDEX);
    uint32 adversaryID = ids[adversaryIndex];

    Character storage adversary = characters[adversaryID];
    uint128 value;
    uint16 base_probability;
    uint16 dice = uint16(generateRandomNumber(characterID) % 100);
    if (luckToken.balanceOf(msg.sender) >= config.luckThreshold()) {
      base_probability = uint16(generateRandomNumber(dice) % 100);
      if (base_probability < dice) {
        dice = base_probability;
      }
      base_probability = 0;
    }
    uint256 characterPower = sklToken.balanceOf(character.owner) / 10**15 + xperToken.balanceOf(character.owner);
    uint256 adversaryPower = sklToken.balanceOf(adversary.owner) / 10**15 + xperToken.balanceOf(adversary.owner);
    
    if (character.value == adversary.value) {
        base_probability = 50;
      if (characterPower > adversaryPower) {
        base_probability += uint16(100 / config.fightFactor());
      } else if (adversaryPower > characterPower) {
        base_probability -= uint16(100 / config.fightFactor());
      }
    } else if (character.value > adversary.value) {
      base_probability = 100;
      if (adversaryPower > characterPower) {
        base_probability -= uint16((100 * adversary.value) / character.value / config.fightFactor());
      }
    } else if (characterPower > adversaryPower) {
        base_probability += uint16((100 * character.value) / adversary.value / config.fightFactor());
    }

    if (dice >= base_probability) {
      // adversary won
      if (adversary.characterType < BALLOON_MIN_TYPE || adversary.characterType > BALLOON_MAX_TYPE) {
        value = hitCharacter(characterIndex, numCharacters, adversary.characterType);
        if (value > 0) {
          numCharacters--;
        } else {
          cooldown[characterID] = now;
          if (characters[characterID].fightCount < 3) {
            characters[characterID].fightCount++;
          }
        }
        if (adversary.characterType >= ARCHER_MIN_TYPE && adversary.characterType <= ARCHER_MAX_TYPE) {
          castleTreasury += value;
        } else {
          adversary.value += value;
        }
        emit NewFight(adversaryID, characterID, value, base_probability, dice);
      } else {
        emit NewFight(adversaryID, characterID, 0, base_probability, dice); // balloons do not hit back
      }
    } else {
      // character won
      cooldown[characterID] = now;
      if (characters[characterID].fightCount < 3) {
        characters[characterID].fightCount++;
      }
      value = hitCharacter(adversaryIndex, numCharacters, character.characterType);
      if (value > 0) {
        numCharacters--;
      }
      if (character.characterType >= ARCHER_MIN_TYPE && character.characterType <= ARCHER_MAX_TYPE) {
        castleTreasury += value;
      } else {
        character.value += value;
      }
      if (oldest == 0) findOldest();
      emit NewFight(characterID, adversaryID, value, base_probability, dice);
    }
  }

  
  /*
  * @param characterType
  * @param adversaryType
  * @return whether adversaryType is a valid type of adversary for a given character
  */
  function isValidAdversary(uint8 characterType, uint8 adversaryType) pure returns (bool) {
    if (characterType >= KNIGHT_MIN_TYPE && characterType <= KNIGHT_MAX_TYPE) { // knight
      return (adversaryType <= DRAGON_MAX_TYPE);
    } else if (characterType >= WIZARD_MIN_TYPE && characterType <= WIZARD_MAX_TYPE) { // wizard
      return (adversaryType < BALLOON_MIN_TYPE || adversaryType > BALLOON_MAX_TYPE);
    } else if (characterType >= DRAGON_MIN_TYPE && characterType <= DRAGON_MAX_TYPE) { // dragon
      return (adversaryType >= WIZARD_MIN_TYPE);
    } else if (characterType >= ARCHER_MIN_TYPE && characterType <= ARCHER_MAX_TYPE) { // archer
      return ((adversaryType >= BALLOON_MIN_TYPE && adversaryType <= BALLOON_MAX_TYPE)
             || (adversaryType >= KNIGHT_MIN_TYPE && adversaryType <= KNIGHT_MAX_TYPE));
 
    }
    return false;
  }

  /**
   * pick a random adversary.
   * @param nonce a nonce to make sure there's not always the same adversary chosen in a single block.
   * @return the index of a random adversary character
   * */
  function getRandomAdversary(uint256 nonce, uint8 characterType) internal view returns(uint16) {
    uint16 randomIndex = uint16(generateRandomNumber(nonce) % numCharacters);
    // use 7, 11 or 13 as step size. scales for up to 1000 characters
    uint16 stepSize = numCharacters % 7 == 0 ? (numCharacters % 11 == 0 ? 13 : 11) : 7;
    uint16 i = randomIndex;
    //if the picked character is a knight or belongs to the sender, look at the character + stepSizes ahead in the array (modulo the total number)
    //will at some point return to the startingPoint if no character is suited
    do {
      if (isValidAdversary(characterType, characters[ids[i]].characterType) && characters[ids[i]].owner != msg.sender) {
        return i;
      }
      i = (i + stepSize) % numCharacters;
    } while (i != randomIndex);

    return INVALID_CHARACTER_INDEX;
  }


  /**
   * generate a random number.
   * @param nonce a nonce to make sure there's not always the same number returned in a single block.
   * @return the random number
   * */
  function generateRandomNumber(uint256 nonce) internal view returns(uint) {
    return uint(keccak256(block.blockhash(block.number - 1), now, numCharacters, nonce));
  }

	/**
   * Hits the character of the given type at the given index.
   * Wizards can knock off two protections. Other characters can do only one.
   * @param index the index of the character
   * @param nchars the number of characters
   * @return the value gained from hitting the characters (zero is the character was protected)
   * */
  function hitCharacter(uint16 index, uint16 nchars, uint8 characterType) internal returns(uint128 characterValue) {
    uint32 id = ids[index];
    uint8 knockOffProtections = 1;
    if (characterType >= WIZARD_MIN_TYPE && characterType <= WIZARD_MAX_TYPE) {
      knockOffProtections = 2;
    }
    if (protection[id] >= knockOffProtections) {
      protection[id] = protection[id] - knockOffProtections;
      return 0;
    }
    characterValue = characters[ids[index]].value;
    nchars--;
    replaceCharacter(index, nchars);
  }

  /**
   * finds the oldest character
   * */
  function findOldest() public {
    uint32 newOldest = noKing;
    for (uint16 i = 0; i < numCharacters; i++) {
      if (ids[i] < newOldest && characters[ids[i]].characterType <= DRAGON_MAX_TYPE)
        newOldest = ids[i];
    }
    oldest = newOldest;
  }

  /**
  * distributes the given amount among the surviving characters
  * @param totalAmount nthe amount to distribute
  */
  function distribute(uint128 totalAmount) internal {
    uint128 amount;
    if (oldest == 0)
      findOldest();
    if (oldest != noKing) {
      //pay 10% to the oldest dragon
      characters[oldest].value += totalAmount / 10;
      amount  = totalAmount / 10 * 9;
    } else {
      amount  = totalAmount;
    }
    //distribute the rest according to their type
    uint128 valueSum;
    uint8 size = ARCHER_MAX_TYPE + 1;
    uint128[] memory shares = new uint128[](size);
    for (uint8 v = 0; v < size; v++) {
      if ((v < BALLOON_MIN_TYPE || v > BALLOON_MAX_TYPE) && numCharactersXType[v] > 0) {
           valueSum += config.values(v);
      }
    }
    for (uint8 m = 0; m < size; m++) {
      if ((v < BALLOON_MIN_TYPE || v > BALLOON_MAX_TYPE) && numCharactersXType[m] > 0) {
        shares[m] = amount * config.values(m) / valueSum / numCharactersXType[m];
      }
    }
    uint8 cType;
    for (uint16 i = 0; i < numCharacters; i++) {
      cType = characters[ids[i]].characterType;
      if (cType < BALLOON_MIN_TYPE || cType > BALLOON_MAX_TYPE)
        characters[ids[i]].value += shares[characters[ids[i]].characterType];
    }
  }

  /**
   * allows the owner to collect the accumulated fees
   * sends the given amount to the owner's address if the amount does not exceed the
   * fees (cannot touch the players' balances) minus 100 finney (ensure that oraclize fees can be paid)
   * @param amount the amount to be collected
   * */
  function collectFees(uint128 amount) public onlyOwner {
    uint collectedFees = getFees();
    if (amount + 100 finney < collectedFees) {
      owner.transfer(amount);
    }
  }

  /**
  * withdraw NDC and TPT tokens
  */
  function withdraw() public onlyOwner {
    uint256 ndcBalance = neverdieToken.balanceOf(this);
    assert(neverdieToken.transfer(owner, ndcBalance));
    uint256 tptBalance = teleportToken.balanceOf(this);
    assert(teleportToken.transfer(owner, tptBalance));
  }

  /**
   * pays out the players.
   * */
  function payOut() public onlyOwner {
    for (uint16 i = 0; i < numCharacters; i++) {
      characters[ids[i]].owner.transfer(characters[ids[i]].value);
      delete characters[ids[i]];
    }
    delete ids;
    numCharacters = 0;
  }

  /**
   * pays out the players and kills the game.
   * */
  function stop() public onlyOwner {
    withdraw();
    payOut();
    destroy();
  }

  function generateLuckFactor(uint128 nonce) internal view returns(uint128) {
    uint128 sum = 0;
    uint128 inc = 1;
    for (uint128 i = 49; i >= 5; i--) {
      if (sum > nonce) {
          return i+2;
      }
      sum += inc;
      if (i != 40 && i != 8) {
          inc += 1;
      }
    }
    return 5;
  }

  /* @dev distributes castle loot among archers */
  function distributeCastleLoot() external onlyUser {
    require(now >= lastCastleLootDistributionTimestamp + config.castleLootDistributionThreshold(),
            "not enough time passed since the last castle loot distribution");
    lastCastleLootDistributionTimestamp = now;
    uint128 luckFactor = generateLuckFactor(uint128(now % 1000));
    if (luckFactor < 5) {
      luckFactor = 5;
    }
    uint128 amount = castleTreasury * luckFactor / 100; 
    uint128 valueSum;
    uint128[] memory shares = new uint128[](NUMBER_OF_LEVELS);
    uint16 archersCount;
    uint32[] memory archers = new uint32[](numCharacters);

    uint8 cType;
    for (uint8 i = 0; i < ids.length; i++) {
      cType = characters[ids[i]].characterType; 
      if ((cType >= ARCHER_MIN_TYPE && cType <= ARCHER_MAX_TYPE) 
        && (characters[ids[i]].fightCount >= 3)
        && (now - characters[ids[i]].purchaseTimestamp >= 7 days)) {
        valueSum += config.values(cType);
        archers[archersCount] = ids[i];
        archersCount++;
      }
    }

    if (valueSum > 0) {
      for (uint8 j = 0; j < NUMBER_OF_LEVELS; j++) {
          shares[j] = amount * config.values(ARCHER_MIN_TYPE + j) / valueSum;
      }

      for (uint16 k = 0; k < archersCount; k++) {
        characters[archers[k]].value += shares[characters[archers[k]].characterType - ARCHER_MIN_TYPE];
      }
      castleTreasury -= amount;
      emit NewDistributionCastleLoot(amount);
    } else {
      emit NewDistributionCastleLoot(0);
    }
  }

  /**
   * sell the character of the given id
   * throws an exception in case of a knight not yet teleported to the game
   * @param characterId the id of the character
   * */
  function sellCharacter(uint32 characterId) public onlyUser {
    require(msg.sender == characters[characterId].owner,
            "only owners can sell their characters");
    require(characters[characterId].characterType < BALLOON_MIN_TYPE || characters[characterId].characterType > BALLOON_MAX_TYPE,
            "balloons are not sellable");
    require(characters[characterId].purchaseTimestamp + 1 days < now,
            "character can be sold only 1 day after the purchase");
    uint128 val = characters[characterId].value;
    numCharacters--;
    replaceCharacter(getCharacterIndex(characterId), numCharacters);
    msg.sender.transfer(val);
    if (oldest == 0)
      findOldest();
    emit NewSell(characterId, msg.sender, val);
  }

  /**
   * receive approval to spend some tokens.
   * used for teleport and protection.
   * @param sender the sender address
   * @param value the transferred value
   * @param tokenContract the address of the token contract
   * @param callData the data passed by the token contract
   * */
  function receiveApproval(address sender, uint256 value, address tokenContract, bytes callData) public {
    uint32 id;
    uint256 price;
    if (msg.sender == address(teleportToken)) {
      id = toUint32(callData);
      price = config.teleportPrice();
      if (characters[id].characterType >= BALLOON_MIN_TYPE && characters[id].characterType <= WIZARD_MAX_TYPE) {
        price *= 2;
      }
      require(value >= price,
              "insufficinet amount of tokens to teleport this character");
      assert(teleportToken.transferFrom(sender, this, price));
      teleportCharacter(id);
    } else if (msg.sender == address(neverdieToken)) {
      id = toUint32(callData);
      // user can purchase extra lifes only right after character purchaes
      // in other words, user value should be equal the initial value
      uint8 cType = characters[id].characterType;
      require(characters[id].value == config.values(cType),
              "protection could be bought only before the first fight and before the first volcano eruption");

      // calc how many lifes user can actually buy
      // the formula is the following:

      uint256 lifePrice;
      uint8 max;
      if(cType <= KNIGHT_MAX_TYPE ){
        lifePrice = ((cType % NUMBER_OF_LEVELS) + 1) * config.protectionPrice();
        max = 3;
      } else if (cType >= BALLOON_MIN_TYPE && cType <= BALLOON_MAX_TYPE) {
        lifePrice = (((cType+3) % NUMBER_OF_LEVELS) + 1) * config.protectionPrice() * 2;
        max = 6;
      } else if (cType >= WIZARD_MIN_TYPE && cType <= WIZARD_MAX_TYPE) {
        lifePrice = (((cType+3) % NUMBER_OF_LEVELS) + 1) * config.protectionPrice() * 2;
        max = 3;
      } else if (cType >= ARCHER_MIN_TYPE && cType <= ARCHER_MAX_TYPE) {
        lifePrice = (((cType+3) % NUMBER_OF_LEVELS) + 1) * config.protectionPrice();
        max = 3;
      }

      price = 0;
      uint8 i = protection[id];
      for (i; i < max && value >= price + lifePrice * (i + 1); i++) {
        price += lifePrice * (i + 1);
      }
      assert(neverdieToken.transferFrom(sender, this, price));
      protectCharacter(id, i);
    } else {
      revert("Should be either from Neverdie or Teleport tokens");
    }
  }

  /**
   * Knights, balloons, wizards, and archers are only entering the game completely, when they are teleported to the scene
   * @param id the character id
   * */
  function teleportCharacter(uint32 id) internal {
    // ensure we do not teleport twice
    require(teleported[id] == false,
           "already teleported");
    teleported[id] = true;
    Character storage character = characters[id];
    require(character.characterType > DRAGON_MAX_TYPE,
           "dragons do not need to be teleported"); //this also makes calls with non-existent ids fail
    addCharacter(id, numCharacters);
    numCharacters++;
    numCharactersXType[character.characterType]++;
    emit NewTeleport(id);
  }

  /**
   * adds protection to a character
   * @param id the character id
   * @param lifes the number of protections
   * */
  function protectCharacter(uint32 id, uint8 lifes) internal {
    protection[id] = lifes;
    emit NewProtection(id, lifes);
  }


  /****************** GETTERS *************************/

  /**
   * returns the character of the given id
   * @param characterId the character id
   * @return the type, value and owner of the character
   * */
  function getCharacter(uint32 characterId) public view returns(uint8, uint128, address) {
    return (characters[characterId].characterType, characters[characterId].value, characters[characterId].owner);
  }

  /**
   * returns the index of a character of the given id
   * @param characterId the character id
   * @return the character id
   * */
  function getCharacterIndex(uint32 characterId) constant public returns(uint16) {
    for (uint16 i = 0; i < ids.length; i++) {
      if (ids[i] == characterId) {
        return i;
      }
    }
    revert();
  }

  /**
   * returns 10 characters starting from a certain indey
   * @param startIndex the index to start from
   * @return 4 arrays containing the ids, types, values and owners of the characters
   * */
  function get10Characters(uint16 startIndex) constant public returns(uint32[10] characterIds, uint8[10] types, uint128[10] values, address[10] owners) {
    uint32 endIndex = startIndex + 10 > numCharacters ? numCharacters : startIndex + 10;
    uint8 j = 0;
    uint32 id;
    for (uint16 i = startIndex; i < endIndex; i++) {
      id = ids[i];
      characterIds[j] = id;
      types[j] = characters[id].characterType;
      values[j] = characters[id].value;
      owners[j] = characters[id].owner;
      j++;
    }

  }

  /**
   * returns the number of dragons in the game
   * @return the number of dragons
   * */
  function getNumDragons() constant public returns(uint16 numDragons) {
    for (uint8 i = DRAGON_MIN_TYPE; i <= DRAGON_MAX_TYPE; i++)
      numDragons += numCharactersXType[i];
  }

  /**
   * returns the number of wizards in the game
   * @return the number of wizards
   * */
  function getNumWizards() constant public returns(uint16 numWizards) {
    for (uint8 i = WIZARD_MIN_TYPE; i <= WIZARD_MAX_TYPE; i++)
      numWizards += numCharactersXType[i];
  }
  /**
   * returns the number of archers in the game
   * @return the number of archers
   * */
  function getNumArchers() constant public returns(uint16 numArchers) {
    for (uint8 i = ARCHER_MIN_TYPE; i <= ARCHER_MAX_TYPE; i++)
      numArchers += numCharactersXType[i];
  }

  /**
   * returns the number of knights in the game
   * @return the number of knights
   * */
  function getNumKnights() constant public returns(uint16 numKnights) {
    for (uint8 i = KNIGHT_MIN_TYPE; i <= KNIGHT_MAX_TYPE; i++)
      numKnights += numCharactersXType[i];
  }

  /**
   * @return the accumulated fees
   * */
  function getFees() constant public returns(uint) {
    uint reserved = 0;
    for (uint16 j = 0; j < numCharacters; j++)
      reserved += characters[ids[j]].value;
    return address(this).balance - reserved;
  }

  /************* SETTERS ****************/

  /**
   * sets DragonKingConfig
   * */
  function setConfig(address _value) public onlyOwner {
    config = DragonKingConfig(_value);
  }


  /************* HELPERS ****************/

  /**
   * only works for bytes of length < 32
   * @param b the byte input
   * @return the uint
   * */
  function toUint32(bytes b) internal pure returns(uint32) {
    bytes32 newB;
    assembly {
      newB: = mload(0xa0)
    }
    return uint32(newB);
  }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[],"name":"stop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"receiver","type":"address"},{"name":"characterType","type":"uint8"}],"name":"giftCharacter","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"characterId","type":"uint32"}],"name":"sellCharacter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumArchers","outputs":[{"name":"numArchers","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"triggerVolcanoEruption","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"address"}],"name":"setConfig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"KNIGHT_MAX_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint128"}],"name":"collectFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"castleTreasury","outputs":[{"name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint8"}],"name":"numCharactersXType","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BALLOON_MIN_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"characterId","type":"uint32"}],"name":"getCharacter","outputs":[{"name":"","type":"uint8"},{"name":"","type":"uint128"},{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oldest","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INVALID_CHARACTER_INDEX","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"characterId","type":"uint32"}],"name":"getCharacterIndex","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"startIndex","type":"uint16"}],"name":"get10Characters","outputs":[{"name":"characterIds","type":"uint32[10]"},{"name":"types","type":"uint8[10]"},{"name":"values","type":"uint128[10]"},{"name":"owners","type":"address[10]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nextId","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastCastleLootDistributionTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"}],"name":"protection","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"characterID","type":"uint32"},{"name":"characterIndex","type":"uint16"}],"name":"fight","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"config","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"characterType","type":"uint8"}],"name":"addCharacters","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNumDragons","outputs":[{"name":"numDragons","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"value","type":"uint256"},{"name":"tokenContract","type":"address"},{"name":"callData","type":"bytes"}],"name":"receiveApproval","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"KNIGHT_MIN_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"distributeCastleLoot","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"WIZARD_MAX_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumWizards","outputs":[{"name":"numWizards","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"NUMBER_OF_LEVELS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"characterType","type":"uint8"},{"name":"adversaryType","type":"uint8"}],"name":"isValidAdversary","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"ARCHER_MIN_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint32"}],"name":"cooldown","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"WIZARD_MIN_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumKnights","outputs":[{"name":"numKnights","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastEruptionTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DRAGON_MAX_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"payOut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ARCHER_MAX_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BALLOON_MAX_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFees","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"noKing","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"DRAGON_MIN_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numCharacters","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"destroyAndSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INVALID_CHARACTER_TYPE","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"ids","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"findOldest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"tptAddress","type":"address"},{"name":"ndcAddress","type":"address"},{"name":"sklAddress","type":"address"},{"name":"xperAddress","type":"address"},{"name":"luckAddress","type":"address"},{"name":"_configAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"player","type":"address"},{"indexed":false,"name":"characterType","type":"uint8"},{"indexed":false,"name":"amount","type":"uint16"},{"indexed":false,"name":"startId","type":"uint32"}],"name":"NewPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"player","type":"address"},{"indexed":false,"name":"totalBalance","type":"uint256"},{"indexed":false,"name":"removedCharacters","type":"uint32[]"}],"name":"NewExit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"hitCharacters","type":"uint32[]"},{"indexed":false,"name":"value","type":"uint128"},{"indexed":false,"name":"gasCost","type":"uint128"}],"name":"NewEruption","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"characterId","type":"uint32"},{"indexed":false,"name":"player","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"NewSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"winnerID","type":"uint32"},{"indexed":false,"name":"loserID","type":"uint32"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"probability","type":"uint16"},{"indexed":false,"name":"dice","type":"uint16"}],"name":"NewFight","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"characterId","type":"uint32"}],"name":"NewTeleport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"characterId","type":"uint32"},{"indexed":false,"name":"lifes","type":"uint8"}],"name":"NewProtection","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"castleLoot","type":"uint128"}],"name":"NewDistributionCastleLoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405234801561001057600080fd5b5060405160c08062005bb683398101604090815281516020830151918301516060840151608085015160a0909501516000805433600160a060020a03199182161782556008805463ffffffff19166001908117909155600380548316600160a060020a0398891617905560028054831698881698909817909755600580548216958716959095179094556006805485169386169390931790925560048054841696851696909617909555835490911691909316179055615adf908190620000d790396000f3006080604052600436106102585763ffffffff60e060020a60003504166307da68f5811461025d5780630a3dfba7146102745780630fa6002e1461028e5780631d2a6dcf146102ac5780631e466eee146102d857806320e3dbd4146102ed57806326bdce711461030e57806328acb00214610339578063291ed7731461035a57806329b20bb61461038b57806330aaed53146103a65780633728bec2146103bb5780633c3c22b31461040c5780633ccfd60b1461043a5780634afe49c21461044f5780634f255b8014610464578063603709e31461048257806361b8ce8c1461055b578063726c86411461057057806372ad21c714610597578063773e1e84146105b557806379502c55146105da578063797e2aec1461060b57806383197ef014610619578063851ad4d61461062e5780638da5cb5b146106435780638f4ffcb1146106585780639271a988146106c85780639c73048b146106dd5780639ced242b146106f2578063a050d07d14610707578063a9689b4f146106c8578063ad389d5d1461071c578063ad70ae1a14610751578063b066ef3c14610766578063b0eee8db14610784578063b32dbcd814610799578063c10435cc146107ae578063c1255299146107c3578063c2052403146107d8578063d0f9bad1146107ed578063d39512b814610802578063db8d55f114610817578063dc9bb7db1461082c578063e9fad8ee14610841578063f10e2ec114610856578063f1be42f11461086b578063f2fde38b14610880578063f5074f41146108a1578063f690648d146108c2578063fac333ac146108d7578063fbe6529f146108ef575b600080fd5b34801561026957600080fd5b50610272610904565b005b610272600160a060020a036004351660ff60243516610935565b34801561029a57600080fd5b5061027263ffffffff60043516610b2e565b3480156102b857600080fd5b506102c1610e66565b6040805161ffff9092168252519081900360200190f35b3480156102e457600080fd5b50610272610e9e565b3480156102f957600080fd5b50610272600160a060020a0360043516611494565b34801561031a57600080fd5b506103236114da565b6040805160ff9092168252519081900360200190f35b34801561034557600080fd5b506102726001608060020a03600435166114df565b34801561036657600080fd5b5061036f611564565b604080516001608060020a039092168252519081900360200190f35b34801561039757600080fd5b506102c160ff6004351661157b565b3480156103b257600080fd5b50610323611591565b3480156103c757600080fd5b506103d963ffffffff60043516611596565b6040805160ff90941684526001608060020a039092166020840152600160a060020a031682820152519081900360600190f35b34801561041857600080fd5b506104216115d5565b6040805163ffffffff9092168252519081900360200190f35b34801561044657600080fd5b506102726115e8565b34801561045b57600080fd5b506102c1611818565b34801561047057600080fd5b506102c163ffffffff6004351661181e565b34801561048e57600080fd5b5061049e61ffff6004351661188a565b604051808561014080838360005b838110156104c45781810151838201526020016104ac565b5050505090500184600a60200280838360005b838110156104ef5781810151838201526020016104d7565b5050505090500183600a60200280838360005b8381101561051a578181015183820152602001610502565b5050505090500182600a60200280838360005b8381101561054557818101518382015260200161052d565b5050505090500194505050505060405180910390f35b34801561056757600080fd5b50610421611a31565b34801561057c57600080fd5b50610585611a3d565b60408051918252519081900360200190f35b3480156105a357600080fd5b5061032363ffffffff60043516611a43565b3480156105c157600080fd5b5061027263ffffffff6004351661ffff60243516611a58565b3480156105e657600080fd5b506105ef612895565b60408051600160a060020a039092168252519081900360200190f35b61027260ff600435166128a4565b34801561062557600080fd5b50610272612905565b34801561063a57600080fd5b506102c161292a565b34801561064f57600080fd5b506105ef61295d565b34801561066457600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261027294600160a060020a0381358116956024803596604435909316953695608494920191819084018382808284375094975061296c9650505050505050565b3480156106d457600080fd5b50610323613176565b3480156106e957600080fd5b5061027261317b565b3480156106fe57600080fd5b50610323613845565b34801561071357600080fd5b506102c161384a565b34801561072857600080fd5b5061073d60ff6004358116906024351661387e565b604080519115158252519081900360200190f35b34801561075d57600080fd5b50610323613971565b34801561077257600080fd5b5061058563ffffffff60043516613976565b34801561079057600080fd5b50610323613988565b3480156107a557600080fd5b506102c161398d565b3480156107ba57600080fd5b506105856139c1565b3480156107cf57600080fd5b506103236139c7565b3480156107e457600080fd5b506102726139cc565b3480156107f957600080fd5b50610323613ba4565b34801561080e57600080fd5b50610323613ba9565b34801561082357600080fd5b50610585613bae565b34801561083857600080fd5b50610421611818565b34801561084d57600080fd5b50610272613c33565b34801561086257600080fd5b506103236142e1565b34801561087757600080fd5b506102c16142e6565b34801561088c57600080fd5b50610272600160a060020a03600435166142f0565b3480156108ad57600080fd5b50610272600160a060020a0360043516614384565b3480156108ce57600080fd5b506103236143a7565b3480156108e357600080fd5b506104216004356143ac565b3480156108fb57600080fd5b506102726143e4565b600054600160a060020a0316331461091b57600080fd5b6109236115e8565b61092b6139cc565b610933612905565b565b333214610989576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b6109938282614517565b600160009054906101000a9004600160a060020a0316600160a060020a0316632091f9556040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156109e657600080fd5b505af11580156109fa573d6000803e3d6000fd5b505050506040513d6020811015610a1057600080fd5b5051600154604080517f5bdaa8e70000000000000000000000000000000000000000000000000000000081529051600160a060020a039384169363a9059cbb938793911691635bdaa8e7916004808201926020929091908290030181600087803b158015610a7d57600080fd5b505af1158015610a91573d6000803e3d6000fd5b505050506040513d6020811015610aa757600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610af657600080fd5b505af1158015610b0a573d6000803e3d6000fd5b505050506040513d6020811015610b2057600080fd5b50511515610b2a57fe5b5050565b6000333214610b84576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b63ffffffff8216600090815260096020526040902060010154600160a060020a03163314610c22576040805160e560020a62461bcd02815260206004820152602560248201527f6f6e6c79206f776e6572732063616e2073656c6c20746865697220636861726160448201527f6374657273000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b63ffffffff8216600090815260096020526040902054600c60ff9091161080610c65575063ffffffff8216600090815260096020526040902054600e60ff909116115b1515610cbb576040805160e560020a62461bcd02815260206004820152601960248201527f62616c6c6f6f6e7320617265206e6f742073656c6c61626c6500000000000000604482015290519081900360640190fd5b63ffffffff82166000908152600960205260409020600101544260a060020a90910467ffffffffffffffff90811662015180011610610d6a576040805160e560020a62461bcd02815260206004820152603360248201527f6368617261637465722063616e20626520736f6c64206f6e6c7920312064617960448201527f2061667465722074686520707572636861736500000000000000000000000000606482015290519081900360840190fd5b5063ffffffff8116600090815260096020526040902054600b805461ffff19811661ffff9182166000190190911617905561010090046001608060020a0316610dc1610db58361181e565b600b5461ffff16614db5565b60405133906001608060020a03831680156108fc02916000818181858888f19350505050158015610df6573d6000803e3d6000fd5b5060085460a060020a900463ffffffff161515610e1557610e156143e4565b6040805163ffffffff841681523360208201526001608060020a0383168183015290517fe5cc68f68d9672681158062a835b6abc2ff3fba89f8db70f3a227d4ac35da3c39181900360600190a15050565b600060155b601a60ff821611610e9a5760ff81166000908152600c602052604090205461ffff169190910190600101610e6b565b5090565b6000808080808080606080828080333214610f00576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b600160009054906101000a9004600160a060020a0316600160a060020a031663afb7e4956040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f5357600080fd5b505af1158015610f67573d6000803e3d6000fd5b505050506040513d6020811015610f7d57600080fd5b5051600d5401421015611000576040805160e560020a62461bcd02815260206004820152602a60248201527f6e6f7420656e6f7567682074696d65207061737365642073696e6365206c617360448201527f74206572757074696f6e00000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b54600061ffff90911611611086576040805160e560020a62461bcd02815260206004820152602360248201527f746865726520617265206e6f206368617261637465727320696e20746865206760448201527f616d650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b42600d55600b54600154604080517f11a5a793000000000000000000000000000000000000000000000000000000008152905161ffff9093169a50606492600160a060020a03909216916311a5a793916004808201926020929091908290030181600087803b1580156110f857600080fd5b505af115801561110c573d6000803e3d6000fd5b505050506040513d602081101561112257600080fd5b505160ff16890261ffff1681151561113657fe5b0461ffff1696508761ffff1661271002620138800163ffffffff1695508663ffffffff166000141561116757600196505b8663ffffffff16604051908082528060200260200182016040528015611197578160200160208202803883390190505b506008546040805163ffffffff90921680835260208082028401019091529196509080156111cf578160200160208202803883390190505b50935060009250600091505b8663ffffffff168361ffff1610156112fb5781806001019250508761ffff1661120b8361ffff16600d5401614f6f565b81151561121457fe5b06995060078a61ffff1681548110151561122a57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff169850838963ffffffff1681518110151561126657fe5b9060200190602002015115156112f6576001848a63ffffffff1681518110151561128c57fe5b91151560209283029091019091015284518990869061ffff86169081106112af57fe5b63ffffffff9092166020928302909101909101526112cf8a896000614fc8565b9a5060008b6001608060020a031611156112eb57600019909701965b9a8a019a6001909201915b6111db565b50600b805461ffff891661ffff199091161790556001608060020a038086163a0290818116908d1611156113e457611334818d036150f2565b7fa06ad7d0261a795ad8f33fdbef7cf65a0f9f9a825353b13358a96a750acd6b3d85828e03836040518080602001846001608060020a03166001608060020a03168152602001836001608060020a03166001608060020a03168152602001828103825285818151815260200191508051906020019060200280838360005b838110156113ca5781810151838201526020016113b2565b5050505090500194505050505060405180910390a1611486565b7fa06ad7d0261a795ad8f33fdbef7cf65a0f9f9a825353b13358a96a750acd6b3d856000836040518080602001846001608060020a03168152602001836001608060020a03166001608060020a03168152602001828103825285818151815260200191508051906020019060200280838360005b83811015611470578181015183820152602001611458565b5050505090500194505050505060405180910390a15b505050505050505050505050565b600054600160a060020a031633146114ab57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600b81565b60008054600160a060020a031633146114f757600080fd5b6114ff613bae565b9050808267016345785d8a0000016001608060020a03161015610b2a5760008054604051600160a060020a03909116916001608060020a03851680156108fc02929091818181858888f1935050505015801561155f573d6000803e3d6000fd5b505050565b60085464010000000090046001608060020a031681565b600c6020526000908152604090205461ffff1681565b600c81565b63ffffffff166000908152600960205260409020805460019091015460ff8216926101009092046001608060020a031691600160a060020a0390911690565b60085460a060020a900463ffffffff1681565b600080548190600160a060020a0316331461160257600080fd5b6002546040805160e060020a6370a082310281523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561165257600080fd5b505af1158015611666573d6000803e3d6000fd5b505050506040513d602081101561167c57600080fd5b505160025460008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101869052905194965092169263a9059cbb926044808201936020939283900390910190829087803b1580156116f357600080fd5b505af1158015611707573d6000803e3d6000fd5b505050506040513d602081101561171d57600080fd5b5051151561172757fe5b6003546040805160e060020a6370a082310281523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561177757600080fd5b505af115801561178b573d6000803e3d6000fd5b505050506040513d60208110156117a157600080fd5b505160035460008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101869052905194955092169263a9059cbb926044808201936020939283900390910190829087803b158015610af657600080fd5b60001981565b6000805b60075461ffff82161015610258578263ffffffff1660078261ffff1681548110151561184a57fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff16141561187c57809150611884565b600101611822565b50919050565b611892615a36565b61189a615a36565b6118a2615a36565b6118aa615a36565b600b5460009081908190819061ffff908116600a8b01909116116118d15788600a016118d9565b600b5461ffff165b61ffff169350600092508890505b8363ffffffff168161ffff161015611a26576007805461ffff831690811061190b57fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff169150818860ff8516600a811061194157fe5b63ffffffff9283166020918202929092019190915290831660009081526009909152604090205460ff9081169088908516600a811061197c57fe5b60ff9283166020918202929092019190915263ffffffff841660009081526009909152604090205461010090046001608060020a03169087908516600a81106119c157fe5b6001608060020a039092166020928302919091015263ffffffff8316600090815260099091526040902060010154600160a060020a03168560ff8516600a8110611a0757fe5b600160a060020a039092166020929092020152600192830192016118e7565b505050509193509193565b60085463ffffffff1681565b600e5481565b60106020526000908152604090205460ff1681565b6000808080808080808080333214611ab7576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b6007805461ffff8d16908110611ac957fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff908116908d1614611b0357611b008c61181e565b9a505b63ffffffff8c16600090815260096020908152604080832060015482517f4597dc8e0000000000000000000000000000000000000000000000000000000081529251919e504294600160a060020a0390911693634597dc8e936004808201949293918390030190829087803b158015611b7b57600080fd5b505af1158015611b8f573d6000803e3d6000fd5b505050506040513d6020811015611ba557600080fd5b505163ffffffff8e166000908152600f6020526040902054011115611c3a576040805160e560020a62461bcd02815260206004820152603d60248201527f6e6f7420656e6f7567682074696d65207061737365642073696e63652074686560448201527f206c617374206669676874206f66207468697320636861726163746572000000606482015290519081900360840190fd5b60018a0154600160a060020a03163314611cc4576040805160e560020a62461bcd02815260206004820152603260248201527f6f6e6c79206f776e65722063616e20696e69746961746520612066696768742060448201527f666f722074686973206368617261637465720000000000000000000000000000606482015290519081900360840190fd5b895460ff169850600c891080611cdd5750600e60ff8a16115b1515611d33576040805160e560020a62461bcd02815260206004820152601560248201527f62616c6c6f6f6e732063616e6e6f742066696768740000000000000000000000604482015290519081900360640190fd5b611d438c63ffffffff168a61556d565b975061ffff8089161415611d5357fe5b6007805461ffff8a16908110611d6557fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff908116808452600990925260409092209098509650606490611dac908e16614f6f565b811515611db557fe5b069250600160009054906101000a9004600160a060020a0316600160a060020a0316638f7561476040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611e0b57600080fd5b505af1158015611e1f573d6000803e3d6000fd5b505050506040513d6020811015611e3557600080fd5b5051600480546040805160e060020a6370a08231028152339381019390935251600160a060020a03909116916370a082319160248083019260209291908290030181600087803b158015611e8857600080fd5b505af1158015611e9c573d6000803e3d6000fd5b505050506040513d6020811015611eb257600080fd5b505110611eed576064611ec88461ffff16614f6f565b811515611ed157fe5b0693508261ffff168461ffff161015611ee8578392505b600093505b60065460018b01546040805160e060020a6370a08231028152600160a060020a039283166004820152905191909216916370a082319160248083019260209291908290030181600087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050506040513d6020811015611f6e57600080fd5b505160055460018c01546040805160e060020a6370a08231028152600160a060020a039283166004820152905166038d7ea4c680009392909216916370a08231916024808201926020929091908290030181600087803b158015611fd157600080fd5b505af1158015611fe5573d6000803e3d6000fd5b505050506040513d6020811015611ffb57600080fd5b505181151561200657fe5b60065460018a01546040805160e060020a6370a08231028152600160a060020a03928316600482015290519490930494909401955092909216916370a082319160248083019260209291908290030181600087803b15801561206757600080fd5b505af115801561207b573d6000803e3d6000fd5b505050506040513d602081101561209157600080fd5b505160055460018801546040805160e060020a6370a08231028152600160a060020a039283166004820152905166038d7ea4c680009392909216916370a08231916024808201926020929091908290030181600087803b1580156120f457600080fd5b505af1158015612108573d6000803e3d6000fd5b505050506040513d602081101561211e57600080fd5b505181151561212957fe5b88548d5492909104929092019250610100918290046001608060020a039081169290910416141561229d5760329350808211156121fa57600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156121b357600080fd5b505af11580156121c7573d6000803e3d6000fd5b505050506040513d60208110156121dd57600080fd5b505160ff1660648115156121ed57fe5b0460ff1684019350612298565b8181111561229857600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561225557600080fd5b505af1158015612269573d6000803e3d6000fd5b505050506040513d602081101561227f57600080fd5b505160ff16606481151561228f57fe5b0460ff16840393505b612463565b85548a546001608060020a036101009283900481169290910416111561239457606493508181111561229857600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561231c57600080fd5b505af1158015612330573d6000803e3d6000fd5b505050506040513d602081101561234657600080fd5b50518a54875460ff90921691610100918290046001608060020a039081169290910481166064021681151561237757fe5b046001608060020a031681151561238a57fe5b0484039350612463565b8082111561246357600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156123ef57600080fd5b505af1158015612403573d6000803e3d6000fd5b505050506040513d602081101561241957600080fd5b505186548b5460ff90921691610100918290046001608060020a039081169290910481166064021681151561244a57fe5b046001608060020a031681151561245d57fe5b04840193505b61ffff808516908416106126b1578554600c60ff909116108061248c57508554600e60ff909116115b1561265257600b5486546124ab918d9161ffff9091169060ff16614fc8565b94506000856001608060020a031611156124de57600b805461ffff19811661ffff91821660001901909116179055612559565b63ffffffff8c166000908152600f602090815260408083204290556009909152902060010154600360e060020a90910460ff1610156125595763ffffffff8c1660009081526009602052604090206001908101805460ff60e060020a80830482169094011690920260e060020a60ff02199092169190911790555b8554601560ff9091161080159061257757508554601a60ff90911611155b156125ba57600880546001608060020a03640100000000808304821689019091160273ffffffffffffffffffffffffffffffff00000000199091161790556125ec565b85546001608060020a03610100808304821688019091160270ffffffffffffffffffffffffffffffff00199091161786555b6040805163ffffffff808a1682528e1660208201526001608060020a0387168183015261ffff80871660608301528516608082015290517f24758388bd6bf650dde3bbde100b1056920770025a9f1c5998b4587670d4f3859181900360a00190a16126ac565b6040805163ffffffff808a1682528e16602082015260008183015261ffff80871660608301528516608082015290517f24758388bd6bf650dde3bbde100b1056920770025a9f1c5998b4587670d4f3859181900360a00190a15b611486565b63ffffffff8c166000908152600f602090815260408083204290556009909152902060010154600360e060020a90910460ff16101561272c5763ffffffff8c1660009081526009602052604090206001908101805460ff60e060020a80830482169094011690920260e060020a60ff02199092169190911790555b600b548a54612746918a9161ffff9091169060ff16614fc8565b94506000856001608060020a0316111561277557600b805461ffff19811661ffff918216600019019091161790555b8954601560ff9091161080159061279357508954601a60ff90911611155b156127d657600880546001608060020a03640100000000808304821689019091160273ffffffffffffffffffffffffffffffff0000000019909116179055612808565b89546001608060020a03610100808304821688019091160270ffffffffffffffffffffffffffffffff0019909116178a555b60085460a060020a900463ffffffff161515612826576128266143e4565b6040805163ffffffff808f168252891660208201526001608060020a0387168183015261ffff80871660608301528516608082015290517f24758388bd6bf650dde3bbde100b1056920770025a9f1c5998b4587670d4f3859181900360a00190a1505050505050505050505050565b600154600160a060020a031681565b3332146128f8576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b6129023382614517565b50565b600054600160a060020a0316331461291c57600080fd5b600054600160a060020a0316ff5b6000805b600560ff821611610e9a5760ff81166000908152600c602052604090205461ffff16919091019060010161292e565b600054600160a060020a031681565b60035460009081908190819081908190600160a060020a0316331415612ba057612995876156dd565b9550600160009054906101000a9004600160a060020a0316600160a060020a0316636121e5226040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156129ea57600080fd5b505af11580156129fe573d6000803e3d6000fd5b505050506040513d6020811015612a1457600080fd5b505163ffffffff8716600090815260096020526040902054909550600c60ff90911610801590612a5f575063ffffffff8616600090815260096020526040902054601460ff90911611155b15612a6b576002850294505b84891015612ae9576040805160e560020a62461bcd02815260206004820152603860248201527f696e737566666963696e657420616d6f756e74206f6620746f6b656e7320746f60448201527f2074656c65706f72742074686973206368617261637465720000000000000000606482015290519081900360840190fd5b600354604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038d8116600483015230602483015260448201899052915191909216916323b872dd9160648083019260209291908290030181600087803b158015612b5e57600080fd5b505af1158015612b72573d6000803e3d6000fd5b505050506040513d6020811015612b8857600080fd5b50511515612b9257fe5b612b9b866156e4565b61316a565b600254600160a060020a03163314156130f457612bbc876156dd565b63ffffffff8116600090815260096020908152604080832054600154825160e060020a635e383d2102815260ff909216600483018190529251959b50919850600160a060020a0390911693635e383d2193602480840194938390030190829087803b158015612c2a57600080fd5b505af1158015612c3e573d6000803e3d6000fd5b505050506040513d6020811015612c5457600080fd5b505163ffffffff871660009081526009602052604090205461010090046001608060020a03908116911614612d1f576040805160e560020a62461bcd02815260206004820152605c60248201527f70726f74656374696f6e20636f756c6420626520626f75676874206f6e6c792060448201527f6265666f72652074686520666972737420666967687420616e64206265666f7260648201527f652074686520666972737420766f6c63616e6f206572757074696f6e00000000608482015290519081900360a40190fd5b600b60ff851611612dc257600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612d7d57600080fd5b505af1158015612d91573d6000803e3d6000fd5b505050506040513d6020811015612da757600080fd5b5051600660ff86160660010160ff1602925060039150612fec565b600c60ff851610801590612dda5750600e60ff851611155b15612e7d57600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612e3257600080fd5b505af1158015612e46573d6000803e3d6000fd5b505050506040513d6020811015612e5c57600080fd5b505160066003860160ff160660010160ff1602600202925060069150612fec565b600f60ff851610801590612e955750601460ff851611155b15612f3857600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612eed57600080fd5b505af1158015612f01573d6000803e3d6000fd5b505050506040513d6020811015612f1757600080fd5b505160066003860160ff160660010160ff1602600202925060039150612fec565b601560ff851610801590612f505750601a60ff851611155b15612fec57600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612fa857600080fd5b505af1158015612fbc573d6000803e3d6000fd5b505050506040513d6020811015612fd257600080fd5b505160066003860160ff160660010160ff16029250600391505b5063ffffffff851660009081526010602052604081205490945060ff165b8160ff168160ff1610801561302957508060010160ff16830285018910155b156130415760010160ff81168302949094019361300a565b600254604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038d8116600483015230602483015260448201899052915191909216916323b872dd9160648083019260209291908290030181600087803b1580156130b657600080fd5b505af11580156130ca573d6000803e3d6000fd5b505050506040513d60208110156130e057600080fd5b505115156130ea57fe5b612b9b8682615896565b6040805160e560020a62461bcd02815260206004820152603160248201527f53686f756c64206265206569746865722066726f6d204e65766572646965206f60448201527f722054656c65706f727420746f6b656e73000000000000000000000000000000606482015290519081900360840190fd5b50505050505050505050565b600681565b6000808060608181818080803332146131db576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b600160009054906101000a9004600160a060020a0316600160a060020a03166399bd59ee6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561322e57600080fd5b505af1158015613242573d6000803e3d6000fd5b505050506040513d602081101561325857600080fd5b5051600e54014210156132db576040805160e560020a62461bcd02815260206004820152603e60248201527f6e6f7420656e6f7567682074696d65207061737365642073696e63652074686560448201527f206c61737420636173746c65206c6f6f7420646973747269627574696f6e0000606482015290519081900360840190fd5b42600e8190556132ef906103e890066158f8565b995060058a6001608060020a0316101561330857600599505b6008546064906001608060020a0364010000000090910481168c021660408051600680825260e08201909252929091049a506020820160c08038833901905050600b546040805161ffff909216808352602080820284010190915291985090801561337d578160200160208202803883390190505b509450600092505b60075460ff841610156135bc576009600060078560ff168154811015156133a857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff169350601584108015906133f55750601a60ff851611155b8015613457575060036009600060078660ff1681548110151561341457fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460e060020a900460ff1610155b80156134c4575062093a806009600060078660ff1681548110151561347857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460a060020a900467ffffffffffffffff16420310155b156135b1576001546040805160e060020a635e383d2102815260ff871660048201529051600160a060020a0390921691635e383d21916024808201926020929091908290030181600087803b15801561351c57600080fd5b505af1158015613530573d6000803e3d6000fd5b505050506040513d602081101561354657600080fd5b505160078054999091019860ff851690811061355e57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16858761ffff1681518110151561359657fe5b63ffffffff9092166020928302909101909101526001909501945b600190920191613385565b6000886001608060020a0316111561380557600091505b600660ff831610156136b1576001546040805160e060020a635e383d2102815260ff6015860116600482015290516001608060020a038b1692600160a060020a031691635e383d219160248083019260209291908290030181600087803b15801561363d57600080fd5b505af1158015613651573d6000803e3d6000fd5b505050506040513d602081101561366757600080fd5b50518a026001608060020a031681151561367d57fe5b04878360ff1681518110151561368f57fe5b6001608060020a039092166020928302909101909101526001909101906135d3565b5060005b8561ffff168161ffff16101561378f5786601560096000888561ffff168151811015156136de57fe5b602090810290910181015163ffffffff16825281019190915260400160002054825160ff918216929092031690811061371357fe5b9060200190602002015160096000878461ffff1681518110151561373357fe5b602090810290910181015163ffffffff16825281019190915260400160002080546001608060020a0361010080830482169094011690920270ffffffffffffffffffffffffffffffff00199092169190911790556001016136b5565b600880546001608060020a0364010000000080830482168d900382160273ffffffffffffffffffffffffffffffff00000000199092169190911790915560408051918b168252517f2359110bd6bbc405457edff9ea27ed0310d86730da626b57da3ba05cae1ce22d9181900360200190a161316a565b604080516000815290517f2359110bd6bbc405457edff9ea27ed0310d86730da626b57da3ba05cae1ce22d9181900360200190a150505050505050505050565b601481565b6000600f5b601460ff821611610e9a5760ff81166000908152600c602052604090205461ffff16919091019060010161384f565b6000600660ff8416108015906138985750600b60ff841611155b156138ab5750600560ff8216111561396b565b600f60ff8416108015906138c35750601460ff841611155b156138e457600c60ff831610806138dd5750600e60ff8316115b905061396b565b600060ff8416108015906138fc5750600560ff841611155b1561390f5750600f60ff8216101561396b565b601560ff8416108015906139275750601a60ff841611155b1561396757600c60ff8316108015906139445750600e60ff831611155b806138dd5750600660ff8316108015906138dd575050600b60ff8216111561396b565b5060005b92915050565b601581565b600f6020526000908152604090205481565b600f81565b600060065b600b60ff821611610e9a5760ff81166000908152600c602052604090205461ffff169190910190600101613992565b600d5481565b600581565b60008054600160a060020a031633146139e457600080fd5b5060005b600b5461ffff9081169082161015613b8a576009600060078361ffff16815481101515613a1157fe5b6000918252602080832060088304015460079283166004026101000a900463ffffffff16845283019390935260409091018120600101548254600160a060020a03909116926108fc9260099290919061ffff8716908110613a6e57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060000160019054906101000a90046001608060020a03166001608060020a03169081150290604051600060405180830381858888f19350505050158015613af9573d6000803e3d6000fd5b506009600060078361ffff16815481101515613b1157fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff1683528201929092526040019020805470ffffffffffffffffffffffffffffffffff19168155600190810180547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169055016139e8565b613b9660076000615a56565b50600b805461ffff19169055565b601a81565b600e81565b600080805b600b5461ffff9081169082161015613c2a576009600060078361ffff16815481101515613bdc57fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff1684528301939093526040909101902054046001608060020a03169190910190600101613bb3565b50303103919050565b606060008060008060006032604051908082528060200260200182016040528015613c68578160200160208202803883390190505b50600b5490965061ffff169150600090505b8161ffff168161ffff1610156141f05733600160a060020a03166009600060078461ffff16815481101515613cab57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902060010154600160a060020a0316148015613d5b5750426009600060078461ffff16815481101515613d0a57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460a060020a900467ffffffffffffffff908116620151800116105b8015613e0f5750600c60ff166009600060078461ffff16815481101515613d7e57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff161080613e0f5750600e60ff166009600060078461ffff16815481101515613dd757fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff16115b156141e8575b60008261ffff16118015613e89575033600160a060020a03166009600060076001860361ffff16815481101515613e4857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902060010154600160a060020a0316145b8015613efc5750426009600060076001860361ffff16815481101515613eab57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460a060020a900467ffffffffffffffff908116620151800116105b8015613fb05750600c60ff166009600060078461ffff16815481101515613f1f57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff161080613fb05750600e60ff166009600060078461ffff16815481101515613f7857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff16115b1561410257600780546000199093019261ffff8416908110613fce57fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff1680845260098083526040808620805460ff9081168852600c8652918720805461ffff19811661ffff9182166000190190911617905595839052925292548951939750919091046001608060020a0316949094019385918891881690811061405857fe5b63ffffffff9283166020918202909201015260085460019096019585821660a060020a90910490911614156140a9576008805477ffffffff0000000000000000000000000000000000000000191690555b63ffffffff84166000908152600960205260409020805470ffffffffffffffffffffffffffffffffff1916815560010180547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169055613e15565b8060010161ffff168261ffff1611156141e8576009600060078361ffff1681548110151561412c57fe5b60009182526020808320600883040154600792831660040261010090810a90910463ffffffff16855290840194909452604090920190205481549290046001608060020a031694909401939061ffff831690811061418657fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16868660ff168151811015156141bd57fe5b63ffffffff909216602092830290910190910152600190940193600019909101906141e88183614db5565b600101613c7a565b600b805461ffff191661ffff84161790556040805133808252602080830187905260609383018481528a519484019490945289517f1e6d26af567145cb0b46ea7135e21671f1e58e8d1f818dab12b0e10eb5ebb07b94929388938c93919290916080840191858201910280838360005b83811015614278578181015183820152602001614260565b5050505090500194505050505060405180910390a1604051339084156108fc029085906000818181858888f193505050501580156142ba573d6000803e3d6000fd5b5060085460a060020a900463ffffffff1615156142d9576142d96143e4565b505050505050565b600081565b600b5461ffff1681565b600054600160a060020a0316331461430757600080fd5b600160a060020a038116151561431c57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a0316331461439b57600080fd5b80600160a060020a0316ff5b601b81565b60078054829081106143ba57fe5b9060005260206000209060089182820401919006600402915054906101000a900463ffffffff1681565b60001960005b600b5461ffff90811690821610156144df578163ffffffff1660078261ffff1681548110151561441657fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff161080156144975750600560ff166009600060078461ffff1681548110151561445e57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff1611155b156144d7576007805461ffff83169081106144ae57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691505b6001016143ea565b506008805463ffffffff90921660a060020a0277ffffffff000000000000000000000000000000000000000019909216919091179055565b6000806000806000600160009054906101000a9004600160a060020a0316600160a060020a03166349b3b29f876040518263ffffffff1660e060020a028152600401808260ff168152602001915050602060405180830381600087803b15801561458057600080fd5b505af1158015614594573d6000803e3d6000fd5b505050506040513d60208110156145aa57600080fd5b50516001608060020a0316348115156145bf57fe5b049450600061ffff86161161466a576040805160e560020a62461bcd02815260206004820152604260248201527f696e73756666696369656e7420616d6f756e74206f6620657468657220746f2060448201527f7075726368617365206120676976656e2074797065206f66206368617261637460648201527f6572000000000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b600b54600154604080517f49e77c8b000000000000000000000000000000000000000000000000000000008152600160a060020a038b8116600483015260ff8b166024830152915161ffff90941697509116916349e77c8b916044808201926020929091908290030181600087803b1580156146e557600080fd5b505af11580156146f9573d6000803e3d6000fd5b505050506040513d602081101561470f57600080fd5b505115156147b3576040805160e560020a62461bcd02815260206004820152604360248201527f696e737566666963696e657420616d6f756e74206f6620746f6b656e7320746f60448201527f207075726368617365206120676976656e2074797065206f662063686172616360648201527f7465720000000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b601b60ff87161015806148625750600154604080517f49b3b29f00000000000000000000000000000000000000000000000000000000815260ff891660048201529051600160a060020a03909216916349b3b29f916024808201926020929091908290030181600087803b15801561482a57600080fd5b505af115801561483e573d6000803e3d6000fd5b505050506040513d602081101561485457600080fd5b50516001608060020a031634105b806148f55750600160009054906101000a9004600160a060020a0316600160a060020a0316638882ddc96040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156148bb57600080fd5b505af11580156148cf573d6000803e3d6000fd5b505050506040513d60208110156148e557600080fd5b505161ffff908116858701909116115b156148ff57600080fd5b60085463ffffffff169250600560ff871611614b825760085460a060020a900463ffffffff161580614940575060085460a060020a900463ffffffff908116145b15614975576008805477ffffffff0000000000000000000000000000000000000000191660a060020a63ffffffff8616021790555b600091505b8461ffff168260ff161015614b3f5761499b60ff8316848101908601615980565b6040805160a08101825260ff8816808252600154835160e060020a635e383d21028152600481019290925292519192602080850193600160a060020a0390921692635e383d2192602480830193928290030181600087803b1580156149ff57600080fd5b505af1158015614a13573d6000803e3d6000fd5b505050506040513d6020811015614a2957600080fd5b50516001608060020a039081168252600160a060020a038a81166020808501919091524267ffffffffffffffff9081166040808701919091526000606096870181905260ff8a81168c0163ffffffff168252600985529082902088518154958a015160ff199096169083161770ffffffffffffffffffffffffffffffff0019166101009590971694909402959095178355860151600192830180549688015160809098015173ffffffffffffffffffffffffffffffffffffffff1990971691909416177bffffffffffffffff0000000000000000000000000000000000000000191660a060020a96909116959095029490941760e060020a60ff02191660e060020a93909216929092021790559091019061497a565b60ff86166000908152600c60205260409020805461ffff1980821661ffff9283168901831617909255600b80549283169282168801909116919091179055614d36565b5060005b8461ffff168160ff161015614d36576040805160a08101825260ff8816808252600154835160e060020a635e383d21028152600481019290925292519192602080850193600160a060020a0390921692635e383d2192602480830193928290030181600087803b158015614bf957600080fd5b505af1158015614c0d573d6000803e3d6000fd5b505050506040513d6020811015614c2357600080fd5b50516001608060020a039081168252600160a060020a038a81166020808501919091524267ffffffffffffffff9081166040808701919091526000606096870181905260ff8981168c0163ffffffff168252600985529082902088518154958a015160ff199096169083161770ffffffffffffffffffffffffffffffff0019166101009590971694909402959095178355860151600192830180549688015160809098015173ffffffffffffffffffffffffffffffffffffffff1990971691909416177bffffffffffffffff0000000000000000000000000000000000000000191660a060020a96909116959095029490941760e060020a60ff02191660e060020a939092169290920217905501614b86565b6008805463ffffffff191661ffff871685810163ffffffff9081169290921790925560408051600160a060020a038b16815260ff8a166020820152808201939093529085166060830152517ff7ad76543f114c7bb00ff2cd992ff749d502ed5c0c6f87901ad48f6871fceca1916080908290030190a150505050505050565b600060078361ffff16815481101515614dca57fe5b6000918252602080832060088084049091015460079093166004026101000a90920463ffffffff9081168085526009835260408086205460ff168652600c90935291909320805461ffff19811661ffff91821660001901909116179055905490925060a060020a900416811415614e5d576008805477ffffffff0000000000000000000000000000000000000000191690555b63ffffffff81166000908152600960205260409020805470ffffffffffffffffffffffffffffffffff1916815560010180547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690556007805461ffff8416908110614ec357fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1660078461ffff16815481101515614efc57fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff16021790555060078261ffff16815481101515614f4257fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff0219169055505050565b600b546040805160001943014081524260208201527e0100000000000000000000000000000000000000000000000000000000000061ffff90931692909202828201526042820183905251908190036062019020919050565b600080600060078661ffff16815481101515614fe057fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff16915060019050600f60ff8516108015906150225750601460ff851611155b1561502b575060025b63ffffffff821660009081526010602052604090205460ff80831691161061507d5763ffffffff82166000908152601060205260408120805460ff8082168590031660ff1990911617905592506150e9565b6009600060078861ffff1681548110151561509457fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff16845283019390935260409091019020546000199690960195046001608060020a031692506150e98686614db5565b50509392505050565b60008060006060600080600080600860149054906101000a900463ffffffff1663ffffffff1660001415615128576151286143e4565b60085460a060020a900463ffffffff908116146151a55760085460a060020a900463ffffffff166000908152600960208190526040909120805470ffffffffffffffffffffffffffffffff00198116600a6001608060020a038e8116919091046101009384900482168101909116909202179091550297506151a9565b8897505b60408051601b8082526103808201909252909650866020820161036080388339019050509450600093505b8560ff168460ff1610156152ac57600c60ff851610806151f75750600e60ff8516115b8015615217575060ff84166000908152600c602052604081205461ffff16115b156152a1576001546040805160e060020a635e383d2102815260ff871660048201529051600160a060020a0390921691635e383d21916024808201926020929091908290030181600087803b15801561526f57600080fd5b505af1158015615283573d6000803e3d6000fd5b505050506040513d602081101561529957600080fd5b505196909601955b6001909301926151d4565b600092505b8560ff168360ff1610156153f557600c60ff851610806152d45750600e60ff8516115b80156152f4575060ff83166000908152600c602052604081205461ffff16115b156153ea5760ff83166000818152600c6020908152604080832054600154825160e060020a635e383d210281526004810196909652915161ffff909116946001608060020a038d1694600160a060020a0390931693635e383d219360248084019492938390030190829087803b15801561536d57600080fd5b505af1158015615381573d6000803e3d6000fd5b505050506040513d602081101561539757600080fd5b50518a026001608060020a03168115156153ad57fe5b046001608060020a03168115156153c057fe5b04858460ff168151811015156153d257fe5b6001608060020a039092166020928302909101909101525b6001909201916152b1565b5060005b600b5461ffff9081169082161015615562576009600060078361ffff1681548110151561542257fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff169150600c82108061546c5750600e60ff8316115b1561555a57846009600060078461ffff1681548110151561548957fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902054815160ff9091169081106154cc57fe5b906020019060200201516009600060078461ffff168154811015156154ed57fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff16845283019390935260409091019020805470ffffffffffffffffffffffffffffffff00198116908390046001608060020a03908116949094019093169091029190911790555b6001016153f9565b505050505050505050565b600b5460009081908190819061ffff1661558687614f6f565b81151561558f57fe5b600b549190069350600761ffff9182160616156155ad5760076155cb565b600b805461ffff160661ffff166000146155c857600b6155cb565b600d5b60ff1691508290505b61562a856009600060078561ffff168154811015156155ef57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff1661387e565b8015615694575033600160a060020a03166009600060078461ffff1681548110151561565257fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902060010154600160a060020a031614155b156156a1578093506156d4565b600b5461ffff90811690828401168115156156b857fe5b06905061ffff808216908416146156ce576155d4565b60001993505b50505092915050565b5060a05190565b63ffffffff81166000908152600a602052604081205460ff1615615752576040805160e560020a62461bcd02815260206004820152601260248201527f616c72656164792074656c65706f727465640000000000000000000000000000604482015290519081900360640190fd5b5063ffffffff81166000908152600a60209081526040808320805460ff19166001179055600990915290208054600560ff9190911611615801576040805160e560020a62461bcd028152602060048201526024808201527f647261676f6e7320646f206e6f74206e65656420746f2062652074656c65706f60448201527f7274656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b5461581390839061ffff16615980565b600b805461ffff8082166001908101821661ffff1993841617909355835460ff166000908152600c6020908152604091829020805480851690960190931694909316939093179055815163ffffffff8516815291517f663f46f5a2fd740de613966ad0391fbc9d840f82898698e6d7f16ba0ed126b3b9281900390910190a15050565b63ffffffff8216600081815260106020908152604091829020805460ff191660ff861690811790915582519384529083015280517f088ba7785fd329abbf01eaa732bad30e14b205b9fc8ab9378f9f5295731135559281900390910190a15050565b600080600160315b60056001608060020a0382161061597357846001608060020a0316836001608060020a0316111561593657806002019350615978565b9181019160286001608060020a0382161480159061595e5750806001608060020a0316600814155b1561596a576001820191505b60001901615900565b600593505b505050919050565b60075461ffff821610156159da578160078261ffff168154811015156159a257fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550610b2a565b506007805460018101825560008290527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68860088204018054919092166004026101000a63ffffffff818102199092169390911602919091179055565b61014060405190810160405280600a906020820280388339509192915050565b5080546000825560070160089004906000526020600020908101906129029190615a9091905b80821115610e9a5760008155600101615a7c565b905600636f6e7472616374732063616e6e6f7420657865637574652074686973206d65a165627a7a7230582024fb9ce62e67c061cddce8f77ef450819e570b90c6d1314d8a2445db919382d70029000000000000000000000000c596bd09d652827b0106292d3e378d5938df4b12000000000000000000000000a54ddc7b3cce7fc8b1e3fa0256d0db80d2c10970000000000000000000000000a7bd9d58d22d5e35ec4a08083141e0340ea2ca93000000000000000000000000d28525ad63f337c86843d720dae921228e44f0ac000000000000000000000000ca1c217a2200b60dbd52e33c7cb1758db2b30a0e0000000000000000000000002a06579f0ab0f55995884222d8766ab10e6ac4bd

Deployed Bytecode

0x6080604052600436106102585763ffffffff60e060020a60003504166307da68f5811461025d5780630a3dfba7146102745780630fa6002e1461028e5780631d2a6dcf146102ac5780631e466eee146102d857806320e3dbd4146102ed57806326bdce711461030e57806328acb00214610339578063291ed7731461035a57806329b20bb61461038b57806330aaed53146103a65780633728bec2146103bb5780633c3c22b31461040c5780633ccfd60b1461043a5780634afe49c21461044f5780634f255b8014610464578063603709e31461048257806361b8ce8c1461055b578063726c86411461057057806372ad21c714610597578063773e1e84146105b557806379502c55146105da578063797e2aec1461060b57806383197ef014610619578063851ad4d61461062e5780638da5cb5b146106435780638f4ffcb1146106585780639271a988146106c85780639c73048b146106dd5780639ced242b146106f2578063a050d07d14610707578063a9689b4f146106c8578063ad389d5d1461071c578063ad70ae1a14610751578063b066ef3c14610766578063b0eee8db14610784578063b32dbcd814610799578063c10435cc146107ae578063c1255299146107c3578063c2052403146107d8578063d0f9bad1146107ed578063d39512b814610802578063db8d55f114610817578063dc9bb7db1461082c578063e9fad8ee14610841578063f10e2ec114610856578063f1be42f11461086b578063f2fde38b14610880578063f5074f41146108a1578063f690648d146108c2578063fac333ac146108d7578063fbe6529f146108ef575b600080fd5b34801561026957600080fd5b50610272610904565b005b610272600160a060020a036004351660ff60243516610935565b34801561029a57600080fd5b5061027263ffffffff60043516610b2e565b3480156102b857600080fd5b506102c1610e66565b6040805161ffff9092168252519081900360200190f35b3480156102e457600080fd5b50610272610e9e565b3480156102f957600080fd5b50610272600160a060020a0360043516611494565b34801561031a57600080fd5b506103236114da565b6040805160ff9092168252519081900360200190f35b34801561034557600080fd5b506102726001608060020a03600435166114df565b34801561036657600080fd5b5061036f611564565b604080516001608060020a039092168252519081900360200190f35b34801561039757600080fd5b506102c160ff6004351661157b565b3480156103b257600080fd5b50610323611591565b3480156103c757600080fd5b506103d963ffffffff60043516611596565b6040805160ff90941684526001608060020a039092166020840152600160a060020a031682820152519081900360600190f35b34801561041857600080fd5b506104216115d5565b6040805163ffffffff9092168252519081900360200190f35b34801561044657600080fd5b506102726115e8565b34801561045b57600080fd5b506102c1611818565b34801561047057600080fd5b506102c163ffffffff6004351661181e565b34801561048e57600080fd5b5061049e61ffff6004351661188a565b604051808561014080838360005b838110156104c45781810151838201526020016104ac565b5050505090500184600a60200280838360005b838110156104ef5781810151838201526020016104d7565b5050505090500183600a60200280838360005b8381101561051a578181015183820152602001610502565b5050505090500182600a60200280838360005b8381101561054557818101518382015260200161052d565b5050505090500194505050505060405180910390f35b34801561056757600080fd5b50610421611a31565b34801561057c57600080fd5b50610585611a3d565b60408051918252519081900360200190f35b3480156105a357600080fd5b5061032363ffffffff60043516611a43565b3480156105c157600080fd5b5061027263ffffffff6004351661ffff60243516611a58565b3480156105e657600080fd5b506105ef612895565b60408051600160a060020a039092168252519081900360200190f35b61027260ff600435166128a4565b34801561062557600080fd5b50610272612905565b34801561063a57600080fd5b506102c161292a565b34801561064f57600080fd5b506105ef61295d565b34801561066457600080fd5b50604080516020601f60643560048181013592830184900484028501840190955281845261027294600160a060020a0381358116956024803596604435909316953695608494920191819084018382808284375094975061296c9650505050505050565b3480156106d457600080fd5b50610323613176565b3480156106e957600080fd5b5061027261317b565b3480156106fe57600080fd5b50610323613845565b34801561071357600080fd5b506102c161384a565b34801561072857600080fd5b5061073d60ff6004358116906024351661387e565b604080519115158252519081900360200190f35b34801561075d57600080fd5b50610323613971565b34801561077257600080fd5b5061058563ffffffff60043516613976565b34801561079057600080fd5b50610323613988565b3480156107a557600080fd5b506102c161398d565b3480156107ba57600080fd5b506105856139c1565b3480156107cf57600080fd5b506103236139c7565b3480156107e457600080fd5b506102726139cc565b3480156107f957600080fd5b50610323613ba4565b34801561080e57600080fd5b50610323613ba9565b34801561082357600080fd5b50610585613bae565b34801561083857600080fd5b50610421611818565b34801561084d57600080fd5b50610272613c33565b34801561086257600080fd5b506103236142e1565b34801561087757600080fd5b506102c16142e6565b34801561088c57600080fd5b50610272600160a060020a03600435166142f0565b3480156108ad57600080fd5b50610272600160a060020a0360043516614384565b3480156108ce57600080fd5b506103236143a7565b3480156108e357600080fd5b506104216004356143ac565b3480156108fb57600080fd5b506102726143e4565b600054600160a060020a0316331461091b57600080fd5b6109236115e8565b61092b6139cc565b610933612905565b565b333214610989576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b6109938282614517565b600160009054906101000a9004600160a060020a0316600160a060020a0316632091f9556040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156109e657600080fd5b505af11580156109fa573d6000803e3d6000fd5b505050506040513d6020811015610a1057600080fd5b5051600154604080517f5bdaa8e70000000000000000000000000000000000000000000000000000000081529051600160a060020a039384169363a9059cbb938793911691635bdaa8e7916004808201926020929091908290030181600087803b158015610a7d57600080fd5b505af1158015610a91573d6000803e3d6000fd5b505050506040513d6020811015610aa757600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a03909316600484015260248301919091525160448083019260209291908290030181600087803b158015610af657600080fd5b505af1158015610b0a573d6000803e3d6000fd5b505050506040513d6020811015610b2057600080fd5b50511515610b2a57fe5b5050565b6000333214610b84576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b63ffffffff8216600090815260096020526040902060010154600160a060020a03163314610c22576040805160e560020a62461bcd02815260206004820152602560248201527f6f6e6c79206f776e6572732063616e2073656c6c20746865697220636861726160448201527f6374657273000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b63ffffffff8216600090815260096020526040902054600c60ff9091161080610c65575063ffffffff8216600090815260096020526040902054600e60ff909116115b1515610cbb576040805160e560020a62461bcd02815260206004820152601960248201527f62616c6c6f6f6e7320617265206e6f742073656c6c61626c6500000000000000604482015290519081900360640190fd5b63ffffffff82166000908152600960205260409020600101544260a060020a90910467ffffffffffffffff90811662015180011610610d6a576040805160e560020a62461bcd02815260206004820152603360248201527f6368617261637465722063616e20626520736f6c64206f6e6c7920312064617960448201527f2061667465722074686520707572636861736500000000000000000000000000606482015290519081900360840190fd5b5063ffffffff8116600090815260096020526040902054600b805461ffff19811661ffff9182166000190190911617905561010090046001608060020a0316610dc1610db58361181e565b600b5461ffff16614db5565b60405133906001608060020a03831680156108fc02916000818181858888f19350505050158015610df6573d6000803e3d6000fd5b5060085460a060020a900463ffffffff161515610e1557610e156143e4565b6040805163ffffffff841681523360208201526001608060020a0383168183015290517fe5cc68f68d9672681158062a835b6abc2ff3fba89f8db70f3a227d4ac35da3c39181900360600190a15050565b600060155b601a60ff821611610e9a5760ff81166000908152600c602052604090205461ffff169190910190600101610e6b565b5090565b6000808080808080606080828080333214610f00576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b600160009054906101000a9004600160a060020a0316600160a060020a031663afb7e4956040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015610f5357600080fd5b505af1158015610f67573d6000803e3d6000fd5b505050506040513d6020811015610f7d57600080fd5b5051600d5401421015611000576040805160e560020a62461bcd02815260206004820152602a60248201527f6e6f7420656e6f7567682074696d65207061737365642073696e6365206c617360448201527f74206572757074696f6e00000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b54600061ffff90911611611086576040805160e560020a62461bcd02815260206004820152602360248201527f746865726520617265206e6f206368617261637465727320696e20746865206760448201527f616d650000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b42600d55600b54600154604080517f11a5a793000000000000000000000000000000000000000000000000000000008152905161ffff9093169a50606492600160a060020a03909216916311a5a793916004808201926020929091908290030181600087803b1580156110f857600080fd5b505af115801561110c573d6000803e3d6000fd5b505050506040513d602081101561112257600080fd5b505160ff16890261ffff1681151561113657fe5b0461ffff1696508761ffff1661271002620138800163ffffffff1695508663ffffffff166000141561116757600196505b8663ffffffff16604051908082528060200260200182016040528015611197578160200160208202803883390190505b506008546040805163ffffffff90921680835260208082028401019091529196509080156111cf578160200160208202803883390190505b50935060009250600091505b8663ffffffff168361ffff1610156112fb5781806001019250508761ffff1661120b8361ffff16600d5401614f6f565b81151561121457fe5b06995060078a61ffff1681548110151561122a57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff169850838963ffffffff1681518110151561126657fe5b9060200190602002015115156112f6576001848a63ffffffff1681518110151561128c57fe5b91151560209283029091019091015284518990869061ffff86169081106112af57fe5b63ffffffff9092166020928302909101909101526112cf8a896000614fc8565b9a5060008b6001608060020a031611156112eb57600019909701965b9a8a019a6001909201915b6111db565b50600b805461ffff891661ffff199091161790556001608060020a038086163a0290818116908d1611156113e457611334818d036150f2565b7fa06ad7d0261a795ad8f33fdbef7cf65a0f9f9a825353b13358a96a750acd6b3d85828e03836040518080602001846001608060020a03166001608060020a03168152602001836001608060020a03166001608060020a03168152602001828103825285818151815260200191508051906020019060200280838360005b838110156113ca5781810151838201526020016113b2565b5050505090500194505050505060405180910390a1611486565b7fa06ad7d0261a795ad8f33fdbef7cf65a0f9f9a825353b13358a96a750acd6b3d856000836040518080602001846001608060020a03168152602001836001608060020a03166001608060020a03168152602001828103825285818151815260200191508051906020019060200280838360005b83811015611470578181015183820152602001611458565b5050505090500194505050505060405180910390a15b505050505050505050505050565b600054600160a060020a031633146114ab57600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600b81565b60008054600160a060020a031633146114f757600080fd5b6114ff613bae565b9050808267016345785d8a0000016001608060020a03161015610b2a5760008054604051600160a060020a03909116916001608060020a03851680156108fc02929091818181858888f1935050505015801561155f573d6000803e3d6000fd5b505050565b60085464010000000090046001608060020a031681565b600c6020526000908152604090205461ffff1681565b600c81565b63ffffffff166000908152600960205260409020805460019091015460ff8216926101009092046001608060020a031691600160a060020a0390911690565b60085460a060020a900463ffffffff1681565b600080548190600160a060020a0316331461160257600080fd5b6002546040805160e060020a6370a082310281523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561165257600080fd5b505af1158015611666573d6000803e3d6000fd5b505050506040513d602081101561167c57600080fd5b505160025460008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101869052905194965092169263a9059cbb926044808201936020939283900390910190829087803b1580156116f357600080fd5b505af1158015611707573d6000803e3d6000fd5b505050506040513d602081101561171d57600080fd5b5051151561172757fe5b6003546040805160e060020a6370a082310281523060048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561177757600080fd5b505af115801561178b573d6000803e3d6000fd5b505050506040513d60208110156117a157600080fd5b505160035460008054604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015260248101869052905194955092169263a9059cbb926044808201936020939283900390910190829087803b158015610af657600080fd5b60001981565b6000805b60075461ffff82161015610258578263ffffffff1660078261ffff1681548110151561184a57fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff16141561187c57809150611884565b600101611822565b50919050565b611892615a36565b61189a615a36565b6118a2615a36565b6118aa615a36565b600b5460009081908190819061ffff908116600a8b01909116116118d15788600a016118d9565b600b5461ffff165b61ffff169350600092508890505b8363ffffffff168161ffff161015611a26576007805461ffff831690811061190b57fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff169150818860ff8516600a811061194157fe5b63ffffffff9283166020918202929092019190915290831660009081526009909152604090205460ff9081169088908516600a811061197c57fe5b60ff9283166020918202929092019190915263ffffffff841660009081526009909152604090205461010090046001608060020a03169087908516600a81106119c157fe5b6001608060020a039092166020928302919091015263ffffffff8316600090815260099091526040902060010154600160a060020a03168560ff8516600a8110611a0757fe5b600160a060020a039092166020929092020152600192830192016118e7565b505050509193509193565b60085463ffffffff1681565b600e5481565b60106020526000908152604090205460ff1681565b6000808080808080808080333214611ab7576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b6007805461ffff8d16908110611ac957fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff908116908d1614611b0357611b008c61181e565b9a505b63ffffffff8c16600090815260096020908152604080832060015482517f4597dc8e0000000000000000000000000000000000000000000000000000000081529251919e504294600160a060020a0390911693634597dc8e936004808201949293918390030190829087803b158015611b7b57600080fd5b505af1158015611b8f573d6000803e3d6000fd5b505050506040513d6020811015611ba557600080fd5b505163ffffffff8e166000908152600f6020526040902054011115611c3a576040805160e560020a62461bcd02815260206004820152603d60248201527f6e6f7420656e6f7567682074696d65207061737365642073696e63652074686560448201527f206c617374206669676874206f66207468697320636861726163746572000000606482015290519081900360840190fd5b60018a0154600160a060020a03163314611cc4576040805160e560020a62461bcd02815260206004820152603260248201527f6f6e6c79206f776e65722063616e20696e69746961746520612066696768742060448201527f666f722074686973206368617261637465720000000000000000000000000000606482015290519081900360840190fd5b895460ff169850600c891080611cdd5750600e60ff8a16115b1515611d33576040805160e560020a62461bcd02815260206004820152601560248201527f62616c6c6f6f6e732063616e6e6f742066696768740000000000000000000000604482015290519081900360640190fd5b611d438c63ffffffff168a61556d565b975061ffff8089161415611d5357fe5b6007805461ffff8a16908110611d6557fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff908116808452600990925260409092209098509650606490611dac908e16614f6f565b811515611db557fe5b069250600160009054906101000a9004600160a060020a0316600160a060020a0316638f7561476040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611e0b57600080fd5b505af1158015611e1f573d6000803e3d6000fd5b505050506040513d6020811015611e3557600080fd5b5051600480546040805160e060020a6370a08231028152339381019390935251600160a060020a03909116916370a082319160248083019260209291908290030181600087803b158015611e8857600080fd5b505af1158015611e9c573d6000803e3d6000fd5b505050506040513d6020811015611eb257600080fd5b505110611eed576064611ec88461ffff16614f6f565b811515611ed157fe5b0693508261ffff168461ffff161015611ee8578392505b600093505b60065460018b01546040805160e060020a6370a08231028152600160a060020a039283166004820152905191909216916370a082319160248083019260209291908290030181600087803b158015611f4457600080fd5b505af1158015611f58573d6000803e3d6000fd5b505050506040513d6020811015611f6e57600080fd5b505160055460018c01546040805160e060020a6370a08231028152600160a060020a039283166004820152905166038d7ea4c680009392909216916370a08231916024808201926020929091908290030181600087803b158015611fd157600080fd5b505af1158015611fe5573d6000803e3d6000fd5b505050506040513d6020811015611ffb57600080fd5b505181151561200657fe5b60065460018a01546040805160e060020a6370a08231028152600160a060020a03928316600482015290519490930494909401955092909216916370a082319160248083019260209291908290030181600087803b15801561206757600080fd5b505af115801561207b573d6000803e3d6000fd5b505050506040513d602081101561209157600080fd5b505160055460018801546040805160e060020a6370a08231028152600160a060020a039283166004820152905166038d7ea4c680009392909216916370a08231916024808201926020929091908290030181600087803b1580156120f457600080fd5b505af1158015612108573d6000803e3d6000fd5b505050506040513d602081101561211e57600080fd5b505181151561212957fe5b88548d5492909104929092019250610100918290046001608060020a039081169290910416141561229d5760329350808211156121fa57600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156121b357600080fd5b505af11580156121c7573d6000803e3d6000fd5b505050506040513d60208110156121dd57600080fd5b505160ff1660648115156121ed57fe5b0460ff1684019350612298565b8181111561229857600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561225557600080fd5b505af1158015612269573d6000803e3d6000fd5b505050506040513d602081101561227f57600080fd5b505160ff16606481151561228f57fe5b0460ff16840393505b612463565b85548a546001608060020a036101009283900481169290910416111561239457606493508181111561229857600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561231c57600080fd5b505af1158015612330573d6000803e3d6000fd5b505050506040513d602081101561234657600080fd5b50518a54875460ff90921691610100918290046001608060020a039081169290910481166064021681151561237757fe5b046001608060020a031681151561238a57fe5b0484039350612463565b8082111561246357600160009054906101000a9004600160a060020a0316600160a060020a0316634ad6e6486040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156123ef57600080fd5b505af1158015612403573d6000803e3d6000fd5b505050506040513d602081101561241957600080fd5b505186548b5460ff90921691610100918290046001608060020a039081169290910481166064021681151561244a57fe5b046001608060020a031681151561245d57fe5b04840193505b61ffff808516908416106126b1578554600c60ff909116108061248c57508554600e60ff909116115b1561265257600b5486546124ab918d9161ffff9091169060ff16614fc8565b94506000856001608060020a031611156124de57600b805461ffff19811661ffff91821660001901909116179055612559565b63ffffffff8c166000908152600f602090815260408083204290556009909152902060010154600360e060020a90910460ff1610156125595763ffffffff8c1660009081526009602052604090206001908101805460ff60e060020a80830482169094011690920260e060020a60ff02199092169190911790555b8554601560ff9091161080159061257757508554601a60ff90911611155b156125ba57600880546001608060020a03640100000000808304821689019091160273ffffffffffffffffffffffffffffffff00000000199091161790556125ec565b85546001608060020a03610100808304821688019091160270ffffffffffffffffffffffffffffffff00199091161786555b6040805163ffffffff808a1682528e1660208201526001608060020a0387168183015261ffff80871660608301528516608082015290517f24758388bd6bf650dde3bbde100b1056920770025a9f1c5998b4587670d4f3859181900360a00190a16126ac565b6040805163ffffffff808a1682528e16602082015260008183015261ffff80871660608301528516608082015290517f24758388bd6bf650dde3bbde100b1056920770025a9f1c5998b4587670d4f3859181900360a00190a15b611486565b63ffffffff8c166000908152600f602090815260408083204290556009909152902060010154600360e060020a90910460ff16101561272c5763ffffffff8c1660009081526009602052604090206001908101805460ff60e060020a80830482169094011690920260e060020a60ff02199092169190911790555b600b548a54612746918a9161ffff9091169060ff16614fc8565b94506000856001608060020a0316111561277557600b805461ffff19811661ffff918216600019019091161790555b8954601560ff9091161080159061279357508954601a60ff90911611155b156127d657600880546001608060020a03640100000000808304821689019091160273ffffffffffffffffffffffffffffffff0000000019909116179055612808565b89546001608060020a03610100808304821688019091160270ffffffffffffffffffffffffffffffff0019909116178a555b60085460a060020a900463ffffffff161515612826576128266143e4565b6040805163ffffffff808f168252891660208201526001608060020a0387168183015261ffff80871660608301528516608082015290517f24758388bd6bf650dde3bbde100b1056920770025a9f1c5998b4587670d4f3859181900360a00190a1505050505050505050505050565b600154600160a060020a031681565b3332146128f8576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b6129023382614517565b50565b600054600160a060020a0316331461291c57600080fd5b600054600160a060020a0316ff5b6000805b600560ff821611610e9a5760ff81166000908152600c602052604090205461ffff16919091019060010161292e565b600054600160a060020a031681565b60035460009081908190819081908190600160a060020a0316331415612ba057612995876156dd565b9550600160009054906101000a9004600160a060020a0316600160a060020a0316636121e5226040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156129ea57600080fd5b505af11580156129fe573d6000803e3d6000fd5b505050506040513d6020811015612a1457600080fd5b505163ffffffff8716600090815260096020526040902054909550600c60ff90911610801590612a5f575063ffffffff8616600090815260096020526040902054601460ff90911611155b15612a6b576002850294505b84891015612ae9576040805160e560020a62461bcd02815260206004820152603860248201527f696e737566666963696e657420616d6f756e74206f6620746f6b656e7320746f60448201527f2074656c65706f72742074686973206368617261637465720000000000000000606482015290519081900360840190fd5b600354604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038d8116600483015230602483015260448201899052915191909216916323b872dd9160648083019260209291908290030181600087803b158015612b5e57600080fd5b505af1158015612b72573d6000803e3d6000fd5b505050506040513d6020811015612b8857600080fd5b50511515612b9257fe5b612b9b866156e4565b61316a565b600254600160a060020a03163314156130f457612bbc876156dd565b63ffffffff8116600090815260096020908152604080832054600154825160e060020a635e383d2102815260ff909216600483018190529251959b50919850600160a060020a0390911693635e383d2193602480840194938390030190829087803b158015612c2a57600080fd5b505af1158015612c3e573d6000803e3d6000fd5b505050506040513d6020811015612c5457600080fd5b505163ffffffff871660009081526009602052604090205461010090046001608060020a03908116911614612d1f576040805160e560020a62461bcd02815260206004820152605c60248201527f70726f74656374696f6e20636f756c6420626520626f75676874206f6e6c792060448201527f6265666f72652074686520666972737420666967687420616e64206265666f7260648201527f652074686520666972737420766f6c63616e6f206572757074696f6e00000000608482015290519081900360a40190fd5b600b60ff851611612dc257600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612d7d57600080fd5b505af1158015612d91573d6000803e3d6000fd5b505050506040513d6020811015612da757600080fd5b5051600660ff86160660010160ff1602925060039150612fec565b600c60ff851610801590612dda5750600e60ff851611155b15612e7d57600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612e3257600080fd5b505af1158015612e46573d6000803e3d6000fd5b505050506040513d6020811015612e5c57600080fd5b505160066003860160ff160660010160ff1602600202925060069150612fec565b600f60ff851610801590612e955750601460ff851611155b15612f3857600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612eed57600080fd5b505af1158015612f01573d6000803e3d6000fd5b505050506040513d6020811015612f1757600080fd5b505160066003860160ff160660010160ff1602600202925060039150612fec565b601560ff851610801590612f505750601a60ff851611155b15612fec57600160009054906101000a9004600160a060020a0316600160a060020a03166319f353bb6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015612fa857600080fd5b505af1158015612fbc573d6000803e3d6000fd5b505050506040513d6020811015612fd257600080fd5b505160066003860160ff160660010160ff16029250600391505b5063ffffffff851660009081526010602052604081205490945060ff165b8160ff168160ff1610801561302957508060010160ff16830285018910155b156130415760010160ff81168302949094019361300a565b600254604080517f23b872dd000000000000000000000000000000000000000000000000000000008152600160a060020a038d8116600483015230602483015260448201899052915191909216916323b872dd9160648083019260209291908290030181600087803b1580156130b657600080fd5b505af11580156130ca573d6000803e3d6000fd5b505050506040513d60208110156130e057600080fd5b505115156130ea57fe5b612b9b8682615896565b6040805160e560020a62461bcd02815260206004820152603160248201527f53686f756c64206265206569746865722066726f6d204e65766572646965206f60448201527f722054656c65706f727420746f6b656e73000000000000000000000000000000606482015290519081900360840190fd5b50505050505050505050565b600681565b6000808060608181818080803332146131db576040805160e560020a62461bcd02815260206004820152602480820152600080516020615a94833981519152604482015260e260020a631d1a1bd902606482015290519081900360840190fd5b600160009054906101000a9004600160a060020a0316600160a060020a03166399bd59ee6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561322e57600080fd5b505af1158015613242573d6000803e3d6000fd5b505050506040513d602081101561325857600080fd5b5051600e54014210156132db576040805160e560020a62461bcd02815260206004820152603e60248201527f6e6f7420656e6f7567682074696d65207061737365642073696e63652074686560448201527f206c61737420636173746c65206c6f6f7420646973747269627574696f6e0000606482015290519081900360840190fd5b42600e8190556132ef906103e890066158f8565b995060058a6001608060020a0316101561330857600599505b6008546064906001608060020a0364010000000090910481168c021660408051600680825260e08201909252929091049a506020820160c08038833901905050600b546040805161ffff909216808352602080820284010190915291985090801561337d578160200160208202803883390190505b509450600092505b60075460ff841610156135bc576009600060078560ff168154811015156133a857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff169350601584108015906133f55750601a60ff851611155b8015613457575060036009600060078660ff1681548110151561341457fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460e060020a900460ff1610155b80156134c4575062093a806009600060078660ff1681548110151561347857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460a060020a900467ffffffffffffffff16420310155b156135b1576001546040805160e060020a635e383d2102815260ff871660048201529051600160a060020a0390921691635e383d21916024808201926020929091908290030181600087803b15801561351c57600080fd5b505af1158015613530573d6000803e3d6000fd5b505050506040513d602081101561354657600080fd5b505160078054999091019860ff851690811061355e57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16858761ffff1681518110151561359657fe5b63ffffffff9092166020928302909101909101526001909501945b600190920191613385565b6000886001608060020a0316111561380557600091505b600660ff831610156136b1576001546040805160e060020a635e383d2102815260ff6015860116600482015290516001608060020a038b1692600160a060020a031691635e383d219160248083019260209291908290030181600087803b15801561363d57600080fd5b505af1158015613651573d6000803e3d6000fd5b505050506040513d602081101561366757600080fd5b50518a026001608060020a031681151561367d57fe5b04878360ff1681518110151561368f57fe5b6001608060020a039092166020928302909101909101526001909101906135d3565b5060005b8561ffff168161ffff16101561378f5786601560096000888561ffff168151811015156136de57fe5b602090810290910181015163ffffffff16825281019190915260400160002054825160ff918216929092031690811061371357fe5b9060200190602002015160096000878461ffff1681518110151561373357fe5b602090810290910181015163ffffffff16825281019190915260400160002080546001608060020a0361010080830482169094011690920270ffffffffffffffffffffffffffffffff00199092169190911790556001016136b5565b600880546001608060020a0364010000000080830482168d900382160273ffffffffffffffffffffffffffffffff00000000199092169190911790915560408051918b168252517f2359110bd6bbc405457edff9ea27ed0310d86730da626b57da3ba05cae1ce22d9181900360200190a161316a565b604080516000815290517f2359110bd6bbc405457edff9ea27ed0310d86730da626b57da3ba05cae1ce22d9181900360200190a150505050505050505050565b601481565b6000600f5b601460ff821611610e9a5760ff81166000908152600c602052604090205461ffff16919091019060010161384f565b6000600660ff8416108015906138985750600b60ff841611155b156138ab5750600560ff8216111561396b565b600f60ff8416108015906138c35750601460ff841611155b156138e457600c60ff831610806138dd5750600e60ff8316115b905061396b565b600060ff8416108015906138fc5750600560ff841611155b1561390f5750600f60ff8216101561396b565b601560ff8416108015906139275750601a60ff841611155b1561396757600c60ff8316108015906139445750600e60ff831611155b806138dd5750600660ff8316108015906138dd575050600b60ff8216111561396b565b5060005b92915050565b601581565b600f6020526000908152604090205481565b600f81565b600060065b600b60ff821611610e9a5760ff81166000908152600c602052604090205461ffff169190910190600101613992565b600d5481565b600581565b60008054600160a060020a031633146139e457600080fd5b5060005b600b5461ffff9081169082161015613b8a576009600060078361ffff16815481101515613a1157fe5b6000918252602080832060088304015460079283166004026101000a900463ffffffff16845283019390935260409091018120600101548254600160a060020a03909116926108fc9260099290919061ffff8716908110613a6e57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200190815260200160002060000160019054906101000a90046001608060020a03166001608060020a03169081150290604051600060405180830381858888f19350505050158015613af9573d6000803e3d6000fd5b506009600060078361ffff16815481101515613b1157fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff1683528201929092526040019020805470ffffffffffffffffffffffffffffffffff19168155600190810180547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169055016139e8565b613b9660076000615a56565b50600b805461ffff19169055565b601a81565b600e81565b600080805b600b5461ffff9081169082161015613c2a576009600060078361ffff16815481101515613bdc57fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff1684528301939093526040909101902054046001608060020a03169190910190600101613bb3565b50303103919050565b606060008060008060006032604051908082528060200260200182016040528015613c68578160200160208202803883390190505b50600b5490965061ffff169150600090505b8161ffff168161ffff1610156141f05733600160a060020a03166009600060078461ffff16815481101515613cab57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902060010154600160a060020a0316148015613d5b5750426009600060078461ffff16815481101515613d0a57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460a060020a900467ffffffffffffffff908116620151800116105b8015613e0f5750600c60ff166009600060078461ffff16815481101515613d7e57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff161080613e0f5750600e60ff166009600060078461ffff16815481101515613dd757fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff16115b156141e8575b60008261ffff16118015613e89575033600160a060020a03166009600060076001860361ffff16815481101515613e4857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902060010154600160a060020a0316145b8015613efc5750426009600060076001860361ffff16815481101515613eab57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190206001015460a060020a900467ffffffffffffffff908116620151800116105b8015613fb05750600c60ff166009600060078461ffff16815481101515613f1f57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff161080613fb05750600e60ff166009600060078461ffff16815481101515613f7857fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff16115b1561410257600780546000199093019261ffff8416908110613fce57fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff1680845260098083526040808620805460ff9081168852600c8652918720805461ffff19811661ffff9182166000190190911617905595839052925292548951939750919091046001608060020a0316949094019385918891881690811061405857fe5b63ffffffff9283166020918202909201015260085460019096019585821660a060020a90910490911614156140a9576008805477ffffffff0000000000000000000000000000000000000000191690555b63ffffffff84166000908152600960205260409020805470ffffffffffffffffffffffffffffffffff1916815560010180547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169055613e15565b8060010161ffff168261ffff1611156141e8576009600060078361ffff1681548110151561412c57fe5b60009182526020808320600883040154600792831660040261010090810a90910463ffffffff16855290840194909452604090920190205481549290046001608060020a031694909401939061ffff831690811061418657fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16868660ff168151811015156141bd57fe5b63ffffffff909216602092830290910190910152600190940193600019909101906141e88183614db5565b600101613c7a565b600b805461ffff191661ffff84161790556040805133808252602080830187905260609383018481528a519484019490945289517f1e6d26af567145cb0b46ea7135e21671f1e58e8d1f818dab12b0e10eb5ebb07b94929388938c93919290916080840191858201910280838360005b83811015614278578181015183820152602001614260565b5050505090500194505050505060405180910390a1604051339084156108fc029085906000818181858888f193505050501580156142ba573d6000803e3d6000fd5b5060085460a060020a900463ffffffff1615156142d9576142d96143e4565b505050505050565b600081565b600b5461ffff1681565b600054600160a060020a0316331461430757600080fd5b600160a060020a038116151561431c57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600054600160a060020a0316331461439b57600080fd5b80600160a060020a0316ff5b601b81565b60078054829081106143ba57fe5b9060005260206000209060089182820401919006600402915054906101000a900463ffffffff1681565b60001960005b600b5461ffff90811690821610156144df578163ffffffff1660078261ffff1681548110151561441657fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff161080156144975750600560ff166009600060078461ffff1681548110151561445e57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff1611155b156144d7576007805461ffff83169081106144ae57fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1691505b6001016143ea565b506008805463ffffffff90921660a060020a0277ffffffff000000000000000000000000000000000000000019909216919091179055565b6000806000806000600160009054906101000a9004600160a060020a0316600160a060020a03166349b3b29f876040518263ffffffff1660e060020a028152600401808260ff168152602001915050602060405180830381600087803b15801561458057600080fd5b505af1158015614594573d6000803e3d6000fd5b505050506040513d60208110156145aa57600080fd5b50516001608060020a0316348115156145bf57fe5b049450600061ffff86161161466a576040805160e560020a62461bcd02815260206004820152604260248201527f696e73756666696369656e7420616d6f756e74206f6620657468657220746f2060448201527f7075726368617365206120676976656e2074797065206f66206368617261637460648201527f6572000000000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b600b54600154604080517f49e77c8b000000000000000000000000000000000000000000000000000000008152600160a060020a038b8116600483015260ff8b166024830152915161ffff90941697509116916349e77c8b916044808201926020929091908290030181600087803b1580156146e557600080fd5b505af11580156146f9573d6000803e3d6000fd5b505050506040513d602081101561470f57600080fd5b505115156147b3576040805160e560020a62461bcd02815260206004820152604360248201527f696e737566666963696e657420616d6f756e74206f6620746f6b656e7320746f60448201527f207075726368617365206120676976656e2074797065206f662063686172616360648201527f7465720000000000000000000000000000000000000000000000000000000000608482015290519081900360a40190fd5b601b60ff87161015806148625750600154604080517f49b3b29f00000000000000000000000000000000000000000000000000000000815260ff891660048201529051600160a060020a03909216916349b3b29f916024808201926020929091908290030181600087803b15801561482a57600080fd5b505af115801561483e573d6000803e3d6000fd5b505050506040513d602081101561485457600080fd5b50516001608060020a031634105b806148f55750600160009054906101000a9004600160a060020a0316600160a060020a0316638882ddc96040518163ffffffff1660e060020a028152600401602060405180830381600087803b1580156148bb57600080fd5b505af11580156148cf573d6000803e3d6000fd5b505050506040513d60208110156148e557600080fd5b505161ffff908116858701909116115b156148ff57600080fd5b60085463ffffffff169250600560ff871611614b825760085460a060020a900463ffffffff161580614940575060085460a060020a900463ffffffff908116145b15614975576008805477ffffffff0000000000000000000000000000000000000000191660a060020a63ffffffff8616021790555b600091505b8461ffff168260ff161015614b3f5761499b60ff8316848101908601615980565b6040805160a08101825260ff8816808252600154835160e060020a635e383d21028152600481019290925292519192602080850193600160a060020a0390921692635e383d2192602480830193928290030181600087803b1580156149ff57600080fd5b505af1158015614a13573d6000803e3d6000fd5b505050506040513d6020811015614a2957600080fd5b50516001608060020a039081168252600160a060020a038a81166020808501919091524267ffffffffffffffff9081166040808701919091526000606096870181905260ff8a81168c0163ffffffff168252600985529082902088518154958a015160ff199096169083161770ffffffffffffffffffffffffffffffff0019166101009590971694909402959095178355860151600192830180549688015160809098015173ffffffffffffffffffffffffffffffffffffffff1990971691909416177bffffffffffffffff0000000000000000000000000000000000000000191660a060020a96909116959095029490941760e060020a60ff02191660e060020a93909216929092021790559091019061497a565b60ff86166000908152600c60205260409020805461ffff1980821661ffff9283168901831617909255600b80549283169282168801909116919091179055614d36565b5060005b8461ffff168160ff161015614d36576040805160a08101825260ff8816808252600154835160e060020a635e383d21028152600481019290925292519192602080850193600160a060020a0390921692635e383d2192602480830193928290030181600087803b158015614bf957600080fd5b505af1158015614c0d573d6000803e3d6000fd5b505050506040513d6020811015614c2357600080fd5b50516001608060020a039081168252600160a060020a038a81166020808501919091524267ffffffffffffffff9081166040808701919091526000606096870181905260ff8981168c0163ffffffff168252600985529082902088518154958a015160ff199096169083161770ffffffffffffffffffffffffffffffff0019166101009590971694909402959095178355860151600192830180549688015160809098015173ffffffffffffffffffffffffffffffffffffffff1990971691909416177bffffffffffffffff0000000000000000000000000000000000000000191660a060020a96909116959095029490941760e060020a60ff02191660e060020a939092169290920217905501614b86565b6008805463ffffffff191661ffff871685810163ffffffff9081169290921790925560408051600160a060020a038b16815260ff8a166020820152808201939093529085166060830152517ff7ad76543f114c7bb00ff2cd992ff749d502ed5c0c6f87901ad48f6871fceca1916080908290030190a150505050505050565b600060078361ffff16815481101515614dca57fe5b6000918252602080832060088084049091015460079093166004026101000a90920463ffffffff9081168085526009835260408086205460ff168652600c90935291909320805461ffff19811661ffff91821660001901909116179055905490925060a060020a900416811415614e5d576008805477ffffffff0000000000000000000000000000000000000000191690555b63ffffffff81166000908152600960205260409020805470ffffffffffffffffffffffffffffffffff1916815560010180547cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690556007805461ffff8416908110614ec357fe5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff1660078461ffff16815481101515614efc57fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff16021790555060078261ffff16815481101515614f4257fe5b90600052602060002090600891828204019190066004026101000a81549063ffffffff0219169055505050565b600b546040805160001943014081524260208201527e0100000000000000000000000000000000000000000000000000000000000061ffff90931692909202828201526042820183905251908190036062019020919050565b600080600060078661ffff16815481101515614fe057fe5b6000918252602090912060088204015460079091166004026101000a900463ffffffff16915060019050600f60ff8516108015906150225750601460ff851611155b1561502b575060025b63ffffffff821660009081526010602052604090205460ff80831691161061507d5763ffffffff82166000908152601060205260408120805460ff8082168590031660ff1990911617905592506150e9565b6009600060078861ffff1681548110151561509457fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff16845283019390935260409091019020546000199690960195046001608060020a031692506150e98686614db5565b50509392505050565b60008060006060600080600080600860149054906101000a900463ffffffff1663ffffffff1660001415615128576151286143e4565b60085460a060020a900463ffffffff908116146151a55760085460a060020a900463ffffffff166000908152600960208190526040909120805470ffffffffffffffffffffffffffffffff00198116600a6001608060020a038e8116919091046101009384900482168101909116909202179091550297506151a9565b8897505b60408051601b8082526103808201909252909650866020820161036080388339019050509450600093505b8560ff168460ff1610156152ac57600c60ff851610806151f75750600e60ff8516115b8015615217575060ff84166000908152600c602052604081205461ffff16115b156152a1576001546040805160e060020a635e383d2102815260ff871660048201529051600160a060020a0390921691635e383d21916024808201926020929091908290030181600087803b15801561526f57600080fd5b505af1158015615283573d6000803e3d6000fd5b505050506040513d602081101561529957600080fd5b505196909601955b6001909301926151d4565b600092505b8560ff168360ff1610156153f557600c60ff851610806152d45750600e60ff8516115b80156152f4575060ff83166000908152600c602052604081205461ffff16115b156153ea5760ff83166000818152600c6020908152604080832054600154825160e060020a635e383d210281526004810196909652915161ffff909116946001608060020a038d1694600160a060020a0390931693635e383d219360248084019492938390030190829087803b15801561536d57600080fd5b505af1158015615381573d6000803e3d6000fd5b505050506040513d602081101561539757600080fd5b50518a026001608060020a03168115156153ad57fe5b046001608060020a03168115156153c057fe5b04858460ff168151811015156153d257fe5b6001608060020a039092166020928302909101909101525b6001909201916152b1565b5060005b600b5461ffff9081169082161015615562576009600060078361ffff1681548110151561542257fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff169150600c82108061546c5750600e60ff8316115b1561555a57846009600060078461ffff1681548110151561548957fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902054815160ff9091169081106154cc57fe5b906020019060200201516009600060078461ffff168154811015156154ed57fe5b60009182526020808320600883040154600790921660040261010090810a90920463ffffffff16845283019390935260409091019020805470ffffffffffffffffffffffffffffffff00198116908390046001608060020a03908116949094019093169091029190911790555b6001016153f9565b505050505050505050565b600b5460009081908190819061ffff1661558687614f6f565b81151561558f57fe5b600b549190069350600761ffff9182160616156155ad5760076155cb565b600b805461ffff160661ffff166000146155c857600b6155cb565b600d5b60ff1691508290505b61562a856009600060078561ffff168154811015156155ef57fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff16835282019290925260400190205460ff1661387e565b8015615694575033600160a060020a03166009600060078461ffff1681548110151561565257fe5b6000918252602080832060088304015460079092166004026101000a90910463ffffffff168352820192909252604001902060010154600160a060020a031614155b156156a1578093506156d4565b600b5461ffff90811690828401168115156156b857fe5b06905061ffff808216908416146156ce576155d4565b60001993505b50505092915050565b5060a05190565b63ffffffff81166000908152600a602052604081205460ff1615615752576040805160e560020a62461bcd02815260206004820152601260248201527f616c72656164792074656c65706f727465640000000000000000000000000000604482015290519081900360640190fd5b5063ffffffff81166000908152600a60209081526040808320805460ff19166001179055600990915290208054600560ff9190911611615801576040805160e560020a62461bcd028152602060048201526024808201527f647261676f6e7320646f206e6f74206e65656420746f2062652074656c65706f60448201527f7274656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b5461581390839061ffff16615980565b600b805461ffff8082166001908101821661ffff1993841617909355835460ff166000908152600c6020908152604091829020805480851690960190931694909316939093179055815163ffffffff8516815291517f663f46f5a2fd740de613966ad0391fbc9d840f82898698e6d7f16ba0ed126b3b9281900390910190a15050565b63ffffffff8216600081815260106020908152604091829020805460ff191660ff861690811790915582519384529083015280517f088ba7785fd329abbf01eaa732bad30e14b205b9fc8ab9378f9f5295731135559281900390910190a15050565b600080600160315b60056001608060020a0382161061597357846001608060020a0316836001608060020a0316111561593657806002019350615978565b9181019160286001608060020a0382161480159061595e5750806001608060020a0316600814155b1561596a576001820191505b60001901615900565b600593505b505050919050565b60075461ffff821610156159da578160078261ffff168154811015156159a257fe5b90600052602060002090600891828204019190066004026101000a81548163ffffffff021916908363ffffffff160217905550610b2a565b506007805460018101825560008290527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68860088204018054919092166004026101000a63ffffffff818102199092169390911602919091179055565b61014060405190810160405280600a906020820280388339509192915050565b5080546000825560070160089004906000526020600020908101906129029190615a9091905b80821115610e9a5760008155600101615a7c565b905600636f6e7472616374732063616e6e6f7420657865637574652074686973206d65a165627a7a7230582024fb9ce62e67c061cddce8f77ef450819e570b90c6d1314d8a2445db919382d70029

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c596bd09d652827b0106292d3e378d5938df4b12000000000000000000000000a54ddc7b3cce7fc8b1e3fa0256d0db80d2c10970000000000000000000000000a7bd9d58d22d5e35ec4a08083141e0340ea2ca93000000000000000000000000d28525ad63f337c86843d720dae921228e44f0ac000000000000000000000000ca1c217a2200b60dbd52e33c7cb1758db2b30a0e0000000000000000000000002a06579f0ab0f55995884222d8766ab10e6ac4bd

-----Decoded View---------------
Arg [0] : tptAddress (address): 0xC596bD09d652827b0106292D3e378D5938df4B12
Arg [1] : ndcAddress (address): 0xA54ddC7B3CcE7FC8b1E3Fa0256D0DB80D2c10970
Arg [2] : sklAddress (address): 0xA7BD9d58d22D5e35ec4a08083141E0340EA2cA93
Arg [3] : xperAddress (address): 0xD28525Ad63F337c86843d720dAE921228e44F0aC
Arg [4] : luckAddress (address): 0xCA1c217a2200b60DBD52e33C7Cb1758db2b30A0e
Arg [5] : _configAddress (address): 0x2A06579F0aB0F55995884222D8766ab10e6ac4bd

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000c596bd09d652827b0106292d3e378d5938df4b12
Arg [1] : 000000000000000000000000a54ddc7b3cce7fc8b1e3fa0256d0db80d2c10970
Arg [2] : 000000000000000000000000a7bd9d58d22d5e35ec4a08083141e0340ea2ca93
Arg [3] : 000000000000000000000000d28525ad63f337c86843d720dae921228e44f0ac
Arg [4] : 000000000000000000000000ca1c217a2200b60dbd52e33c7cb1758db2b30a0e
Arg [5] : 0000000000000000000000002a06579f0ab0f55995884222d8766ab10e6ac4bd


Swarm Source

bzzr://24fb9ce62e67c061cddce8f77ef450819e570b90c6d1314d8a2445db919382d7

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.