Sponsored Link:  Download the Monaco app for Android and iOS on Aug 31 - www.mona.co
Contract Overview | XJPCoin
ETH Balance: 0 Ether
ETH USD Value: $0
No Of Transactions: 40 txns
Token Tracker 0x39689fE671C01fcE173395f6BC45D4C332026666
  Latest 25 txns from a total Of 40 transactions View All

TxHash Age From To Value [TxFee]
0xe614194f6256dc674eed7c3bb5c6be269e47dcdbfc40009281297a3a43d3472f5 hrs 38 mins ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.001881516
0xecd00783c4bef8880f6c5968e7d4d62f070b934e94b18d885615dc31fa727d076 hrs 15 mins ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.001880172
0x8b2568ea368d408cbb5d6fd2bc3ac7a2ea71d02d7a5f2e44589868ae534aa3468 hrs 2 mins ago0x74a42e129a894249e57475970ed6bee2ff886a72  IN   XJPCoin0 Ether0.00125286
0x279bccc70bd5eac649d9516310c5f1e2f5d21618ed8379ee678ccc7c666fe54f8 hrs 4 mins ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00188286
0x711f8361e81ea78f8264e020642362338643c850a5c9598a2d29fa41265f886210 hrs 9 mins ago0x4d8bd3593628e3d5e056c2a5b204952fab0a3d96  IN   XJPCoin0 Ether0.001370133305
0x82f110444fe33e5503285756d7b36aaf960e4916aa9a41360b886ea727dafe6b10 hrs 11 mins ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.001881516
0x64b47c87143afc4af9fd298159c80a4f3b2cb90945b6be21dc6d2fda7f8b7f9f12 hrs 40 mins ago0x74a42e129a894249e57475970ed6bee2ff886a72  IN   XJPCoin0 Ether0.00125286
0x3cf053f42a9aeb626347bd74706b6e5f0a137c27bf7c4b5297119a194129893b12 hrs 44 mins ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00188286
0x0902678c0ea266e6efda63bcc54a16fcd10f780e4fec97ccb76e0aac3ebbc88d12 hrs 47 mins ago0xc4014217cabe92f5cd0f9cd631f0694422b510a6  IN   XJPCoin0 Ether0.001566516
0x2b4632dad0b87e06b76d1830d305f059075aab6a14f6d30fbc3e1b7cf893bc8e12 hrs 49 mins ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.001881516
0x4aba731fb327a00f059aa1783b8c29288ebb244adb3f38398703e1ba9e60ee3214 hrs 22 mins ago0xdd1bf60a430bdba445b3d21e5e4be7c22d1ef917  IN   XJPCoin0 Ether0.0014932
0x3a8f4076ac24dbbf911656d4abf971ab1c6a7948723396028ec4020d9cc26d9914 hrs 23 mins ago0xa65e9fec4f892ef6e9fe3888ed9b0eb6aab1f0fd  IN   XJPCoin0 Ether0.001426578203
0x85c12f4fc4782d8c87c15c889d15c116cafa3357fe71546dc368a0b6cf32af4321 hrs 6 mins ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.00156786
0x933a6291d2c7b684582901a9e8c96816435701d4e176666b1453c77dbf0c1ec121 hrs 10 mins ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.001880172
0x502d49cdd70a286591c54585e284de5a4695479ef1276a7baf2472426cebb58521 hrs 53 mins ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.001881516
0xa579d10072d248c26560ba072f6d52f15bef39cd43ccc33699412aee749596ad22 hrs 19 mins ago0x59a7cb2127b69dd0ad79227c570eb0f2f6824a30  IN   XJPCoin0 Ether0.001311112
0x8c273074bdb47813c96768b60d893fab77f726f764b5fc1379cd5780b48af95522 hrs 21 mins ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.001881516
0xb4b3885f1552ad46808ad9d835dd570cea4fb29c347b0cc3a55f0ef8673d538a22 hrs 21 mins ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.001881516
0x1d14af271870204c44bdcaf2d43d79de9a90532e67d816aaa0fa0ab2c57ab36b23 hrs 17 mins ago0x488468c3009b94e4c0e064f047839e5faf3f7295  IN   XJPCoin0 Ether0.00164252
0x23b30bf62b1cbe8771cad51febfc484480687240e2a312f22a096de20eb85c3923 hrs 19 mins ago0x007d491ae92fd2cbaa456c85711dfb73ec895fb3  IN   XJPCoin0 Ether0.001971112
0x8c8e9601d67117c0217f71d425d3168745677dc2305a37b31bd9b2f59e16caf523 hrs 20 mins ago0x007d491ae92fd2cbaa456c85711dfb73ec895fb3  IN   XJPCoin0 Ether0.005646872343
0xf3058051f74d4632eb3e4aee9b72f97f2c2e383a6854d6e682269f06cba0fff71 day 5 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.001881516
0x610a16c779581fa3c3f46d6a0cc75fc6bc611f1f00b22663d399b66fb59009741 day 6 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.001881516
0xb9e85375e4d95eee310dda2c1a1680a9870f3e4ceccf504a39c742313b7d39dc1 day 6 hrs ago0xa1e478d80db1db2e7e71112bb876334ff829c1cc  IN   XJPCoin0 Ether0.001881516
0xdda8472e3fc0e8aa5ff001bac5596058dfea0435decf71a280cbcb1cd7a364871 day 8 hrs ago0xdd1bf60a430bdba445b3d21e5e4be7c22d1ef917  IN   XJPCoin0 Ether0.00242082
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
View All
ParentTxHash Block Age From To Value
Warning: The compiled contract might be susceptible to DelegateCallReturnValue (low-severity), ECRecoverMalformedInput (medium-severity), SkipEmptyStringLiteral (low-severity) Solidity compiler bugs.

Contract Source Code Verified
Contract Name: IkuraController
Compiler Version: v0.4.11+commit.68ef5810
Optimization Enabled: No
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts
contract DSAuthority {
    function canCall(
        address src, address dst, bytes4 sig
    ) constant returns (bool);
}

contract DSAuthEvents {
    event LogSetAuthority (address indexed authority);
    event LogSetOwner     (address indexed owner);
}

contract DSAuth is DSAuthEvents {
    DSAuthority  public  authority;
    address      public  owner;

    function DSAuth() {
        owner = msg.sender;
        LogSetOwner(msg.sender);
    }

    function setOwner(address owner_)
        auth
    {
        owner = owner_;
        LogSetOwner(owner);
    }

    function setAuthority(DSAuthority authority_)
        auth
    {
        authority = authority_;
        LogSetAuthority(authority);
    }

    modifier auth {
        assert(isAuthorized(msg.sender, msg.sig));
        _;
    }

    function isAuthorized(address src, bytes4 sig) internal returns (bool) {
        if (src == address(this)) {
            return true;
        } else if (src == owner) {
            return true;
        } else if (authority == DSAuthority(0)) {
            return false;
        } else {
            return authority.canCall(src, this, sig);
        }
    }

    function assert(bool x) internal {
        if (!x) throw;
    }
}





contract ERC20 {
    function totalSupply() constant returns (uint supply);
    function balanceOf( address who ) constant returns (uint value);
    function allowance( address owner, address spender ) constant returns (uint _allowance);

    function transfer( address to, uint value) returns (bool ok);
    function transferFrom( address from, address to, uint value) returns (bool ok);
    function approve( address spender, uint value ) returns (bool ok);

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

contract DSMath {
    

    function add(uint256 x, uint256 y) constant internal returns (uint256 z) {
        assert((z = x + y) >= x);
    }

    function sub(uint256 x, uint256 y) constant internal returns (uint256 z) {
        assert((z = x - y) <= x);
    }

    function mul(uint256 x, uint256 y) constant internal returns (uint256 z) {
        z = x * y;
        assert(x == 0 || z / x == y);
    }

    function div(uint256 x, uint256 y) constant internal returns (uint256 z) {
        z = x / y;
    }

    function min(uint256 x, uint256 y) constant internal returns (uint256 z) {
        return x <= y ? x : y;
    }
    function max(uint256 x, uint256 y) constant internal returns (uint256 z) {
        return x >= y ? x : y;
    }



    function hadd(uint128 x, uint128 y) constant internal returns (uint128 z) {
        assert((z = x + y) >= x);
    }

    function hsub(uint128 x, uint128 y) constant internal returns (uint128 z) {
        assert((z = x - y) <= x);
    }

    function hmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = x * y;
        assert(x == 0 || z / x == y);
    }

    function hdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = x / y;
    }

    function hmin(uint128 x, uint128 y) constant internal returns (uint128 z) {
        return x <= y ? x : y;
    }
    function hmax(uint128 x, uint128 y) constant internal returns (uint128 z) {
        return x >= y ? x : y;
    }



    function imin(int256 x, int256 y) constant internal returns (int256 z) {
        return x <= y ? x : y;
    }
    function imax(int256 x, int256 y) constant internal returns (int256 z) {
        return x >= y ? x : y;
    }

    /*
    WAD math
     */

    uint128 constant WAD = 10 ** 18;

    function wadd(uint128 x, uint128 y) constant internal returns (uint128) {
        return hadd(x, y);
    }

    function wsub(uint128 x, uint128 y) constant internal returns (uint128) {
        return hsub(x, y);
    }

    function wmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * y + WAD / 2) / WAD);
    }

    function wdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * WAD + y / 2) / y);
    }

    function wmin(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmin(x, y);
    }
    function wmax(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmax(x, y);
    }

    /*
    RAY math
     */

    uint128 constant RAY = 10 ** 27;

    function radd(uint128 x, uint128 y) constant internal returns (uint128) {
        return hadd(x, y);
    }

    function rsub(uint128 x, uint128 y) constant internal returns (uint128) {
        return hsub(x, y);
    }

    function rmul(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * y + RAY / 2) / RAY);
    }

    function rdiv(uint128 x, uint128 y) constant internal returns (uint128 z) {
        z = cast((uint256(x) * RAY + y / 2) / y);
    }

    function rpow(uint128 x, uint64 n) constant internal returns (uint128 z) {
        
        
        
        
        
        
        
        
        
        
        
        
        
        

        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }

    function rmin(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmin(x, y);
    }
    function rmax(uint128 x, uint128 y) constant internal returns (uint128) {
        return hmax(x, y);
    }

    function cast(uint256 x) constant internal returns (uint128 z) {
        assert((z = uint128(x)) == x);
    }

}

contract IkuraStorage is DSMath, DSAuth {
  
  address[] ownerAddresses;

  
  mapping(address => uint) coinBalances;

  
  mapping(address => uint) tokenBalances;

  
  mapping(address => mapping (address => uint)) coinAllowances;

  
  uint _totalSupply = 0;

  
  
  
  uint _transferFeeRate = 500;

  
  
  
  uint8 _transferMinimumFee = 5;

  address tokenAddress;
  address multiSigAddress;
  address authorityAddress;

  
  
  
  function IkuraStorage() DSAuth() {
    /*address controllerAddress = 0x34c5605A4Ef1C98575DB6542179E55eE1f77A188;
    owner = controllerAddress;
    LogSetOwner(controllerAddress);*/
  }

  function changeToken(address tokenAddress_) auth {
    tokenAddress = tokenAddress_;
  }

  function changeAssociation(address multiSigAddress_) auth {
    multiSigAddress = multiSigAddress_;
  }

  function changeAuthority(address authorityAddress_) auth {
    authorityAddress = authorityAddress_;
  }

  function totalSupply() auth returns (uint) {
    return _totalSupply;
  }
  function addTotalSupply(uint amount) auth {
    _totalSupply = add(_totalSupply, amount);
  }
  function subTotalSupply(uint amount) auth {
    _totalSupply = sub(_totalSupply, amount);
  }
  function transferFeeRate() auth returns (uint) {
    return _transferFeeRate;
  }

  function setTransferFeeRate(uint newTransferFeeRate) auth returns (bool) {
    _transferFeeRate = newTransferFeeRate;

    return true;
  }

  
  
  

  function transferMinimumFee() auth returns (uint8) {
    return _transferMinimumFee;
  }

  function setTransferMinimumFee(uint8 newTransferMinimumFee) auth {
    _transferMinimumFee = newTransferMinimumFee;
  }

  function addOwnerAddress(address addr) internal returns (bool) {
    ownerAddresses.push(addr);

    return true;
  }

  function removeOwnerAddress(address addr) internal returns (bool) {
    uint i = 0;

    while (ownerAddresses[i] != addr) { i++; }

    while (i < ownerAddresses.length - 1) {
      ownerAddresses[i] = ownerAddresses[i + 1];
      i++;
    }

    ownerAddresses.length--;

    return true;
  }

  function primaryOwner() auth returns (address) {
    return ownerAddresses[0];
  }

  function isOwnerAddress(address addr) auth returns (bool) {
    for (uint i = 0; i < ownerAddresses.length; i++) {
      if (ownerAddresses[i] == addr) return true;
    }

    return false;
  }

  function numOwnerAddress() auth constant returns (uint) {
    return ownerAddresses.length;
  }

  
  
  

  function coinBalance(address addr) auth returns (uint) {
    return coinBalances[addr];
  }

  function addCoinBalance(address addr, uint amount) auth returns (bool) {
    coinBalances[addr] = add(coinBalances[addr], amount);

    return true;
  }

  function subCoinBalance(address addr, uint amount) auth returns (bool) {
    coinBalances[addr] = sub(coinBalances[addr], amount);

    return true;
  }

  
  
  

  function tokenBalance(address addr) auth returns (uint) {
    return tokenBalances[addr];
  }

  function addTokenBalance(address addr, uint amount) auth returns (bool) {
    tokenBalances[addr] = add(tokenBalances[addr], amount);

    if (tokenBalances[addr] > 0 && !isOwnerAddress(addr)) {
      addOwnerAddress(addr);
    }

    return true;
  }

  function subTokenBalance(address addr, uint amount) auth returns (bool) {
    tokenBalances[addr] = sub(tokenBalances[addr], amount);

    if (tokenBalances[addr] <= 0) {
      removeOwnerAddress(addr);
    }

    return true;
  }

  
  
  

  function coinAllowance(address owner_, address spender) auth returns (uint) {
    return coinAllowances[owner_][spender];
  }

  function addCoinAllowance(address owner_, address spender, uint amount) auth returns (bool) {
    coinAllowances[owner_][spender] = add(coinAllowances[owner_][spender], amount);

    return true;
  }

  function subCoinAllowance(address owner_, address spender, uint amount) auth returns (bool) {
    coinAllowances[owner_][spender] = sub(coinAllowances[owner_][spender], amount);

    return true;
  }

  function setCoinAllowance(address owner_, address spender, uint amount) auth returns (bool) {
    coinAllowances[owner_][spender] = amount;

    return true;
  }

  function isAuthorized(address src, bytes4 sig) internal returns (bool) {
    sig; 

    return  src == address(this) ||
            src == owner ||
            src == tokenAddress ||
            src == authorityAddress ||
            src == multiSigAddress;
  }
}

contract IkuraTokenEvent {
  /** オーナーがdJPYを鋳造した際に発火するイベント */
  event IkuraMint(address indexed owner, uint);

  /** オーナーがdJPYを消却した際に発火するイベント */
  event IkuraBurn(address indexed owner, uint);

  /** トークンの移動時に発火するイベント */
  event IkuraTransferToken(address indexed from, address indexed to, uint value);

  /** 手数料が発生したときに発火するイベント */
  event IkuraTransferFee(address indexed from, address indexed to, address indexed owner, uint value);

  event IkuraTransfer(address indexed from, address indexed to, uint value);

  /** 送金許可イベント */
  event IkuraApproval(address indexed owner, address indexed spender, uint value);
}

contract IkuraAssociation is DSMath, DSAuth {
  
  
  

  
  uint public confirmTotalTokenThreshold = 50;

  
  
  

  
  IkuraStorage _storage;
  IkuraToken _token;

  
  Proposal[] mintProposals;
  Proposal[] burnProposals;
  Proposal[] transferMinimumFeeProposals;
  Proposal[] transferFeeRateProposals;

  mapping (bytes32 => Proposal[]) proposals;

  struct Proposal {
    address proposer;                     
    bytes32 digest;                       
    bool executed;                        
    uint createdAt;                       
    uint expireAt;                        
    address[] confirmers;                 
    uint amount;                          
    uint8 transferMinimumFee;             
    uint transferFeeRate;                 
  }

  
  
  

  event MintProposalAdded(uint proposalId, address proposer, uint amount);
  event MintConfirmed(uint proposalId, address confirmer, uint amount);
  event MintExecuted(uint proposalId, address proposer, uint amount);

  event BurnProposalAdded(uint proposalId, address proposer, uint amount);
  event BurnConfirmed(uint proposalId, address confirmer, uint amount);
  event BurnExecuted(uint proposalId, address proposer, uint amount);

  event TransferMinimumFeeProposalAdded(uint proposalId, address proposer, uint8 transferMinimumFee);
  event TransferMinimumFeeConfirmed(uint proposalId, address confirmer, uint8 transferMinimumFee);
  event TransferMinimumFeeExecuted(uint proposalId, address proposer, uint8 transferMinimumFee);

  event TransferFeeRateProposalAdded(uint proposalId, address proposer, uint transferFeeRate);
  event TransferFeeRateConfirmed(uint proposalId, address confirmer, uint transferFeeRate);
  event TransferFeeRateExecuted(uint proposalId, address proposer, uint transferFeeRate);

  function IkuraAssociation() {
    proposals[sha3('mint')] = mintProposals;
    proposals[sha3('burn')] = burnProposals;
    proposals[sha3('transferMinimumFee')] = transferMinimumFeeProposals;
    proposals[sha3('transferFeeRate')] = transferFeeRateProposals;

  }

  function changeStorage(IkuraStorage newStorage) auth returns (bool) {
    _storage = newStorage;

    return true;
  }

  function changeToken(IkuraToken token_) auth returns (bool) {
    _token = token_;

    return true;
  }

  function newProposal(bytes32 type_, address proposer, uint amount, uint8 transferMinimumFee, uint transferFeeRate, bytes transationBytecode) returns (uint) {
    uint proposalId = proposals[type_].length++;
    Proposal proposal = proposals[type_][proposalId];
    proposal.proposer = proposer;
    proposal.amount = amount;
    proposal.transferMinimumFee = transferMinimumFee;
    proposal.transferFeeRate = transferFeeRate;
    proposal.digest = sha3(proposer, amount, transationBytecode);
    proposal.executed = false;
    proposal.createdAt = now;
    proposal.expireAt = proposal.createdAt + 86400;

    
    
    if (type_ == sha3('mint')) MintProposalAdded(proposalId, proposer, amount);
    if (type_ == sha3('burn')) BurnProposalAdded(proposalId, proposer, amount);
    if (type_ == sha3('transferMinimumFee')) TransferMinimumFeeProposalAdded(proposalId, proposer, transferMinimumFee);
    if (type_ == sha3('transferFeeRate')) TransferFeeRateProposalAdded(proposalId, proposer, transferFeeRate);

    
    confirmProposal(type_, proposer, proposalId);

    return proposalId;
  }

  function confirmProposal(bytes32 type_, address confirmer, uint proposalId) {
    Proposal proposal = proposals[type_][proposalId];

    
    if (hasConfirmed(type_, confirmer, proposalId)) throw;

    
    proposal.confirmers.push(confirmer);

    
    
    if (type_ == sha3('mint')) MintConfirmed(proposalId, confirmer, proposal.amount);
    if (type_ == sha3('burn')) BurnConfirmed(proposalId, confirmer, proposal.amount);
    if (type_ == sha3('transferMinimumFee')) TransferMinimumFeeConfirmed(proposalId, confirmer, proposal.transferMinimumFee);
    if (type_ == sha3('transferFeeRate')) TransferFeeRateConfirmed(proposalId, confirmer, proposal.transferFeeRate);

    if (isProposalExecutable(type_, proposalId, proposal.proposer, '')) {
      proposal.executed = true;

      
      
      if (type_ == sha3('mint')) executeMintProposal(proposalId);
      if (type_ == sha3('burn')) executeBurnProposal(proposalId);
      if (type_ == sha3('transferMinimumFee')) executeUpdateTransferMinimumFeeProposal(proposalId);
      if (type_ == sha3('transferFeeRate')) executeUpdateTransferFeeRateProposal(proposalId);
    }
  }

  function hasConfirmed(bytes32 type_, address addr, uint proposalId) returns (bool) {
    Proposal proposal = proposals[type_][proposalId];
    uint length = proposal.confirmers.length;

    for (uint i = 0; i < length; i++) {
      if (proposal.confirmers[i] == addr) return true;
    }

    return false;
  }

  function confirmedTotalToken(bytes32 type_, uint proposalId) returns (uint) {
    Proposal proposal = proposals[type_][proposalId];
    uint length = proposal.confirmers.length;
    uint total = 0;

    for (uint i = 0; i < length; i++) {
      total = add(total, _storage.tokenBalance(proposal.confirmers[i]));
    }

    return total;
  }

  function proposalExpireAt(bytes32 type_, uint proposalId) returns (uint) {
    Proposal proposal = proposals[type_][proposalId];
    return proposal.expireAt;
  }

  function isProposalExecutable(bytes32 type_, uint proposalId, address proposer, bytes transactionBytecode) returns (bool) {
    Proposal proposal = proposals[type_][proposalId];

    
    if (_storage.numOwnerAddress() < 2) {
      return true;
    }

    return  proposal.digest == sha3(proposer, proposal.amount, transactionBytecode) &&
            isProposalNotExpired(type_, proposalId) &&
            div(mul(100, confirmedTotalToken(type_, proposalId)), _storage.totalSupply()) > confirmTotalTokenThreshold;
  }

  function numberOfProposals(bytes32 type_) constant returns (uint) {
    return proposals[type_].length;
  }

  function numberOfActiveProposals(bytes32 type_) constant returns (uint) {
    uint numActiveProposal = 0;

    for(uint i = 0; i < proposals[type_].length; i++) {
      Proposal proposal = proposals[type_][i];

      if (isProposalNotExpired(type_, i)) {
        numActiveProposal++;
      }
    }

    return numActiveProposal;
  }

  function isProposalNotExpired(bytes32 type_, uint proposalId) internal returns (bool) {
    Proposal proposal = proposals[type_][proposalId];

    return  !proposal.executed &&
            now < proposal.expireAt;
  }

  function executeMintProposal(uint proposalId) internal {
    Proposal proposal = proposals[sha3('mint')][proposalId];

    
    if (proposal.amount <= 0) throw;

    MintExecuted(proposalId, proposal.proposer, proposal.amount);

    
    _storage.addTotalSupply(proposal.amount);
    _storage.addCoinBalance(proposal.proposer, proposal.amount);
    _storage.addTokenBalance(proposal.proposer, proposal.amount);
  }

  function executeBurnProposal(uint proposalId) internal {
    Proposal proposal = proposals[sha3('burn')][proposalId];

    
    if (proposal.amount <= 0) throw;
    if (_storage.coinBalance(proposal.proposer) < proposal.amount) throw;
    if (_storage.tokenBalance(proposal.proposer) < proposal.amount) throw;

    BurnExecuted(proposalId, proposal.proposer, proposal.amount);

    
    _storage.subTotalSupply(proposal.amount);
    _storage.subCoinBalance(proposal.proposer, proposal.amount);
    _storage.subTokenBalance(proposal.proposer, proposal.amount);
  }

  function executeUpdateTransferMinimumFeeProposal(uint proposalId) internal {
    Proposal proposal = proposals[sha3('transferMinimumFee')][proposalId];

    if (proposal.transferMinimumFee < 0) throw;

    TransferMinimumFeeExecuted(proposalId, proposal.proposer, proposal.transferMinimumFee);

    _storage.setTransferMinimumFee(proposal.transferMinimumFee);
  }

  function executeUpdateTransferFeeRateProposal(uint proposalId) internal {
    Proposal proposal = proposals[sha3('transferFeeRate')][proposalId];

    if (proposal.transferFeeRate < 0) throw;

    TransferFeeRateExecuted(proposalId, proposal.proposer, proposal.transferFeeRate);

    _storage.setTransferFeeRate(proposal.transferFeeRate);
  }

  function isAuthorized(address src, bytes4 sig) internal returns (bool) {
    sig; 

    return  src == address(this) ||
            src == owner ||
            src == address(_token);
  }
}
library ProposalLibrary {
  
  
  

  
  struct Entity {
    IkuraStorage _storage;
    IkuraAssociation _association;
  }

  function changeStorage(Entity storage self, address storage_) internal {
    self._storage = IkuraStorage(storage_);
  }

  function changeAssociation(Entity storage self, address association_) internal {
    self._association = IkuraAssociation(association_);
  }

  function updateTransferMinimumFee(Entity storage self, address sender, uint8 fee) returns (bool) {
    if (fee < 0) throw;

    self._association.newProposal(sha3('transferMinimumFee'), sender, 0, fee, 0, '');

    return true;
  }

  function updateTransferFeeRate(Entity storage self, address sender, uint rate) returns (bool) {
    if (rate < 0) throw;

    self._association.newProposal(sha3('transferFeeRate'), sender, 0, 0, rate, '');

    return true;
  }

  function mint(Entity storage self, address sender, uint amount) returns (bool) {
    if (amount <= 0) throw;

    self._association.newProposal(sha3('mint'), sender, amount, 0, 0, '');

    return true;
  }

  function burn(Entity storage self, address sender, uint amount) returns (bool) {
    if (amount <= 0) throw;
    if (self._storage.coinBalance(sender) < amount) throw;
    if (self._storage.tokenBalance(sender) < amount) throw;

    self._association.newProposal(sha3('burn'), sender, amount, 0, 0, '');

    return true;
  }

  function confirmProposal(Entity storage self, address sender, bytes32 type_, uint proposalId) {
    self._association.confirmProposal(type_, sender, proposalId);
  }

  function numberOfProposals(Entity storage self, bytes32 type_) constant returns (uint) {
    return self._association.numberOfProposals(type_);
  }
}

contract IkuraToken is IkuraTokenEvent, DSMath, DSAuth {
  
  
  

  /*using ProposalLibrary for ProposalLibrary.Entity;
  ProposalLibrary.Entity proposalEntity;*/

  
  
  

  
  IkuraStorage _storage;
  IkuraAssociation _association;

  function IkuraToken() DSAuth() {
    
    
    
    /*address controllerAddress = 0x34c5605A4Ef1C98575DB6542179E55eE1f77A188;
    owner = controllerAddress;
    LogSetOwner(controllerAddress);*/
  }

  function totalSupply(address sender) auth constant returns (uint) {
    sender; 

    return _storage.totalSupply();
  }

  function balanceOf(address sender, address addr) auth constant returns (uint) {
    sender; 

    return _storage.coinBalance(addr);
  }

  function transfer(address sender, address to, uint amount) auth returns (bool success) {
    uint fee = transferFee(sender, sender, to, amount);

    if (_storage.coinBalance(sender) < add(amount, fee)) throw;
    if (amount <= 0) throw;

    
    address owner = selectOwnerAddressForTransactionFee(sender);

    
    _storage.subCoinBalance(sender, add(amount, fee));

    
    _storage.addCoinBalance(to, amount);

    
    _storage.addCoinBalance(owner, fee);

    
    IkuraTransfer(sender, to, amount);
    IkuraTransferFee(sender, to, owner, fee);

    return true;
  }

  function transferFrom(address sender, address from, address to, uint amount) auth returns (bool success) {
    uint fee = transferFee(sender, from, to, amount);

    if (_storage.coinBalance(from) < amount) throw;
    if (_storage.coinAllowance(from, sender) < amount) throw;
    if (amount <= 0) throw;
    if (add(_storage.coinBalance(to), amount) <= _storage.coinBalance(to)) throw;
    if (_storage.coinBalance(sender) < fee) throw;

    
    address owner = selectOwnerAddressForTransactionFee(sender);

    
    _storage.subCoinBalance(sender, fee);

    
    _storage.subCoinBalance(from, amount);

    
    _storage.subCoinAllowance(from, sender, amount);

    
    _storage.addCoinBalance(to, amount);

    
    _storage.addCoinBalance(owner, fee);

    
    IkuraTransfer(from, to, amount);

    return true;
  }

  function approve(address sender, address spender, uint amount) auth returns (bool success) {
    _storage.setCoinAllowance(sender, spender, amount);

    
    IkuraApproval(sender, spender, amount);

    return true;
  }


  function allowance(address sender, address owner, address spender) auth constant returns (uint remaining) {
    sender; 

    return _storage.coinAllowance(owner, spender);
  }

  
  
  


  function tokenBalanceOf(address sender, address owner) auth constant returns (uint balance) {
    sender; 

    return _storage.tokenBalance(owner);
  }


  function transferToken(address sender, address to, uint amount) auth returns (bool success) {
    if (_storage.tokenBalance(sender) < amount ) throw;
    if (amount <= 0) throw;
    if (add(_storage.tokenBalance(to), amount) <= _storage.tokenBalance(to)) throw;

    _storage.subTokenBalance(sender, amount);
    _storage.addTokenBalance(to, amount);

    IkuraTransferToken(sender, to, amount);

    return true;
  }


  function transferFeeRate(address sender) auth constant returns (uint) {
    sender; 

    return _storage.transferFeeRate();
  }


  function transferMinimumFee(address sender) auth constant returns (uint8) {
    sender; 

    return _storage.transferMinimumFee();
  }


  function transferFee(address sender, address from, address to, uint amount) auth returns (uint) {
    from; to; 

    uint rate = transferFeeRate(sender);
    uint denominator = 1000000; 
    uint numerator = mul(amount, rate);

    uint fee = div(numerator, denominator);
    uint remainder = sub(numerator, mul(denominator, fee));

    
    if (remainder > 0) {
      fee++;
    }

    if (fee < transferMinimumFee(sender)) {
      fee = transferMinimumFee(sender);
    }

    return fee;
  }


  function updateTransferMinimumFee(address sender, uint8 fee) auth returns (bool) {
    if (fee < 0) throw;

    _association.newProposal(sha3('transferMinimumFee'), sender, 0, fee, 0, '');
    return true;

    /*return proposalEntity.updateTransferMinimumFee(sender, fee);*/
  }


  function updateTransferFeeRate(address sender, uint rate) auth returns (bool) {
    if (rate < 0) throw;

    _association.newProposal(sha3('transferFeeRate'), sender, 0, 0, rate, '');
    return true;

    /*return proposalEntity.updateTransferFeeRate(sender, rate);*/
  }


  function selectOwnerAddressForTransactionFee(address sender) auth returns (address) {
    sender; 

    return _storage.primaryOwner();
  }

  function mint(address sender, uint amount) auth returns (bool) {
    if (amount <= 0) throw;

    _association.newProposal(sha3('mint'), sender, amount, 0, 0, '');

    /*return proposalEntity.mint(sender, amount);*/
  }


  function burn(address sender, uint amount) auth returns (bool) {
    if (amount <= 0) throw;
    if (_storage.coinBalance(sender) < amount) throw;
    if (_storage.tokenBalance(sender) < amount) throw;

    _association.newProposal(sha3('burn'), sender, amount, 0, 0, '');
    /*return proposalEntity.burn(sender, amount);*/
  }

  function confirmProposal(address sender, bytes32 type_, uint proposalId) auth {
    _association.confirmProposal(type_, sender, proposalId);
    /*proposalEntity.confirmProposal(sender, type_, proposalId);*/
  }


  function numberOfProposals(bytes32 type_) constant returns (uint) {
    return _association.numberOfProposals(type_);
    /*return proposalEntity.numberOfProposals(type_);*/
  }


  function changeAssociation(address association_) auth returns (bool) {
    _association = IkuraAssociation(association_);
    /*proposalEntity.changeAssociation(_association);*/

    return true;
  }


  function changeStorage(address storage_) auth returns (bool) {
    _storage = IkuraStorage(storage_);
    /*proposalEntity.changeStorage(_storage);*/

    return true;
  }


  function logicVersion(address sender) auth constant returns (uint) {
    sender; 

    return 1;
  }
}


contract IkuraAuthority is DSAuthority, DSAuth {
  
  IkuraStorage tokenStorage;

  
  
  mapping(bytes4 => bool) actionsWithToken;

  
  mapping(bytes4 => bool) actionsForbidden;

  
  
  
  function IkuraAuthority() DSAuth() {
    /*address controllerAddress = 0x34c5605A4Ef1C98575DB6542179E55eE1f77A188;
    owner = controllerAddress;
    LogSetOwner(controllerAddress);*/
  }


  function changeStorage(address storage_) auth {
    tokenStorage = IkuraStorage(storage_);

    
    actionsWithToken[stringToSig('mint(uint256)')] = true;
    actionsWithToken[stringToSig('burn(uint256)')] = true;
    actionsWithToken[stringToSig('updateTransferMinimumFee(uint8)')] = true;
    actionsWithToken[stringToSig('updateTransferFeeRate(uint256)')] = true;
    actionsWithToken[stringToSig('confirmProposal(string, uint256)')] = true;
    actionsWithToken[stringToSig('numberOfProposals(string)')] = true;

    
    actionsForbidden[stringToSig('forbiddenAction()')] = true;
  }

  function canCall(address src, address dst, bytes4 sig) constant returns (bool) {
    
    if (actionsWithToken[sig]) return canCallWithAssociation(src, dst);

    
    if (actionsForbidden[sig]) return canCallWithNoOne();

    
    return canCallDefault(src);
  }

  function canCallDefault(address src) internal constant returns (bool) {
    return tokenStorage.isOwnerAddress(src);
  }


  function canCallWithAssociation(address src, address dst) internal returns (bool) {
    
    dst;

    return tokenStorage.isOwnerAddress(src) &&
           (tokenStorage.numOwnerAddress() == 1 || tokenStorage.tokenBalance(src) > 0);
  }


  function canCallWithNoOne() internal constant returns (bool) {
    return false;
  }


  function stringToSig(string str) internal constant returns (bytes4) {
    return bytes4(sha3(str));
  }
}


contract IkuraController is ERC20, DSAuth {
  
  
  

  
  string public name = "XJP 0.6.0";

  
  string public constant symbol = "XJP";

  
  uint8 public constant decimals = 0;

  
  
  

  
  
  IkuraToken private token;

  
  IkuraStorage private tokenStorage;

  
  IkuraAuthority private authority;

  
  IkuraAssociation private association;

  
  
  

  function totalSupply() constant returns (uint) {
    return token.totalSupply(msg.sender);
  }

  function balanceOf(address addr) constant returns (uint) {
    return token.balanceOf(msg.sender, addr);
  }

  function transfer(address to, uint amount) returns (bool) {
    if (token.transfer(msg.sender, to, amount)) {
      Transfer(msg.sender, to, amount);

      return true;
    } else {
      return false;
    }
  }

  function transferFrom(address from, address to, uint amount) returns (bool) {
    if (token.transferFrom(msg.sender, from, to, amount)) {
      Transfer(from, to, amount);

      return true;
    } else {
      return false;
    }
  }

  function approve(address spender, uint amount) returns (bool) {
    if (token.approve(msg.sender, spender, amount)) {
      Approval(msg.sender, spender, amount);

      return true;
    } else {
      return false;
    }
  }

  function allowance(address addr, address spender) constant returns (uint) {
    return token.allowance(msg.sender, addr, spender);
  }

  
  
  

  function tokenBalanceOf(address addr) constant returns (uint) {
    return token.tokenBalanceOf(msg.sender, addr);
  }

  function transferToken(address to, uint amount) returns (bool) {
    return token.transferToken(msg.sender, to, amount);
  }

  function transferFeeRate() constant returns (uint) {
    return token.transferFeeRate(msg.sender);
  }

  function transferMinimumFee() constant returns (uint8) {
    return token.transferMinimumFee(msg.sender);
  }

  function transferFee(address from, address to, uint amount) returns (uint) {
    return token.transferFee(msg.sender, from, to, amount);
  }

  

  function updateTransferMinimumFee(uint8 minimumFee) auth returns (bool) {
    return token.updateTransferMinimumFee(msg.sender, minimumFee);
  }

  function updateTransferFeeRate(uint feeRate) auth returns (bool) {
    return token.updateTransferFeeRate(msg.sender, feeRate);
  }

  function mint(uint amount) auth returns (bool) {
    return token.mint(msg.sender, amount);
  }

  function burn(uint amount) auth returns (bool) {
    return token.burn(msg.sender, amount);
  }

  function isOwner(address addr) auth returns (bool) {
    return tokenStorage.isOwnerAddress(addr);
  }


  function confirmProposal(string type_, uint proposalId) auth {
    token.confirmProposal(msg.sender, sha3(type_), proposalId);
  }

  function numOwnerAddress() auth constant returns (uint) {
    return tokenStorage.numOwnerAddress();
  }


  function numberOfProposals(string type_) auth constant returns (uint) {
    return token.numberOfProposals(sha3(type_));
  }

  
  
  


  function setup(address storageAddress, address tokenAddress, address authorityAddress, address associationAddress) auth {
    changeStorage(storageAddress);
    changeToken(tokenAddress);
    changeAuthority(authorityAddress);
    changeAssociation(associationAddress);
  }


  function changeToken(address tokenAddress) auth {
    
    token = IkuraToken(tokenAddress);

    
    tokenStorage.changeToken(token);
    token.changeStorage(tokenStorage);

    
    if (association != address(0)) {
      association.changeToken(token);
      token.changeAssociation(association);
    }
  }

  function changeStorage(address storageAddress) auth {
    
    tokenStorage = IkuraStorage(storageAddress);
  }


  function changeAuthority(address authorityAddress) auth {
    
    authority = IkuraAuthority(authorityAddress);
    setAuthority(authority);

    
    authority.changeStorage(tokenStorage);
    tokenStorage.changeAuthority(authority);
  }

  function changeAssociation(address associationAddress) auth {
    
    association = IkuraAssociation(associationAddress);

    
    association.changeStorage(tokenStorage);
    tokenStorage.changeAssociation(association);

    
    if (token != address(0)) {
      association.changeToken(token);
      token.changeAssociation(association);
    }
  }


  function forbiddenAction() auth returns (bool) {
    return true;
  }

 
  function logicVersion() constant returns (uint) {
    return token.logicVersion(msg.sender);
  }


  function isAuthorized(address src, bytes4 sig) internal returns (bool) {
    return  src == address(this) ||
            src == owner ||
            authority.canCall(src, this, sig);
  }
}

  Contract ABI  
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferToken","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"authorityAddress","type":"address"}],"name":"changeAuthority","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"owner_","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"logicVersion","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"transferFeeRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"type_","type":"string"},{"name":"proposalId","type":"uint256"}],"name":"confirmProposal","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"feeRate","type":"uint256"}],"name":"updateTransferFeeRate","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"storageAddress","type":"address"},{"name":"tokenAddress","type":"address"},{"name":"authorityAddress","type":"address"},{"name":"associationAddress","type":"address"}],"name":"setup","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"tokenAddress","type":"address"}],"name":"changeToken","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"authority_","type":"address"}],"name":"setAuthority","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"numOwnerAddress","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"transferMinimumFee","outputs":[{"name":"","type":"uint8"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"forbiddenAction","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"associationAddress","type":"address"}],"name":"changeAssociation","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"authority","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"storageAddress","type":"address"}],"name":"changeStorage","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"minimumFee","type":"uint8"}],"name":"updateTransferMinimumFee","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"type_","type":"string"}],"name":"numberOfProposals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"tokenBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"authority","type":"address"}],"name":"LogSetAuthority","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"}],"name":"LogSetOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

  Contract Creation Code Switch To Opcodes View
6060604052604060405190810160405280600981526020017f584a5020302e362e3000000000000000000000000000000000000000000000008152506002908051906020019062000052929190620000e2565b505b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503373ffffffffffffffffffffffffffffffffffffffff167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405180905060405180910390a25b62000191565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200012557805160ff191683800117855562000156565b8280016001018555821562000156579182015b828111156200015557825182559160200191906001019062000138565b5b50905062000165919062000169565b5090565b6200018e91905b808211156200018a57600081600090555060010162000170565b5090565b90565b61356680620001a16000396000f3006060604052361561019f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146101a1578063095ea7b31461023a5780631072cbea14610291578063116877cc146102e857806313af40351461031e57806318160ddd146103545780631946fdf41461037a57806323b872dd146103a05780632f54bf6e14610416578063313ce56714610464578063351bf5181461049057806342966c68146104b65780634fad404a146104ee578063548d4a541461055157806354c35a3c1461058957806359d5d02a1461061c57806366829b161461068e57806370a08231146106c45780637a9e5e4b1461070e5780637aa306a21461074457806388bf60b71461076a5780638da5cb5b1461079657806395d89b41146107e8578063a0712d6814610881578063a9059cbb146108b9578063b3350f0314610910578063bf29b90a1461093a578063bf7e214f14610970578063c50c97d0146109c2578063dd62ed3e146109f8578063df49dfe314610a61578063e35f025414610a9c578063e42c08f214610b0a575bfe5b34156101a957fe5b6101b1610b54565b6040518080602001828103825283818151815260200191508051906020019080838360008314610200575b805182526020831115610200576020820191506020810190506020830392506101dc565b505050905090810190601f16801561022c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561024257fe5b610277600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610bf2565b604051808215151515815260200191505060405180910390f35b341561029957fe5b6102ce600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610d8d565b604051808215151515815260200191505060405180910390f35b34156102f057fe5b61031c600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610eae565b005b341561032657fe5b610352600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061112d565b005b341561035c57fe5b610364611211565b6040518082815260200191505060405180910390f35b341561038257fe5b61038a6112f3565b6040518082815260200191505060405180910390f35b34156103a857fe5b6103fc600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506113d5565b604051808215151515815260200191505060405180910390f35b341561041e57fe5b61044a600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506115a5565b604051808215151515815260200191505060405180910390f35b341561046c57fe5b6104746116c0565b604051808260ff1660ff16815260200191505060405180910390f35b341561049857fe5b6104a06116c5565b6040518082815260200191505060405180910390f35b34156104be57fe5b6104d460048080359060200190919050506117a7565b604051808215151515815260200191505060405180910390f35b34156104f657fe5b61054f600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919080359060200190919050506118ca565b005b341561055957fe5b61056f6004808035906020019091905050611a48565b604051808215151515815260200191505060405180910390f35b341561059157fe5b61061a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611b6b565b005b341561062457fe5b610678600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611bcd565b6040518082815260200191505060405180910390f35b341561069657fe5b6106c2600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d23565b005b34156106cc57fe5b6106f8600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506121db565b6040518082815260200191505060405180910390f35b341561071657fe5b610742600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506122f3565b005b341561074c57fe5b6107546123d7565b6040518082815260200191505060405180910390f35b341561077257fe5b61077a6124bc565b604051808260ff1660ff16815260200191505060405180910390f35b341561079e57fe5b6107a661259e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156107f057fe5b6107f86125c4565b6040518080602001828103825283818151815260200191508051906020019080838360008314610847575b80518252602083111561084757602082019150602081019050602083039250610823565b505050905090810190601f1680156108735780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561088957fe5b61089f60048080359060200190919050506125fe565b604051808215151515815260200191505060405180910390f35b34156108c157fe5b6108f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050612721565b604051808215151515815260200191505060405180910390f35b341561091857fe5b6109206128bc565b604051808215151515815260200191505060405180910390f35b341561094257fe5b61096e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506128fd565b005b341561097857fe5b610980612db5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156109ca57fe5b6109f6600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612ddb565b005b3415610a0057fe5b610a4b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050612e57565b6040518082815260200191505060405180910390f35b3415610a6957fe5b610a82600480803560ff16906020019091905050612fa4565b604051808215151515815260200191505060405180910390f35b3415610aa457fe5b610af4600480803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506130cd565b6040518082815260200191505060405180910390f35b3415610b1257fe5b610b3e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050613224565b6040518082815260200191505060405180910390f35b60028054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610bea5780601f10610bbf57610100808354040283529160200191610bea565b820191906000526020600020905b815481529060010190602001808311610bcd57829003601f168201915b505050505081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e1f21c673385856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610cf257fe5b6102c65a03f11515610d0057fe5b5050506040518051905015610d7d578273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a360019050610d87565b60009050610d87565b5b92915050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f5537ede3385856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610e8d57fe5b6102c65a03f11515610e9b57fe5b5050506040518051905090505b92915050565b610ee4610edf336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610f50600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166122f3565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c50c97d0600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b151561102b57fe5b6102c65a03f1151561103957fe5b505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663116877cc600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b151561111757fe5b6102c65a03f1151561112557fe5b5050505b5b50565b61116361115e336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405180905060405180910390a25b5b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e4dc2aa4336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156112d557fe5b6102c65a03f115156112e357fe5b5050506040518051905090505b90565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b8a582af336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156113b757fe5b6102c65a03f115156113c557fe5b5050506040518051905090505b90565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea338686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b151561150957fe5b6102c65a03f1151561151757fe5b5050506040518051905015611594578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905061159e565b6000905061159e565b5b9392505050565b60006115dd6115d8336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a2e1a8d8836000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561169f57fe5b6102c65a03f115156116ad57fe5b5050506040518051905090505b5b919050565b600081565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166358cf9570336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561178957fe5b6102c65a03f1151561179757fe5b5050506040518051905090505b90565b60006117df6117da336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15156118a957fe5b6102c65a03f115156118b757fe5b5050506040518051905090505b5b919050565b6119006118fb336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb9734fc33846040518082805190602001908083835b602083106119735780518252602082019150602081019050602083039250611950565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183600019166000191681526020018281526020019350505050600060405180830381600087803b1515611a3157fe5b6102c65a03f11515611a3f57fe5b5050505b5b5050565b6000611a80611a7b336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166325f0f46733846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1515611b4a57fe5b6102c65a03f11515611b5857fe5b5050506040518051905090505b5b919050565b611ba1611b9c336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b611baa84612ddb565b611bb383611d23565b611bbc82610eae565b611bc5816128fd565b5b5b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639b76a25c338686866000604051602001526040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1515611d0157fe5b6102c65a03f11515611d0f57fe5b5050506040518051905090505b9392505050565b611d59611d54336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166366829b16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1515611e7557fe5b6102c65a03f11515611e8357fe5b505050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c50c97d0600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515611f6a57fe5b6102c65a03f11515611f7857fe5b5050506040518051905050600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156121d657600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166366829b16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156120bf57fe5b6102c65a03f115156120cd57fe5b5050506040518051905050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf29b90a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15156121bc57fe5b6102c65a03f115156121ca57fe5b50505060405180519050505b5b5b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f7888aec33846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b15156122d357fe5b6102c65a03f115156122e157fe5b5050506040518051905090505b919050565b612329612324336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada460405180905060405180910390a25b5b50565b600061240f61240a336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637aa306a26000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401809050602060405180830381600087803b151561249d57fe5b6102c65a03f115156124ab57fe5b5050506040518051905090505b5b90565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663112fbe9b336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561258057fe5b6102c65a03f1151561258e57fe5b5050506040518051905090505b90565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b604060405190810160405280600381526020017f584a50000000000000000000000000000000000000000000000000000000000081525081565b6000612636612631336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b151561270057fe5b6102c65a03f1151561270e57fe5b5050506040518051905090505b5b919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc83385856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561282157fe5b6102c65a03f1151561282f57fe5b50505060405180519050156128ac578273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190506128b6565b600090506128b6565b5b92915050565b60006128f46128ef336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600190505b5b90565b61293361292e336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c50c97d0600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612a5857fe5b6102c65a03f11515612a6657fe5b5050506040518051905050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf29b90a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1515612b4c57fe5b6102c65a03f11515612b5a57fe5b505050600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612db057600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166366829b16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612c9957fe5b6102c65a03f11515612ca757fe5b5050506040518051905050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf29b90a600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1515612d9657fe5b6102c65a03f11515612da457fe5b50505060405180519050505b5b5b50565b600060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612e11612e0c336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b50565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663927da1053385856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050602060405180830381600087803b1515612f8357fe5b6102c65a03f11515612f9157fe5b5050506040518051905090505b92915050565b6000612fdc612fd7336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663915a405f33846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018260ff1660ff16815260200192505050602060405180830381600087803b15156130ac57fe5b6102c65a03f115156130ba57fe5b5050506040518051905090505b5b919050565b6000613105613100336000357fffffffff000000000000000000000000000000000000000000000000000000001661333c565b613529565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663796d67da836040518082805190602001908083835b602083106131775780518252602082019150602081019050602083039250613154565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390206000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561320357fe5b6102c65a03f1151561321157fe5b5050506040518051905090505b5b919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631bea800633846000604051602001526040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b151561331c57fe5b6102c65a03f1151561332a57fe5b5050506040518051905090505b919050565b60003073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614806133c55750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b806135205750600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b70096138430856000604051602001526040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526020019350505050602060405180830381600087803b151561350757fe5b6102c65a03f1151561351557fe5b505050604051805190505b90505b92915050565b8015156135365760006000fd5b5b505600a165627a7a72305820792b492909f01c0cd2478bd5bec8959d698c39f31179b42ec9e3d9207e604d8a0029

   Swarm Source:
bzzr://792b492909f01c0cd2478bd5bec8959d698c39f31179b42ec9e3d9207e604d8a
View All
Block Age txn Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "downvote" button for any spammy posts, and the "upvote" for interesting conversations.