Contract Overview | Digitx
Balance: 0 Ether
Ether Value: $0
Transactions: 32 txns
Token Tracker: X (|X|)
Misc:
Address Watch: Add To Watch List
Contract Creator: 0x0014fd7ad93c6fa5cc78af55da6c930b1f4822a1at txn 0x34fab501a8a3dee29947c8f109b78285c484398d46e06ba36c5da5d061fcd59b
Token Balance:
 Latest 25 transactions from a total of 32 transactions

TxHash Age From To Value [TxFee]
0xfe0e12274a838785819e6f0e177abc195ede6c34e3b1dde0e947bdeb9096c171294 days 14 hrs ago0x0014fd7ad93c6fa5cc78af55da6c930b1f4822a1  IN   Digitx0 Ether0.00015028
0x10ea2519ee2bec11c8c684e644d08bc4abe3d90da8b1505cc064357671687abb295 days 14 hrs ago0x8aa50dfc95ab047128ccdc6af4ba2ddba8d0a874  IN   Digitx0 Ether0.000185815
0x9af040c1aa0ed5c996193c5e4b612d0d2d56cb4c360ce6b53cff86f258d53458295 days 15 hrs ago0x0014fd7ad93c6fa5cc78af55da6c930b1f4822a1  IN   Digitx0 Ether0.00045018
0x7d4af3fa7a9d701b6db68d25151a158885c33124dff054ac8e25249a1ab1420a349 days 12 hrs ago0x15015e8325c8a6d994ccd92bbf9acb48fe1a241b  IN   Digitx0.01 Ether0.00067288
0xb668514615ac595de88782f49b4c25f91fbcf0458f59cf6dba80eeb099c2746c349 days 12 hrs ago0x15015e8325c8a6d994ccd92bbf9acb48fe1a241b  IN   Digitx0.05 Ether0.00097288
0xfb6ba126734c0602f05e7f81a4688bb110b0a462193ec1e079674eebef2dba21350 days 14 hrs ago0x1acee83486b6671b005eed45c9fb9277e7eeb63d  IN   Digitx0.5 Ether0.00194576
0x55969c9e81b934f3bd296b4503cac377f5b3948538078b1e04cf16d89b7d2fb4386 days 14 hrs ago0x0014fd7ad93c6fa5cc78af55da6c930b1f4822a1  IN   Digitx0 Ether0.00052291
0x2e712dd35b0941e8f8c0dd07b7685b7a71f3a8f8b0870bab0b7c881229735cac389 days 2 hrs ago0x9be1c7a1f118f61740f01e96d292c0bae90360ab  IN   Digitx0 Ether0.00046
0x9c5dc3472ace0bda0613b68ad12ae8221c609731e12b5b0a79b896eaf7f9d54c419 days 13 hrs ago0x739292f41e3a96c0b4b08fe497adfe660542d505  IN   Digitx0.015 Ether0.004124444343
0xd65f601040afe35761738247d4f49caa2061baeb74ee30fc07ea8665c2c7ee5d419 days 13 hrs ago0x739292f41e3a96c0b4b08fe497adfe660542d505  IN   Digitx0.04 Ether0.001190968562
0x7cbf53ab82a166ba8a24c3bc30837df66ecc8573131b8fc047aff93e34cd9d5d426 days 19 hrs ago0x49bf2af59dd80b0982f91cda4411338c4f4d26a4  IN   Digitx1 Ether0.002095107
0x0b0a7c4141b5467decd5c29767f02ededd2e4e38ddc0854aa409140351d2e1db427 days 2 hrs ago0x8aa50dfc95ab047128ccdc6af4ba2ddba8d0a874  IN   Digitx1.5 Ether0.00146378
0x10e308dfb69764989e8b62dc589131f02dfa32844b2b2ebf99eddf63f3e65c1a428 days 7 hrs ago0x8aa50dfc95ab047128ccdc6af4ba2ddba8d0a874  IN   Digitx1.5 Ether0.0006
0xfeb22edbb989f15da515aacbdf4fd84573e35830e14119426a5aabfd66ca5df8428 days 15 hrs ago0x8aa50dfc95ab047128ccdc6af4ba2ddba8d0a874  IN   Digitx1.5 Ether0.00045
0xf0981b8956ea475051c1da573dee53ed1296c5c5ae65c35c572f03fcac22d081434 days 23 hrs ago0x24c1bbb2421cf83ed6cbec5a81595e9236d71f54  IN   Digitx0.003 Ether0.00084
0xac519058e3035f4b5f885326043f20d712068cdd807f5cdd1cdb39863848b455435 days 18 hrs ago0x666e2ea7cfe1bc9c5852b5209a285b90a3bd4c28  IN   Digitx0.2 Ether0.002095107
0x42c43de2f42d32c6761a7ee2949ed81637191a22da27d1e7cefb3599a17e2d2c436 days 11 hrs ago0x0898f5789fce718971dfcae910cfe41c4920ef9e  IN   Digitx0.1 Ether0.002095107
0xb67abe346db40d12c77b8b9db52c36ebc233928f3bad1047746dfaf070544542437 days 14 hrs agoFreewallet  IN   Digitx0.324804690791796 Ether0.00254301
0x1687bcd2c71d0c6a0ffc106f8b42493b71be6c97a7000a35129db9dc002291e5438 days 12 hrs ago0x0b34932400189f63c23c6f74f8a6b08b5fc40fe4  IN   Digitx0.1 Ether0.000099767
0x7469dd1961bd2e943cf3754407645b16d4188e8ee81810f541bdbf9ea19607f8439 days 13 hrs ago0xb91e0c81d83c92cdfb60364f36dc55f591620aec  IN   Digitx0.36 Ether0.002095107
0xa892d6edd148d1684996274943a56640a7560cd20c11d00418b017bf0004435d439 days 22 hrs ago0x9c9d99a16ea2a78ea0f7cc70d04cc2d74987b430  IN   Digitx0.08371 Ether0.0018
0x6755ff647165a2a6a90205f1a7a2ac1da6c8eadd7c1cca2c63c8bbff793a8d44440 days 21 hrs ago0x7a9c38d3de8ffdab7d88bde3735c271800a7a828  IN   Digitx0.1344181399 Ether0.002090382
0x739919ce8cd04be78a6d62c24195fb30637a5516b2369f3c1f6a2ffe463bf5c7440 days 23 hrs ago0x0534f4ba8b1f7f60015aa6c1443bb646f2f90c11  IN   Digitx0.1 Ether0.002090382
0xd6ec9d31fc377325635f93587129aee154962ea0832448acb7324c8a0fbad4d3443 days 3 hrs ago0x4fef95c773da7c984a0b8b752930d49d0403d3a6  IN   Digitx0.043 Ether0.000929962
0xc1c1f7f204150d442e4695fd5aec114b74a5b5fcae51e490fa453f03e3f05f8c462 days 48 mins ago0x0014fd7ad93c6fa5cc78af55da6c930b1f4822a1  IN   Digitx0 Ether0.000781767
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 1 Internal Transaction

ParentTxHash Block Age From To Value
0xfe0e12274a838785819e6f0e177abc195ede6c34e3b1dde0e947bdeb9096c1715144724294 days 14 hrs ago0x9a4fe70bb7b39127f4772acaf0d000578644b39d0x0014fd7ad93c6fa5cc78af55da6c930b1f4822a15.616205828691796496 Ether
[ Download CSV Export  ] 
Contract Name: X
Compiler Text: v0.4.13+commit.fb4cb1a
Optimization Enabled: No
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

// ----------------------------------------------------------------------------------------------
// X Foundation token for the advancement of decentralised AI and robotics
// Symbol: |X|
// Total Supply: 1,000,000,000 Fixed.
// 
// Partly dedicated to GameKyuubi - Spartans Hodl.
// ----------------------------------------------------------------------------------------------
pragma solidity ^0.4.13;

contract OraclizeI {
    address public cbAddress;
    function query(uint _timestamp, string _datasource, string _arg) payable returns (bytes32 _id);
    function query_withGasLimit(uint _timestamp, string _datasource, string _arg, uint _gaslimit) payable returns (bytes32 _id);
    function query2(uint _timestamp, string _datasource, string _arg1, string _arg2) payable returns (bytes32 _id);
    function query2_withGasLimit(uint _timestamp, string _datasource, string _arg1, string _arg2, uint _gaslimit) payable returns (bytes32 _id);
    function queryN(uint _timestamp, string _datasource, bytes _argN) payable returns (bytes32 _id);
    function queryN_withGasLimit(uint _timestamp, string _datasource, bytes _argN, uint _gaslimit) payable returns (bytes32 _id);
    function getPrice(string _datasource) returns (uint _dsprice);
    function getPrice(string _datasource, uint gaslimit) returns (uint _dsprice);
    function useCoupon(string _coupon);
    function setProofType(byte _proofType);
    function setConfig(bytes32 _config);
    function setCustomGasPrice(uint _gasPrice);
    function randomDS_getSessionPubKeyHash() returns(bytes32);
}
contract OraclizeAddrResolverI {
    function getAddress() returns (address _addr);
}
contract usingOraclize {
    uint constant day = 60*60*24;
    uint constant week = 60*60*24*7;
    uint constant month = 60*60*24*30;
    byte constant proofType_NONE = 0x00;
    byte constant proofType_TLSNotary = 0x10;
    byte constant proofType_Android = 0x20;
    byte constant proofType_Ledger = 0x30;
    byte constant proofType_Native = 0xF0;
    byte constant proofStorage_IPFS = 0x01;
    uint8 constant networkID_auto = 0;
    uint8 constant networkID_mainnet = 1;
    uint8 constant networkID_testnet = 2;
    uint8 constant networkID_morden = 2;
    uint8 constant networkID_consensys = 161;

    OraclizeAddrResolverI OAR;

    OraclizeI oraclize;
    modifier oraclizeAPI {
        if((address(OAR)==0)||(getCodeSize(address(OAR))==0)) oraclize_setNetwork(networkID_auto);
        oraclize = OraclizeI(OAR.getAddress());
        _;
    }
    modifier coupon(string code){
        oraclize = OraclizeI(OAR.getAddress());
        oraclize.useCoupon(code);
        _;
    }

    function oraclize_setNetwork(uint8 networkID) internal returns(bool){
        if (getCodeSize(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed)>0){ //mainnet
            OAR = OraclizeAddrResolverI(0x1d3B2638a7cC9f2CB3D298A3DA7a90B67E5506ed);
            oraclize_setNetworkName("eth_mainnet");
            return true;
        }
        if (getCodeSize(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1)>0){ //ropsten testnet
            OAR = OraclizeAddrResolverI(0xc03A2615D5efaf5F49F60B7BB6583eaec212fdf1);
            oraclize_setNetworkName("eth_ropsten3");
            return true;
        }
        if (getCodeSize(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e)>0){ //kovan testnet
            OAR = OraclizeAddrResolverI(0xB7A07BcF2Ba2f2703b24C0691b5278999C59AC7e);
            oraclize_setNetworkName("eth_kovan");
            return true;
        }
        if (getCodeSize(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48)>0){ //rinkeby testnet
            OAR = OraclizeAddrResolverI(0x146500cfd35B22E4A392Fe0aDc06De1a1368Ed48);
            oraclize_setNetworkName("eth_rinkeby");
            return true;
        }
        if (getCodeSize(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475)>0){ //ethereum-bridge
            OAR = OraclizeAddrResolverI(0x6f485C8BF6fc43eA212E93BBF8ce046C7f1cb475);
            return true;
        }
        if (getCodeSize(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF)>0){ //ether.camp ide
            OAR = OraclizeAddrResolverI(0x20e12A1F859B3FeaE5Fb2A0A32C18F5a65555bBF);
            return true;
        }
        if (getCodeSize(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA)>0){ //browser-solidity
            OAR = OraclizeAddrResolverI(0x51efaF4c8B3C9AfBD5aB9F4bbC82784Ab6ef8fAA);
            return true;
        }
        return false;
    }

    function __callback(bytes32 myid, string result) {
        __callback(myid, result, new bytes(0));
    }
    function __callback(bytes32 myid, string result, bytes proof) {
    }
    
    function oraclize_useCoupon(string code) oraclizeAPI internal {
        oraclize.useCoupon(code);
    }

    function oraclize_getPrice(string datasource) oraclizeAPI internal returns (uint){
        return oraclize.getPrice(datasource);
    }

    function oraclize_getPrice(string datasource, uint gaslimit) oraclizeAPI internal returns (uint){
        return oraclize.getPrice(datasource, gaslimit);
    }
    
    function oraclize_query(string datasource, string arg) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query.value(price)(0, datasource, arg);
    }
    function oraclize_query(uint timestamp, string datasource, string arg) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query.value(price)(timestamp, datasource, arg);
    }
    function oraclize_query(uint timestamp, string datasource, string arg, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query_withGasLimit.value(price)(timestamp, datasource, arg, gaslimit);
    }
    function oraclize_query(string datasource, string arg, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query_withGasLimit.value(price)(0, datasource, arg, gaslimit);
    }
    function oraclize_query(string datasource, string arg1, string arg2) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query2.value(price)(0, datasource, arg1, arg2);
    }
    function oraclize_query(uint timestamp, string datasource, string arg1, string arg2) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        return oraclize.query2.value(price)(timestamp, datasource, arg1, arg2);
    }
    function oraclize_query(uint timestamp, string datasource, string arg1, string arg2, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query2_withGasLimit.value(price)(timestamp, datasource, arg1, arg2, gaslimit);
    }
    function oraclize_query(string datasource, string arg1, string arg2, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        return oraclize.query2_withGasLimit.value(price)(0, datasource, arg1, arg2, gaslimit);
    }
    function oraclize_query(string datasource, string[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN.value(price)(0, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, string[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN.value(price)(timestamp, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, string[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(timestamp, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, string[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = stra2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(0, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, string[1] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[1] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](1);
        dynargs[0] = args[0];       
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, string[2] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[2] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[3] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[3] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, string[4] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[4] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[5] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[5] args) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, string[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, string[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        string[] memory dynargs = new string[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN.value(price)(0, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[] argN) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource);
        if (price > 1 ether + tx.gasprice*200000) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN.value(price)(timestamp, datasource, args);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(timestamp, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, bytes[] argN, uint gaslimit) oraclizeAPI internal returns (bytes32 id){
        uint price = oraclize.getPrice(datasource, gaslimit);
        if (price > 1 ether + tx.gasprice*gaslimit) return 0; // unexpectedly high price
        bytes memory args = ba2cbor(argN);
        return oraclize.queryN_withGasLimit.value(price)(0, datasource, args, gaslimit);
    }
    function oraclize_query(string datasource, bytes[1] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[1] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[1] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](1);
        dynargs[0] = args[0];       
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, bytes[2] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[2] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[2] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](2);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[3] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[3] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[3] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](3);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    
    function oraclize_query(string datasource, bytes[4] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[4] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[4] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](4);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        return oraclize_query(datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[5] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[5] args) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs);
    }
    function oraclize_query(uint timestamp, string datasource, bytes[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(timestamp, datasource, dynargs, gaslimit);
    }
    function oraclize_query(string datasource, bytes[5] args, uint gaslimit) oraclizeAPI internal returns (bytes32 id) {
        bytes[] memory dynargs = new bytes[](5);
        dynargs[0] = args[0];
        dynargs[1] = args[1];
        dynargs[2] = args[2];
        dynargs[3] = args[3];
        dynargs[4] = args[4];
        return oraclize_query(datasource, dynargs, gaslimit);
    }

    function oraclize_cbAddress() oraclizeAPI internal returns (address){
        return oraclize.cbAddress();
    }
    function oraclize_setProof(byte proofP) oraclizeAPI internal {
        return oraclize.setProofType(proofP);
    }
    function oraclize_setCustomGasPrice(uint gasPrice) oraclizeAPI internal {
        return oraclize.setCustomGasPrice(gasPrice);
    }
    function oraclize_setConfig(bytes32 config) oraclizeAPI internal {
        return oraclize.setConfig(config);
    }
    
    function oraclize_randomDS_getSessionPubKeyHash() oraclizeAPI internal returns (bytes32){
        return oraclize.randomDS_getSessionPubKeyHash();
    }

    function getCodeSize(address _addr) constant internal returns(uint _size) {
        assembly {
            _size := extcodesize(_addr)
        }
    }

    function parseAddr(string _a) internal returns (address){
        bytes memory tmp = bytes(_a);
        uint160 iaddr = 0;
        uint160 b1;
        uint160 b2;
        for (uint i=2; i<2+2*20; i+=2){
            iaddr *= 256;
            b1 = uint160(tmp[i]);
            b2 = uint160(tmp[i+1]);
            if ((b1 >= 97)&&(b1 <= 102)) b1 -= 87;
            else if ((b1 >= 65)&&(b1 <= 70)) b1 -= 55;
            else if ((b1 >= 48)&&(b1 <= 57)) b1 -= 48;
            if ((b2 >= 97)&&(b2 <= 102)) b2 -= 87;
            else if ((b2 >= 65)&&(b2 <= 70)) b2 -= 55;
            else if ((b2 >= 48)&&(b2 <= 57)) b2 -= 48;
            iaddr += (b1*16+b2);
        }
        return address(iaddr);
    }

    function strCompare(string _a, string _b) internal returns (int) {
        bytes memory a = bytes(_a);
        bytes memory b = bytes(_b);
        uint minLength = a.length;
        if (b.length < minLength) minLength = b.length;
        for (uint i = 0; i < minLength; i ++)
            if (a[i] < b[i])
                return -1;
            else if (a[i] > b[i])
                return 1;
        if (a.length < b.length)
            return -1;
        else if (a.length > b.length)
            return 1;
        else
            return 0;
    }

    function indexOf(string _haystack, string _needle) internal returns (int) {
        bytes memory h = bytes(_haystack);
        bytes memory n = bytes(_needle);
        if(h.length < 1 || n.length < 1 || (n.length > h.length))
            return -1;
        else if(h.length > (2**128 -1))
            return -1;
        else
        {
            uint subindex = 0;
            for (uint i = 0; i < h.length; i ++)
            {
                if (h[i] == n[0])
                {
                    subindex = 1;
                    while(subindex < n.length && (i + subindex) < h.length && h[i + subindex] == n[subindex])
                    {
                        subindex++;
                    }
                    if(subindex == n.length)
                        return int(i);
                }
            }
            return -1;
        }
    }

    function strConcat(string _a, string _b, string _c, string _d, string _e) internal returns (string) {
        bytes memory _ba = bytes(_a);
        bytes memory _bb = bytes(_b);
        bytes memory _bc = bytes(_c);
        bytes memory _bd = bytes(_d);
        bytes memory _be = bytes(_e);
        string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length);
        bytes memory babcde = bytes(abcde);
        uint k = 0;
        for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i];
        for (i = 0; i < _bb.length; i++) babcde[k++] = _bb[i];
        for (i = 0; i < _bc.length; i++) babcde[k++] = _bc[i];
        for (i = 0; i < _bd.length; i++) babcde[k++] = _bd[i];
        for (i = 0; i < _be.length; i++) babcde[k++] = _be[i];
        return string(babcde);
    }

    function strConcat(string _a, string _b, string _c, string _d) internal returns (string) {
        return strConcat(_a, _b, _c, _d, "");
    }

    function strConcat(string _a, string _b, string _c) internal returns (string) {
        return strConcat(_a, _b, _c, "", "");
    }

    function strConcat(string _a, string _b) internal returns (string) {
        return strConcat(_a, _b, "", "", "");
    }

    // parseInt
    function parseInt(string _a) internal returns (uint) {
        return parseInt(_a, 0);
    }

    // parseInt(parseFloat*10^_b)
    function parseInt(string _a, uint _b) internal returns (uint) {
        bytes memory bresult = bytes(_a);
        uint mint = 0;
        bool decimals = false;
        for (uint i=0; i<bresult.length; i++){
            if ((bresult[i] >= 48)&&(bresult[i] <= 57)){
                if (decimals){
                   if (_b == 0) break;
                    else _b--;
                }
                mint *= 10;
                mint += uint(bresult[i]) - 48;
            } else if (bresult[i] == 46) decimals = true;
        }
        if (_b > 0) mint *= 10**_b;
        return mint;
    }

    function uint2str(uint i) internal returns (string){
        if (i == 0) return "0";
        uint j = i;
        uint len;
        while (j != 0){
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (i != 0){
            bstr[k--] = byte(48 + i % 10);
            i /= 10;
        }
        return string(bstr);
    }
    
    function stra2cbor(string[] arr) internal returns (bytes) {
            uint arrlen = arr.length;

            // get correct cbor output length
            uint outputlen = 0;
            bytes[] memory elemArray = new bytes[](arrlen);
            for (uint i = 0; i < arrlen; i++) {
                elemArray[i] = (bytes(arr[i]));
                outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types
            }
            uint ctr = 0;
            uint cborlen = arrlen + 0x80;
            outputlen += byte(cborlen).length;
            bytes memory res = new bytes(outputlen);

            while (byte(cborlen).length > ctr) {
                res[ctr] = byte(cborlen)[ctr];
                ctr++;
            }
            for (i = 0; i < arrlen; i++) {
                res[ctr] = 0x5F;
                ctr++;
                for (uint x = 0; x < elemArray[i].length; x++) {
                    // if there's a bug with larger strings, this may be the culprit
                    if (x % 23 == 0) {
                        uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x;
                        elemcborlen += 0x40;
                        uint lctr = ctr;
                        while (byte(elemcborlen).length > ctr - lctr) {
                            res[ctr] = byte(elemcborlen)[ctr - lctr];
                            ctr++;
                        }
                    }
                    res[ctr] = elemArray[i][x];
                    ctr++;
                }
                res[ctr] = 0xFF;
                ctr++;
            }
            return res;
        }

    function ba2cbor(bytes[] arr) internal returns (bytes) {
            uint arrlen = arr.length;

            // get correct cbor output length
            uint outputlen = 0;
            bytes[] memory elemArray = new bytes[](arrlen);
            for (uint i = 0; i < arrlen; i++) {
                elemArray[i] = (bytes(arr[i]));
                outputlen += elemArray[i].length + (elemArray[i].length - 1)/23 + 3; //+3 accounts for paired identifier types
            }
            uint ctr = 0;
            uint cborlen = arrlen + 0x80;
            outputlen += byte(cborlen).length;
            bytes memory res = new bytes(outputlen);

            while (byte(cborlen).length > ctr) {
                res[ctr] = byte(cborlen)[ctr];
                ctr++;
            }
            for (i = 0; i < arrlen; i++) {
                res[ctr] = 0x5F;
                ctr++;
                for (uint x = 0; x < elemArray[i].length; x++) {
                    // if there's a bug with larger strings, this may be the culprit
                    if (x % 23 == 0) {
                        uint elemcborlen = elemArray[i].length - x >= 24 ? 23 : elemArray[i].length - x;
                        elemcborlen += 0x40;
                        uint lctr = ctr;
                        while (byte(elemcborlen).length > ctr - lctr) {
                            res[ctr] = byte(elemcborlen)[ctr - lctr];
                            ctr++;
                        }
                    }
                    res[ctr] = elemArray[i][x];
                    ctr++;
                }
                res[ctr] = 0xFF;
                ctr++;
            }
            return res;
        }
        
        
    string oraclize_network_name;
    function oraclize_setNetworkName(string _network_name) internal {
        oraclize_network_name = _network_name;
    }
    
    function oraclize_getNetworkName() internal returns (string) {
        return oraclize_network_name;
    }
    
    function oraclize_newRandomDSQuery(uint _delay, uint _nbytes, uint _customGasLimit) internal returns (bytes32){
        if ((_nbytes == 0)||(_nbytes > 32)) throw;
        bytes memory nbytes = new bytes(1);
        nbytes[0] = byte(_nbytes);
        bytes memory unonce = new bytes(32);
        bytes memory sessionKeyHash = new bytes(32);
        bytes32 sessionKeyHash_bytes32 = oraclize_randomDS_getSessionPubKeyHash();
        assembly {
            mstore(unonce, 0x20)
            mstore(add(unonce, 0x20), xor(blockhash(sub(number, 1)), xor(coinbase, timestamp)))
            mstore(sessionKeyHash, 0x20)
            mstore(add(sessionKeyHash, 0x20), sessionKeyHash_bytes32)
        }
        bytes[3] memory args = [unonce, nbytes, sessionKeyHash]; 
        bytes32 queryId = oraclize_query(_delay, "random", args, _customGasLimit);
        oraclize_randomDS_setCommitment(queryId, sha3(bytes8(_delay), args[1], sha256(args[0]), args[2]));
        return queryId;
    }
    
    function oraclize_randomDS_setCommitment(bytes32 queryId, bytes32 commitment) internal {
        oraclize_randomDS_args[queryId] = commitment;
    }
    
    mapping(bytes32=>bytes32) oraclize_randomDS_args;
    mapping(bytes32=>bool) oraclize_randomDS_sessionKeysHashVerified;

    function verifySig(bytes32 tosignh, bytes dersig, bytes pubkey) internal returns (bool){
        bool sigok;
        address signer;
        
        bytes32 sigr;
        bytes32 sigs;
        
        bytes memory sigr_ = new bytes(32);
        uint offset = 4+(uint(dersig[3]) - 0x20);
        sigr_ = copyBytes(dersig, offset, 32, sigr_, 0);
        bytes memory sigs_ = new bytes(32);
        offset += 32 + 2;
        sigs_ = copyBytes(dersig, offset+(uint(dersig[offset-1]) - 0x20), 32, sigs_, 0);

        assembly {
            sigr := mload(add(sigr_, 32))
            sigs := mload(add(sigs_, 32))
        }
        
        
        (sigok, signer) = safer_ecrecover(tosignh, 27, sigr, sigs);
        if (address(sha3(pubkey)) == signer) return true;
        else {
            (sigok, signer) = safer_ecrecover(tosignh, 28, sigr, sigs);
            return (address(sha3(pubkey)) == signer);
        }
    }

    function oraclize_randomDS_proofVerify__sessionKeyValidity(bytes proof, uint sig2offset) internal returns (bool) {
        bool sigok;
        
        // Step 6: verify the attestation signature, APPKEY1 must sign the sessionKey from the correct ledger app (CODEHASH)
        bytes memory sig2 = new bytes(uint(proof[sig2offset+1])+2);
        copyBytes(proof, sig2offset, sig2.length, sig2, 0);
        
        bytes memory appkey1_pubkey = new bytes(64);
        copyBytes(proof, 3+1, 64, appkey1_pubkey, 0);
        
        bytes memory tosign2 = new bytes(1+65+32);
        tosign2[0] = 1; //role
        copyBytes(proof, sig2offset-65, 65, tosign2, 1);
        bytes memory CODEHASH = hex"fd94fa71bc0ba10d39d464d0d8f465efeef0a2764e3887fcc9df41ded20f505c";
        copyBytes(CODEHASH, 0, 32, tosign2, 1+65);
        sigok = verifySig(sha256(tosign2), sig2, appkey1_pubkey);
        
        if (sigok == false) return false;
        
        
        // Step 7: verify the APPKEY1 provenance (must be signed by Ledger)
        bytes memory LEDGERKEY = hex"7fb956469c5c9b89840d55b43537e66a98dd4811ea0a27224272c2e5622911e8537a2f8e86a46baec82864e98dd01e9ccc2f8bc5dfc9cbe5a91a290498dd96e4";
        
        bytes memory tosign3 = new bytes(1+65);
        tosign3[0] = 0xFE;
        copyBytes(proof, 3, 65, tosign3, 1);
        
        bytes memory sig3 = new bytes(uint(proof[3+65+1])+2);
        copyBytes(proof, 3+65, sig3.length, sig3, 0);
        
        sigok = verifySig(sha256(tosign3), sig3, LEDGERKEY);
        
        return sigok;
    }
    
    modifier oraclize_randomDS_proofVerify(bytes32 _queryId, string _result, bytes _proof) {
        // Step 1: the prefix has to match 'LP\x01' (Ledger Proof version 1)
        if ((_proof[0] != "L")||(_proof[1] != "P")||(_proof[2] != 1)) throw;
        
        bool proofVerified = oraclize_randomDS_proofVerify__main(_proof, _queryId, bytes(_result), oraclize_getNetworkName());
        if (proofVerified == false) throw;
        
        _;
    }
    
    function matchBytes32Prefix(bytes32 content, bytes prefix) internal returns (bool){
        bool match_ = true;
        
        for (var i=0; i<prefix.length; i++){
            if (content[i] != prefix[i]) match_ = false;
        }
        
        return match_;
    }

    function oraclize_randomDS_proofVerify__main(bytes proof, bytes32 queryId, bytes result, string context_name) internal returns (bool){
        bool checkok;
        
        
        // Step 2: the unique keyhash has to match with the sha256 of (context name + queryId)
        uint ledgerProofLength = 3+65+(uint(proof[3+65+1])+2)+32;
        bytes memory keyhash = new bytes(32);
        copyBytes(proof, ledgerProofLength, 32, keyhash, 0);
        checkok = (sha3(keyhash) == sha3(sha256(context_name, queryId)));
        if (checkok == false) return false;
        
        bytes memory sig1 = new bytes(uint(proof[ledgerProofLength+(32+8+1+32)+1])+2);
        copyBytes(proof, ledgerProofLength+(32+8+1+32), sig1.length, sig1, 0);
        
        
        // Step 3: we assume sig1 is valid (it will be verified during step 5) and we verify if 'result' is the prefix of sha256(sig1)
        checkok = matchBytes32Prefix(sha256(sig1), result);
        if (checkok == false) return false;
        
        
        // Step 4: commitment match verification, sha3(delay, nbytes, unonce, sessionKeyHash) == commitment in storage.
        // This is to verify that the computed args match with the ones specified in the query.
        bytes memory commitmentSlice1 = new bytes(8+1+32);
        copyBytes(proof, ledgerProofLength+32, 8+1+32, commitmentSlice1, 0);
        
        bytes memory sessionPubkey = new bytes(64);
        uint sig2offset = ledgerProofLength+32+(8+1+32)+sig1.length+65;
        copyBytes(proof, sig2offset-64, 64, sessionPubkey, 0);
        
        bytes32 sessionPubkeyHash = sha256(sessionPubkey);
        if (oraclize_randomDS_args[queryId] == sha3(commitmentSlice1, sessionPubkeyHash)){ //unonce, nbytes and sessionKeyHash match
            delete oraclize_randomDS_args[queryId];
        } else return false;
        
        
        // Step 5: validity verification for sig1 (keyhash and args signed with the sessionKey)
        bytes memory tosign1 = new bytes(32+8+1+32);
        copyBytes(proof, ledgerProofLength, 32+8+1+32, tosign1, 0);
        checkok = verifySig(sha256(tosign1), sig1, sessionPubkey);
        if (checkok == false) return false;
        
        // verify if sessionPubkeyHash was verified already, if not.. let's do it!
        if (oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash] == false){
            oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash] = oraclize_randomDS_proofVerify__sessionKeyValidity(proof, sig2offset);
        }
        
        return oraclize_randomDS_sessionKeysHashVerified[sessionPubkeyHash];
    }

    
    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    function copyBytes(bytes from, uint fromOffset, uint length, bytes to, uint toOffset) internal returns (bytes) {
        uint minLength = length + toOffset;

        if (to.length < minLength) {
            // Buffer too small
            throw; // Should be a better way?
        }

        // NOTE: the offset 32 is added to skip the `size` field of both bytes variables
        uint i = 32 + fromOffset;
        uint j = 32 + toOffset;

        while (i < (32 + fromOffset + length)) {
            assembly {
                let tmp := mload(add(from, i))
                mstore(add(to, j), tmp)
            }
            i += 32;
            j += 32;
        }

        return to;
    }
    
    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    // Duplicate Solidity's ecrecover, but catching the CALL return value
    function safer_ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal returns (bool, address) {
        // We do our own memory management here. Solidity uses memory offset
        // 0x40 to store the current end of memory. We write past it (as
        // writes are memory extensions), but don't update the offset so
        // Solidity will reuse it. The memory used here is only needed for
        // this context.

        // FIXME: inline assembly can't access return values
        bool ret;
        address addr;

        assembly {
            let size := mload(0x40)
            mstore(size, hash)
            mstore(add(size, 32), v)
            mstore(add(size, 64), r)
            mstore(add(size, 96), s)

            // NOTE: we can reuse the request memory because we deal with
            //       the return code
            ret := call(3000, 1, 0, size, 128, size, 32)
            addr := mload(size)
        }
  
        return (ret, addr);
    }

    // the following function has been written by Alex Beregszaszi (@axic), use it under the terms of the MIT license
    function ecrecovery(bytes32 hash, bytes sig) internal returns (bool, address) {
        bytes32 r;
        bytes32 s;
        uint8 v;

        if (sig.length != 65)
          return (false, 0);

        // The signature format is a compact form of:
        //   {bytes32 r}{bytes32 s}{uint8 v}
        // Compact means, uint8 is not padded to 32 bytes.
        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))

            // Here we are loading the last 32 bytes. We exploit the fact that
            // 'mload' will pad with zeroes if we overread.
            // There is no 'mload8' to do this, but that would be nicer.
            v := byte(0, mload(add(sig, 96)))

            // Alternative solution:
            // 'byte' is not working due to the Solidity parser, so lets
            // use the second best option, 'and'
            // v := and(mload(add(sig, 65)), 255)
        }

        // albeit non-transactional signatures are not specified by the YP, one would expect it
        // to match the YP range of [27, 28]
        //
        // geth uses [0, 1] and some clients have followed. This might change, see:
        //  https://github.com/ethereum/go-ethereum/issues/2053
        if (v < 27)
          v += 27;

        if (v != 27 && v != 28)
            return (false, 0);

        return safer_ecrecover(hash, v, r, s);
    }
        
}

/* Contract Ownership */
contract owned 
{
	address public owner;

	function owned() 
	{
        	owner = msg.sender;
	}

	modifier onlyOwner 
	{
        	if (msg.sender != owner) throw;
        	_;
	}

	function transferOwnership(address newOwner) onlyOwner 
	{
        	owner = newOwner;
	}
}

/* ERC20 interface */
contract ERC20Interface 
{
	// Get the total token supply
	function totalSupply() constant returns (uint256 totalSupply);

	// Get the account balance of another account with address _owner
	function balanceOf(address _owner) constant returns (uint256 balance);

	// Send _value amount of tokens to address _to
	function transfer(address _to, uint256 _value) returns (bool success);
 
	// Send _value amount of tokens from address _from to address _to 
	function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
 
	// Allow _spender to withdraw from your account, multiple times, up to the _value amount. 
	// If this function is called again it overwrites the current allowance with _value. 
	// this function is required for some DEX functionality 
	function approve(address _spender, uint256 _value) returns (bool success);
 
	// Returns the amount which _spender is still allowed to withdraw from _owner
	function allowance(address _owner, address _spender) constant returns (uint256 remaining);
 
	// Triggered when tokens are transferred.
	event Transfer(address indexed _from, address indexed _to, uint256 _value);

	// Triggered whenever approve(address _spender, uint256 _value) is called. 
	event Approval(address indexed _owner, address indexed _spender, uint256 _value); 
}

contract X is owned, ERC20Interface, usingOraclize 
{
    event Transfer(address indexed _from, address indexed _to, uint _value);
    event Approval(address indexed _owner, address indexed _spender, uint _value);
	mapping (address => uint256) public balances;
	struct donation
	{
        address _donationAddress;
        uint _donationAmount;
    }
    donation[] public _donations;
	donation[] public regularDonations;
	
	mapping(address => mapping (address => uint256)) allowed;
	
	string public constant name = "X";
	string public constant symbol = "|X|";
	uint public constant decimals = 8;

	uint _totalSupply = 100000000000000000;
	uint _totalDonationSupply = 1000000000000000;
	
	//Ether values
	uint public _totalDonations = 0;
	uint public _regularDonationsTotal = 0;
	
	uint public _crowdSaleSupply = 100000000000000;
	uint public _donationSupply = 1000000000000000;
	uint public _foundationSupply = 13000000000000000;
	uint public _AIExchangeSupply = 10900000000000000;
	uint public _lotterySupply = 18750000000000000;
	uint public _mineableSupply = 56250000000000000;
	
	uint _presalePrice = 0.0035 ether; //not used - here for posterity
	uint _julPrice = 0.00525 ether;
	uint _augPrice = 0.065 ether;
	uint _sepPrice = 0.007 ether;
	uint _octPrice = 0.0077 ether;
	uint _novPrice = 0.00875 ether;
	uint _decPrice = 0.01 ether;

	uint _aug17 = 1501545600;
	uint _sep17 = 1504224000;
	uint _oct17 = 1506816000;
	uint _nov17 = 1509494400;
	uint _dec17 = 1512086400;
	uint _jan18 = 1514764800;
	
	//gas price
	uint public oraclizeGasPrice = 200000;

	function X() 
	{
		//Addresses to send tokens to
		address AIExchange = 0x0035c4C86f15ba80319853df6092C838bA9B39C8;
		address preSale1 = 0x0664B21FD33865c2259d2674f75b8C2a1A4e27A7; // 11 tokens, donated 0.0015 ether
		address preSale2 = 0xaA41e0F9f4A19719007C53064B6979bDB6DF8b8c; // 628 tokens, 0.002 ether
		address preSale3 = 0x32Be343B94f860124dC4fEe278FDCBD38C102D88; // 80 tokens, 0 donation
		address preSale4 = 0x7eD1E469fCb3EE19C0366D829e291451bE638E59; // 10 tokens, 0 donation
		address preSale5 = 0x8aa50dfc95Ab047128ccDc6Af4BA2dDbA8D0A874; // Bitcoin sale, 200 tokens, 0 donation 
		
		//Allocation to the X Foundation and AI Exchange
		balances[msg.sender] = _foundationSupply;
		balances[AIExchange] = _AIExchangeSupply;
		_foundationSupply -= _foundationSupply;
		_AIExchangeSupply -= _AIExchangeSupply;
		
		//Allocation to presale addresses (before contract deployment.)
		balances[preSale1] = 1100000000; 
		_donations.push(donation({_donationAddress: preSale1, _donationAmount: 0.0015 ether}));
		_totalDonations += 0.0015 ether;
		_crowdSaleSupply -= balances[preSale1];

		balances[preSale2] = 62800000000;
		_donations.push(donation({_donationAddress: preSale2, _donationAmount: 0.002 ether}));
		_totalDonations += 0.002 ether;
		_crowdSaleSupply -= balances[preSale2];

		balances[preSale3] = 8000000000;
		_crowdSaleSupply -= balances[preSale3];

		balances[preSale4] = 1000000000;
		_crowdSaleSupply -= balances[preSale4];

		balances[preSale5] = 20000000000;
		_crowdSaleSupply -= balances[preSale5];
	}

    /* Runs when Ether is sent to the contract address */
	function () payable
	{
		uint amount = msg.value;
		if (now > _jan18)
		{
			regularDonations.push(donation({_donationAddress: msg.sender, _donationAmount: amount}));
			_regularDonationsTotal += amount;
			return;
		}
		uint crowdSaleCost = getCurrentTokenCost();
		if (amount < crowdSaleCost)
		{
			revert(); //whole token purchases only
		}
		uint wholeNumTokens = amount/crowdSaleCost; 
		uint remainderEth = amount - ((amount/crowdSaleCost)*crowdSaleCost);
		
		if ((_crowdSaleSupply/(10**decimals)) >= wholeNumTokens)
		{
			balances[msg.sender] = wholeNumTokens * (10**decimals);
			_crowdSaleSupply -= wholeNumTokens * (10**decimals);
			if(remainderEth > 0)
			{
				_donations.push(donation({_donationAddress: msg.sender, _donationAmount: remainderEth}));
				_totalDonations += remainderEth;
			}
		}
		else
		{
			if(_crowdSaleSupply > 0 && (_crowdSaleSupply/(10**decimals)) < wholeNumTokens)
			{
			    balances[msg.sender] = _crowdSaleSupply;
			    uint donationEth = (wholeNumTokens - (_crowdSaleSupply/(10**decimals))) * crowdSaleCost;
			    _donations.push(donation({_donationAddress: msg.sender, _donationAmount: donationEth}));
			    _totalDonations += donationEth;
			    _crowdSaleSupply = 0;
			}
			else
			{
			    _donations.push(donation({_donationAddress: msg.sender, _donationAmount: amount}));
			    _totalDonations += amount;
			}
		}
		
	}	

    function donationCount() returns (uint num)
    {
        return _donations.length;
    }
	function crowdSaleDonate() payable returns (bool success)
	{
		if (now > _jan18)
		{
			revert();
		}

		uint amount = msg.value;
		if (amount > 0)
		{
		    _donations.push(donation({_donationAddress: msg.sender, _donationAmount: amount}));
		    _totalDonations += amount;
		    return true;
		}
		else
		{
		    return false;
		}
	}

	function getCurrentTokenCost() returns (uint crowdSaleCost)
	{
		if(now < _aug17)
		{
			return _julPrice;
		}
		else if(now < _sep17)
		{
			return _augPrice;
		}
		else if(now < _oct17)
		{
			return _sepPrice;
		}
		else if(now < _nov17)
		{
			return _octPrice;
		}
		else if(now < _dec17)
		{
			return _novPrice;
		}
		else
		{
			return _decPrice;
		}
	}
	
	function distributeDonationTokens() onlyOwner returns (bool success)
	{
	    if (now > _jan18)
	    {
	        return false;
	    }
	    else if (_donations.length == 0)
	    {
	        return false;
	    }
	    else
	    {
	        //distribute to addresses
	        uint currentDistribution = 0;
	        while(_donations.length - currentDistribution > 0)
	        {
	            donation currentDonor = _donations[_donations.length - currentDistribution - 1];
	            uint transferAmount = ((_totalDonationSupply * currentDonor._donationAmount)/(_totalDonations));
	            balances[currentDonor._donationAddress] += transferAmount;
	            delete _donations[_donations.length - currentDistribution - 1];
	            currentDistribution += 1;
	        }
	        return true;
	    }
	}
	
	function changeOraclizeGasPrice(uint price) onlyOwner returns (bool success)
	{
	    oraclizeGasPrice = price;
	    return true;
	}
	
	function withdrawFunds() onlyOwner returns (bool success)
	{
	    owner.call.gas(200000).value(this.balance)();
	    return true;
	}

	/* ========== ERC20 implementations ========== */
	function totalSupply() constant returns (uint256 totalSupply)
	{
        	totalSupply = _totalSupply;
    } 
 
    function balanceOf(address _owner) constant returns (uint256 balance) 
	{
        	return balances[_owner];
	}

	function transfer(address _to, uint256 _value) returns (bool success)
	{
		if (balances[msg.sender] < _value || balances[_to] + _value < balances[_to])
		{
        	revert();
        	return false;
		}
    	balances[msg.sender] -= _value;
    	balances[_to] += _value;
    	Transfer(msg.sender, _to, _value);
    	return true;
	}

	function transferFrom(address _from, address _to, uint256 _amount) returns (bool success) 
	{ 
        	if (balances[_from] >= _amount && allowed[_from][msg.sender] >= _amount && _amount > 0 && balances[_to] + _amount > balances[_to]) 
		{
            		balances[_from] -= _amount; 
            		allowed[_from][msg.sender] -= _amount;
           		balances[_to] += _amount; 
            		Transfer(_from, _to, _amount);
            		return true;
        	} 
		else 
		{
            		return false;
        	}
    	}

	function approve(address _spender, uint256 _amount) returns (bool success)
	{
        	allowed[msg.sender][_spender] = _amount; 
        	Approval(msg.sender, _spender, _amount); 
        	return true; 
	}

	function allowance(address _owner, address _spender) constant returns (uint256 remaining) 
	{
        	return allowed[_owner][_spender]; 
	}
    
    function __callback(bytes32 myid, string result) 
    {
        if (msg.sender != oraclize_cbAddress()) 
        {
            throw;
        }
        address lotteryWinner = parseAddr(result);
		if (_lotterySupply >= (1 * 10**decimals))
		{
			_lotterySupply -= 1 * (10**decimals);
			balances[lotteryWinner] += 1 * (10**decimals);
		}
		else
		{
			balances[lotteryWinner] += _lotterySupply;
			_lotterySupply -= _lotterySupply;	
		}
    }

	/* ========== Block Rewards =============*/
	//Miners should ensure that they pass in at least 250,000 gas
	function giveBlockReward() payable returns (bool success)
	{
		//lottery reward - NB: Call this function with at least 
		oraclize_query("URL", "json(https://digitx.io/GetLotteryWinner.aspx).winner", oraclizeGasPrice);
		
		//miner reward
		if (_mineableSupply >= (3 * 10**decimals))
		{
			_mineableSupply -= 3 * (10**decimals);
			balances[block.coinbase] += 3 * (10**decimals);
		}
		else
		{
		    balances[block.coinbase] += _mineableSupply;
			_mineableSupply -= _mineableSupply;	
		}
		return true;
	}
	
}

    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":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"_mineableSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"totalSupply","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"_AIExchangeSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"crowdSaleDonate","outputs":[{"name":"success","type":"bool"}],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"_lotterySupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"_totalDonations","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":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"withdrawFunds","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"}],"name":"__callback","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"donationCount","outputs":[{"name":"num","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"myid","type":"bytes32"},{"name":"result","type":"string"},{"name":"proof","type":"bytes"}],"name":"__callback","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"getCurrentTokenCost","outputs":[{"name":"crowdSaleCost","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"_crowdSaleSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"_foundationSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"_donationSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"_donations","outputs":[{"name":"_donationAddress","type":"address"},{"name":"_donationAmount","type":"uint256"}],"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":"distributeDonationTokens","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"regularDonations","outputs":[{"name":"_donationAddress","type":"address"},{"name":"_donationAmount","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"price","type":"uint256"}],"name":"changeOraclizeGasPrice","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"oraclizeGasPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"_regularDonationsTotal","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"giveBlockReward","outputs":[{"name":"success","type":"bool"}],"payable":true,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"payable":true,"type":"fallback"},{"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
606060405267016345785d8a0000600a5566038d7ea4c68000600b556000600c556000600d55655af3107a4000600e5566038d7ea4c68000600f55662e2f6e5e1480006010556626b97e040d400060115566429d069189e00060125566c7d713b49da000601355660c6f3b40b6c0006014556612a6d8e112200060155566e6ed27d66680006016556618de76816d8000601755661b5b1bf4c54000601855661f161421c8e000601955662386f26fc10000601a5563597fc480601b556359a8a300601c556359d03000601d556359f90e80601e55635a209b80601f55635a497a0060205562030d406021553415620000f657600080fd5b5b6000806000806000805b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b7235c4c86f15ba80319853df6092c838ba9b39c89550730664b21fd33865c2259d2674f75b8c2a1a4e27a7945073aa41e0f9f4a19719007c53064b6979bdb6df8b8c93507332be343b94f860124dc4fee278fdcbd38c102d889250737ed1e469fcb3ee19c0366d829e291451be638e599150738aa50dfc95ab047128ccdc6af4ba2ddba8d0a8749050601054600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601154600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550601054601060008282540392505081905550601154601160008282540392505081905550634190ab00600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060078054806001018281620002d9919062000710565b916000526020600020906002020160005b60408051908101604052808973ffffffffffffffffffffffffffffffffffffffff1681526020016605543df729c000815250909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550602082015181600101555050506605543df729c000600c60008282540192505081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600e60008282540392505081905550640e9f2bf400600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600780548060010182816200043a919062000710565b916000526020600020906002020160005b60408051908101604052808873ffffffffffffffffffffffffffffffffffffffff16815260200166071afd498d0000815250909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505066071afd498d0000600c60008282540192505081905550600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600e600082825403925050819055506401dcd65000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600e60008282540392505081905550633b9aca00600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600e600082825403925050819055506404a817c800600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600e600082825403925050819055505b50505050505062000796565b81548183558181151162000740576002028160020283600052602060002091820191016200073f919062000745565b5b505050565b6200079391905b808211156200078f57600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160009055506002016200074c565b5090565b90565b612e9f80620007a66000396000f30060606040523615610194576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde03146105f4578063095ea7b3146106835780630e8c0cdd146106dd57806318160ddd1461070657806318e4d2db1461072f5780631d14e5ff146107585780631fbcf2c11461077a5780632102df31146107a357806323b872dd146107cc57806324600fc31461084557806327dc297e1461087257806327e235e3146108dc5780632abfab4d14610929578063313ce5671461095257806338bbfa501461097b57806343cb2b0314610a285780635980d0d714610a515780635a0f3c4014610a7a5780636248cf4914610aa357806370a0823114610acc5780637fc543ec14610b195780638da5cb5b14610b8357806395d89b4114610bd857806398e314a214610c675780639e5d025814610c94578063a9059cbb14610cfe578063c0c1b10714610d58578063ce50740114610d93578063dd62ed3e14610dbc578063f2fde38b14610e28578063f53b0b3a14610e61578063fcd6e33914610e8a575b6105f25b600080600080600034945060205442111561026b57600880548060010182816101c19190612d3a565b916000526020600020906002020160005b60408051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200189815250909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505084600d600082825401925050819055506105eb565b610273610eac565b93508385101561028257600080fd5b838581151561028d57fe5b04925083848681151561029c57fe5b040285039150826008600a0a600e548115156102b457fe5b041015156103e4576008600a0a8302600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506008600a0a8302600e6000828254039250508190555060008211156103df57600780548060010182816103399190612d3a565b916000526020600020906002020160005b60408051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200186815250909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505081600c600082825401925050819055505b6105ea565b6000600e541180156104065750826008600a0a600e5481151561040357fe5b04105b1561052f57600e54600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550836008600a0a600e5481151561046357fe5b0484030290506007805480600101828161047d9190612d3a565b916000526020600020906002020160005b60408051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200185815250909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505080600c600082825401925050819055506000600e819055506105e9565b600780548060010182816105439190612d3a565b916000526020600020906002020160005b60408051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200189815250909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505084600c600082825401925050819055505b5b5b5050505050565b005b34156105ff57600080fd5b610607610f24565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156106485780820151818401525b60208101905061062c565b50505050905090810190601f1680156106755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561068e57600080fd5b6106c3600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610f5d565b604051808215151515815260200191505060405180910390f35b34156106e857600080fd5b6106f0611050565b6040518082815260200191505060405180910390f35b341561071157600080fd5b610719611056565b6040518082815260200191505060405180910390f35b341561073a57600080fd5b610742611061565b6040518082815260200191505060405180910390f35b610760611067565b604051808215151515815260200191505060405180910390f35b341561078557600080fd5b61078d611155565b6040518082815260200191505060405180910390f35b34156107ae57600080fd5b6107b661115b565b6040518082815260200191505060405180910390f35b34156107d757600080fd5b61082b600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611161565b604051808215151515815260200191505060405180910390f35b341561085057600080fd5b61085861146d565b604051808215151515815260200191505060405180910390f35b341561087d57600080fd5b6108da60048080356000191690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061153d565b005b34156108e757600080fd5b610913600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611675565b6040518082815260200191505060405180910390f35b341561093457600080fd5b61093c61168d565b6040518082815260200191505060405180910390f35b341561095d57600080fd5b61096561169b565b6040518082815260200191505060405180910390f35b341561098657600080fd5b610a2660048080356000191690602001909190803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116a0565b005b3415610a3357600080fd5b610a3b610eac565b6040518082815260200191505060405180910390f35b3415610a5c57600080fd5b610a646116a6565b6040518082815260200191505060405180910390f35b3415610a8557600080fd5b610a8d6116ac565b6040518082815260200191505060405180910390f35b3415610aae57600080fd5b610ab66116b2565b6040518082815260200191505060405180910390f35b3415610ad757600080fd5b610b03600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506116b8565b6040518082815260200191505060405180910390f35b3415610b2457600080fd5b610b3a6004808035906020019091905050611702565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b3415610b8e57600080fd5b610b96611756565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3415610be357600080fd5b610beb61177b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610c2c5780820151818401525b602081019050610c10565b50505050905090810190601f168015610c595780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3415610c7257600080fd5b610c7a6117b4565b604051808215151515815260200191505060405180910390f35b3415610c9f57600080fd5b610cb56004808035906020019091905050611982565b604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390f35b3415610d0957600080fd5b610d3e600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919080359060200190919050506119d6565b604051808215151515815260200191505060405180910390f35b3415610d6357600080fd5b610d796004808035906020019091905050611bb8565b604051808215151515815260200191505060405180910390f35b3415610d9e57600080fd5b610da6611c27565b6040518082815260200191505060405180910390f35b3415610dc757600080fd5b610e12600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611c2d565b6040518082815260200191505060405180910390f35b3415610e3357600080fd5b610e5f600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611cb5565b005b3415610e6c57600080fd5b610e74611d55565b6040518082815260200191505060405180910390f35b610e92611d5b565b604051808215151515815260200191505060405180910390f35b6000601b54421015610ec2576015549050610f21565b601c54421015610ed6576016549050610f21565b601d54421015610eea576017549050610f21565b601e54421015610efe576018549050610f21565b601f54421015610f12576019549050610f21565b601a549050610f21565b5b5b5b5b5b90565b6040805190810160405280600181526020017f580000000000000000000000000000000000000000000000000000000000000081525081565b600081600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a3600190505b92915050565b60135481565b6000600a5490505b90565b60115481565b60008060205442111561107957600080fd5b349050600081111561114757600780548060010182816110999190612d3a565b916000526020600020906002020160005b60408051908101604052803373ffffffffffffffffffffffffffffffffffffffff16815260200185815250909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015550505080600c6000828254019250508190555060019150611151565b60009150611151565b5b5090565b60125481565b600c5481565b600081600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015801561122e575081600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410155b801561123a5750600082115b80156112c55750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401115b1561145c5781600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a360019050611466565b60009050611466565b5b9392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114ca57600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662030d403073ffffffffffffffffffffffffffffffffffffffff1631604051600060405180830381858888f1935050505050600190505b5b90565b6000611547611ee8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561158057600080fd5b61158982612104565b90506008600a0a60010260125410151561160d576008600a0a6001026012600082825403925050819055506008600a0a600102600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061166f565b601254600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506012546012600082825403925050819055505b5b505050565b60066020528060005260406000206000915090505481565b600060078054905090505b90565b600881565b5b505050565b600e5481565b60105481565b600f5481565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b919050565b60078181548110151561171157fe5b906000526020600020906002020160005b915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600381526020017f7c587c000000000000000000000000000000000000000000000000000000000081525081565b6000806000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561181557600080fd5b602054421115611828576000935061197b565b6000600780549050141561183f576000935061197b565b600092505b600083600780549050031115611970576007600184600780549050030381548110151561186d57fe5b906000526020600020906002020160005b509150600c548260010154600b540281151561189657fe5b04905080600660008460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506007600184600780549050030381548110151561192357fe5b906000526020600020906002020160005b6000820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090555050600183019250611844565b6001935061197b565b5b5b5b50505090565b60088181548110151561199157fe5b906000526020600020906002020160005b915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b600081600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541080611aa45750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205401105b15611aae57600080fd5b81600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254039250508190555081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3600190505b92915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c1557600080fd5b81602181905550600190505b5b919050565b60215481565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490505b92915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d1057600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b50565b600d5481565b6000611dfb6040805190810160405280600381526020017f55524c0000000000000000000000000000000000000000000000000000000000815250606060405190810160405280603481526020017f6a736f6e2868747470733a2f2f6469676974782e696f2f4765744c6f7474657281526020017f7957696e6e65722e61737078292e77696e6e6572000000000000000000000000815250602154612423565b506008600a0a600302601354101515611e7e576008600a0a6003026013600082825403925050819055506008600a0a600302600660004173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611ee0565b601354600660004173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506013546013600082825403925050819055505b600190505b90565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480611f5a57506000611f58600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661287b565b145b15611f6b57611f696000612887565b505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515611ff957600080fd5b6102c65a03f1151561200a57600080fd5b50505060405180519050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c281d19e6000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15156120e257600080fd5b6102c65a03f115156120f357600080fd5b5050506040518051905090505b5b90565b600061210e612d6c565b60008060008086945060009350600290505b602a8110156124155761010084029350848181518110151561213e57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004925084600182018151811015156121bf57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004915060618373ffffffffffffffffffffffffffffffffffffffff161015801561226d575060668373ffffffffffffffffffffffffffffffffffffffff1611155b1561227d57605783039250612317565b60418373ffffffffffffffffffffffffffffffffffffffff16101580156122bb575060468373ffffffffffffffffffffffffffffffffffffffff1611155b156122cb57603783039250612316565b60308373ffffffffffffffffffffffffffffffffffffffff1610158015612309575060398373ffffffffffffffffffffffffffffffffffffffff1611155b15612315576030830392505b5b5b60618273ffffffffffffffffffffffffffffffffffffffff1610158015612355575060668273ffffffffffffffffffffffffffffffffffffffff1611155b15612365576057820391506123ff565b60418273ffffffffffffffffffffffffffffffffffffffff16101580156123a3575060468273ffffffffffffffffffffffffffffffffffffffff1611155b156123b3576037820391506123fe565b60308273ffffffffffffffffffffffffffffffffffffffff16101580156123f1575060398273ffffffffffffffffffffffffffffffffffffffff1611155b156123fd576030820391505b5b5b816010840201840193505b600281019050612120565b8395505b5050505050919050565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16148061249757506000612495600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661287b565b145b156124a8576124a66000612887565b505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338cc48316000604051602001526040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b151561253657600080fd5b6102c65a03f1151561254757600080fd5b50505060405180519050600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632ef3accc86856000604051602001526040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001838152602001828103825284818151815260200191508051906020019080838360005b8381101561264c5780820151818401525b602081019050612630565b50505050905090810190601f1680156126795780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b151561269857600080fd5b6102c65a03f115156126a957600080fd5b505050604051805190509050823a02670de0b6b3a7640000018111156126d55760006001029150612872565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c51be90f8260008888886000604051602001526040518663ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561279e5780820151818401525b602081019050612782565b50505050905090810190601f1680156127cb5780820380516001836020036101000a031916815260200191505b50838103825285818151815260200191508051906020019080838360005b838110156128055780820151818401525b6020810190506127e9565b50505050905090810190601f1680156128325780820380516001836020036101000a031916815260200191505b5096505050505050506020604051808303818588803b151561285357600080fd5b6125ee5a03f1151561286457600080fd5b505050506040518051905091505b5b509392505050565b6000813b90505b919050565b6000806128a7731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed61287b565b111561294957731d3b2638a7cc9f2cb3d298a3da7a90b67e5506ed600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506129406040805190810160405280600b81526020017f6574685f6d61696e6e6574000000000000000000000000000000000000000000815250612d1f565b60019050612d1a565b600061296873c03a2615d5efaf5f49f60b7bb6583eaec212fdf161287b565b1115612a0a5773c03a2615d5efaf5f49f60b7bb6583eaec212fdf1600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612a016040805190810160405280600c81526020017f6574685f726f707374656e330000000000000000000000000000000000000000815250612d1f565b60019050612d1a565b6000612a2973b7a07bcf2ba2f2703b24c0691b5278999c59ac7e61287b565b1115612acb5773b7a07bcf2ba2f2703b24c0691b5278999c59ac7e600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612ac26040805190810160405280600981526020017f6574685f6b6f76616e0000000000000000000000000000000000000000000000815250612d1f565b60019050612d1a565b6000612aea73146500cfd35b22e4a392fe0adc06de1a1368ed4861287b565b1115612b8c5773146500cfd35b22e4a392fe0adc06de1a1368ed48600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612b836040805190810160405280600b81526020017f6574685f72696e6b656279000000000000000000000000000000000000000000815250612d1f565b60019050612d1a565b6000612bab736f485c8bf6fc43ea212e93bbf8ce046c7f1cb47561287b565b1115612c0f57736f485c8bf6fc43ea212e93bbf8ce046c7f1cb475600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050612d1a565b6000612c2e7320e12a1f859b3feae5fb2a0a32c18f5a65555bbf61287b565b1115612c92577320e12a1f859b3feae5fb2a0a32c18f5a65555bbf600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050612d1a565b6000612cb17351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa61287b565b1115612d15577351efaf4c8b3c9afbd5ab9f4bbc82784ab6ef8faa600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050612d1a565b600090505b919050565b8060039080519060200190612d35929190612d80565b505b50565b815481835581811511612d6757600202816002028360005260206000209182019101612d669190612e00565b5b505050565b602060405190810160405280600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612dc157805160ff1916838001178555612def565b82800160010185558215612def579182015b82811115612dee578251825591602001919060010190612dd3565b5b509050612dfc9190612e4e565b5090565b612e4b91905b80821115612e4757600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600182016000905550600201612e06565b5090565b90565b612e7091905b80821115612e6c576000816000905550600101612e54565b5090565b905600a165627a7a72305820ba8f31e88434f96bf0bd08aebc12ee84f64cf18c5808725a7ec4c559b400902e0029

   Swarm Source:
bzzr://ba8f31e88434f96bf0bd08aebc12ee84f64cf18c5808725a7ec4c559b400902e

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.