ETH Price: $2,450.96 (-5.79%)
Gas: 6.73 Gwei

Contract

0x48EC5680EB030356FF12AD82Be1433a6992fFfe7
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x6080604063074392018-09-10 18:08:162213 days ago1536602896IN
 Create: CardstackToken
0 ETH0.1713152430

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CardstackToken

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

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

pragma solidity ^0.4.13;

library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

    c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // assert(_b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
    return _a / _b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    assert(_b <= _a);
    return _a - _b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    c = _a + _b;
    assert(c >= _a);
    return c;
  }
}

contract Initializable {

  /**
   * @dev Indicates if the contract has been initialized.
   */
  bool public initialized;

  /**
   * @dev Modifier to use in the initialization function of a contract.
   */
  modifier isInitializer() {
    require(!initialized, "Contract instance has already been initialized");
    _;
    initialized = true;
  }
}

contract Administratable {
  using SafeMath for uint256;

  // zOS requires that the variables are never removed nor order changed
  // Since this is a parent contract, no new variables can be added here
  address internal constant primaryInitializer = 0x0AEaF8c2Fe778797CD5464E7EB8351d28da2E823;
  address internal constant stagingInitializer = 0x1E65F71b024937b988fdba09814d60049e0Fc59d;
  address public owner;
  bool public adminsInitialized;
  address[] public adminsForIndex;
  address[] public superAdminsForIndex;
  mapping (address => bool) public admins;
  mapping (address => bool) public superAdmins;
  mapping (address => bool) private processedAdmin;
  mapping (address => bool) private processedSuperAdmin;

  event AddAdmin(address indexed admin);
  event RemoveAdmin(address indexed admin);
  event AddSuperAdmin(address indexed admin);
  event RemoveSuperAdmin(address indexed admin);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );

  modifier onlyInitializers() {
    require(msg.sender == primaryInitializer ||
            msg.sender == stagingInitializer);
    _;
  }

  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  modifier onlyAdmins {
    if (msg.sender != owner && !superAdmins[msg.sender] && !admins[msg.sender]) revert();
    _;
  }

  modifier onlySuperAdmins {
    if (msg.sender != owner && !superAdmins[msg.sender]) revert();
    _;
  }

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

  function addSuperAdmin(address admin) public onlySuperAdmins {
    _addSuperAdmin(admin);

    emit AddSuperAdmin(admin);
  }

  function removeSuperAdmin(address admin) public onlySuperAdmins {
    require(admin != address(0));
    superAdmins[admin] = false;

    emit RemoveSuperAdmin(admin);
  }

  function addAdmin(address admin) public onlySuperAdmins {
    require(admin != address(0));
    admins[admin] = true;
    if (!processedAdmin[admin]) {
      adminsForIndex.push(admin);
      processedAdmin[admin] = true;
    }

    emit AddAdmin(admin);
  }

  function removeAdmin(address admin) public onlySuperAdmins {
    require(admin != address(0));
    admins[admin] = false;

    emit RemoveAdmin(admin);
  }

  function transferOwnership(address _newOwner) public onlyOwner {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }

  function totalSuperAdminsMapping() public view returns (uint256) {
    return superAdminsForIndex.length;
  }

  function totalAdminsMapping() public view returns (uint256) {
    return adminsForIndex.length;
  }

  // Accepting a function param to set initial owner/admins
  // is a potential security vulnerability when using initialize
  // pattern (which is just a public function). So we hard-code
  // our initial admin addresses and use zOS to manage this list.
  function initializeAdmins() internal {
    require(!adminsInitialized, "Contract instance has already initialized the admins");

    owner = primaryInitializer;
    _addSuperAdmin(stagingInitializer);

    adminsInitialized = true;
  }

  function _addSuperAdmin(address admin) internal {
    require(admin != address(0));
    superAdmins[admin] = true;
    if (!processedSuperAdmin[admin]) {
      superAdminsForIndex.push(admin);
      processedSuperAdmin[admin] = true;
    }
  }


}

contract Configurable {
  function configureFromStorage() public returns (bool);
}

library CstLibrary {
  using SafeMath for uint256;

  function getTokenName(address _storage) public view returns(bytes32) {
    return ExternalStorage(_storage).getBytes32Value("cstTokenName");
  }

  function setTokenName(address _storage, bytes32 tokenName) public {
    ExternalStorage(_storage).setBytes32Value("cstTokenName", tokenName);
  }

  function getTokenSymbol(address _storage) public view returns(bytes32) {
    return ExternalStorage(_storage).getBytes32Value("cstTokenSymbol");
  }

  function setTokenSymbol(address _storage, bytes32 tokenName) public {
    ExternalStorage(_storage).setBytes32Value("cstTokenSymbol", tokenName);
  }

  function getBuyPrice(address _storage) public view returns(uint256) {
    return ExternalStorage(_storage).getUIntValue("cstBuyPrice");
  }

  function setBuyPrice(address _storage, uint256 value) public {
    ExternalStorage(_storage).setUIntValue("cstBuyPrice", value);
  }

  function getCirculationCap(address _storage) public view returns(uint256) {
    return ExternalStorage(_storage).getUIntValue("cstCirculationCap");
  }

  function setCirculationCap(address _storage, uint256 value) public {
    ExternalStorage(_storage).setUIntValue("cstCirculationCap", value);
  }

  function getBalanceLimit(address _storage) public view returns(uint256) {
    return ExternalStorage(_storage).getUIntValue("cstBalanceLimit");
  }

  function setBalanceLimit(address _storage, uint256 value) public {
    ExternalStorage(_storage).setUIntValue("cstBalanceLimit", value);
  }

  function getFoundation(address _storage) public view returns(address) {
    return ExternalStorage(_storage).getAddressValue("cstFoundation");
  }

  function setFoundation(address _storage, address value) public {
    ExternalStorage(_storage).setAddressValue("cstFoundation", value);
  }

  function getAllowance(address _storage, address account, address spender) public view returns (uint256) {
    return ExternalStorage(_storage).getMultiLedgerValue("cstAllowance", account, spender);
  }

  function setAllowance(address _storage, address account, address spender, uint256 allowance) public {
    ExternalStorage(_storage).setMultiLedgerValue("cstAllowance", account, spender, allowance);
  }

  function getCustomBuyerLimit(address _storage, address buyer) public view returns (uint256) {
    return ExternalStorage(_storage).getLedgerValue("cstCustomBuyerLimit", buyer);
  }

  function setCustomBuyerLimit(address _storage, address buyer, uint256 value) public {
    ExternalStorage(_storage).setLedgerValue("cstCustomBuyerLimit", buyer, value);
  }

  function getCustomBuyerForIndex(address _storage, uint256 index) public view returns (address) {
    return ExternalStorage(_storage).ledgerEntryForIndex(keccak256("cstCustomBuyerLimit"), index);
  }

  function getCustomBuyerMappingCount(address _storage) public view returns(uint256) {
    return ExternalStorage(_storage).getLedgerCount("cstCustomBuyerLimit");
  }

  function getApprovedBuyer(address _storage, address buyer) public view returns (bool) {
    return ExternalStorage(_storage).getBooleanMapValue("cstApprovedBuyer", buyer);
  }

  function setApprovedBuyer(address _storage, address buyer, bool value) public {
    ExternalStorage(_storage).setBooleanMapValue("cstApprovedBuyer", buyer, value);
  }

  function getApprovedBuyerForIndex(address _storage, uint256 index) public view returns (address) {
    return ExternalStorage(_storage).booleanMapEntryForIndex(keccak256("cstApprovedBuyer"), index);
  }

  function getApprovedBuyerMappingCount(address _storage) public view returns(uint256) {
    return ExternalStorage(_storage).getBooleanMapCount("cstApprovedBuyer");
  }

  function getTotalUnvestedAndUnreleasedTokens(address _storage) public view returns(uint256) {
    return ExternalStorage(_storage).getUIntValue("cstUnvestedAndUnreleasedTokens");
  }

  function setTotalUnvestedAndUnreleasedTokens(address _storage, uint256 value) public {
    ExternalStorage(_storage).setUIntValue("cstUnvestedAndUnreleasedTokens", value);
  }

  function vestingMappingSize(address _storage) public view returns(uint256) {
    return ExternalStorage(_storage).getLedgerCount("cstFullyVestedAmount");
  }

  function vestingBeneficiaryForIndex(address _storage, uint256 index) public view returns(address) {
    return ExternalStorage(_storage).ledgerEntryForIndex(keccak256("cstFullyVestedAmount"), index);
  }

  function releasableAmount(address _storage, address beneficiary) public view returns (uint256) {
    uint256 releasedAmount = getVestingReleasedAmount(_storage, beneficiary);
    return vestedAvailableAmount(_storage, beneficiary).sub(releasedAmount);
  }

  function vestedAvailableAmount(address _storage, address beneficiary) public view returns (uint256) {
    uint256 start = getVestingStart(_storage, beneficiary);
    uint256 fullyVestedAmount = getFullyVestedAmount(_storage, beneficiary);

    if (start == 0 || fullyVestedAmount == 0) {
      return 0;
    }

    uint256 duration = getVestingDuration(_storage, beneficiary);
    if (duration == 0) {
      return 0;
    }
    uint256 cliff = getVestingCliff(_storage, beneficiary);
    uint256 revokeDate = getVestingRevokeDate(_storage, beneficiary);

    if (now < cliff || (revokeDate > 0 && revokeDate < cliff)) {
      return 0;
    } else if (revokeDate > 0 && revokeDate > cliff) {
      return fullyVestedAmount.mul(revokeDate.sub(start)).div(duration);
    } else if (now >= start.add(duration)) {
      return fullyVestedAmount;
    } else {
      return fullyVestedAmount.mul(now.sub(start)).div(duration);
    }
  }

  function vestedAmount(address _storage, address beneficiary) public view returns (uint256) {
    uint256 start = getVestingStart(_storage, beneficiary);
    uint256 fullyVestedAmount = getFullyVestedAmount(_storage, beneficiary);

    if (start == 0 || fullyVestedAmount == 0) {
      return 0;
    }

    uint256 duration = getVestingDuration(_storage, beneficiary);
    if (duration == 0) {
      return 0;
    }

    uint256 revokeDate = getVestingRevokeDate(_storage, beneficiary);

    if (now <= start) {
      return 0;
    } else if (revokeDate > 0) {
      return fullyVestedAmount.mul(revokeDate.sub(start)).div(duration);
    } else if (now >= start.add(duration)) {
      return fullyVestedAmount;
    } else {
      return fullyVestedAmount.mul(now.sub(start)).div(duration);
    }
  }

  function canGrantVestedTokens(address _storage, address beneficiary) public view returns (bool) {
    uint256 existingFullyVestedAmount = getFullyVestedAmount(_storage, beneficiary);
    if (existingFullyVestedAmount == 0) {
      return true;
    }

    uint256 existingVestedAmount = vestedAvailableAmount(_storage, beneficiary);
    uint256 existingReleasedAmount = getVestingReleasedAmount(_storage, beneficiary);
    uint256 revokeDate = getVestingRevokeDate(_storage, beneficiary);

    if (revokeDate > 0 ||
        (existingVestedAmount == existingFullyVestedAmount &&
        existingReleasedAmount == existingFullyVestedAmount)) {
      return true;
    }

    return false;
  }

  function canRevokeVesting(address _storage, address beneficiary) public view returns (bool) {
    bool isRevocable = getVestingRevocable(_storage, beneficiary);
    uint256 revokeDate = getVestingRevokeDate(_storage, beneficiary);
    uint256 start = getVestingStart(_storage, beneficiary);
    uint256 duration = getVestingDuration(_storage, beneficiary);

    return start > 0 &&
           isRevocable &&
           revokeDate == 0 &&
           now < start.add(duration);
  }

  function revokeVesting(address _storage, address beneficiary) public {
    require(canRevokeVesting(_storage, beneficiary));

    uint256 totalUnvestedAndUnreleasedAmount = getTotalUnvestedAndUnreleasedTokens(_storage);
    uint256 unvestedAmount = getFullyVestedAmount(_storage, beneficiary).sub(vestedAvailableAmount(_storage, beneficiary));

    setVestingRevokeDate(_storage, beneficiary, now);
    setTotalUnvestedAndUnreleasedTokens(_storage, totalUnvestedAndUnreleasedAmount.sub(unvestedAmount));
  }

  function getVestingSchedule(address _storage, address _beneficiary) public
                                                                      view returns (uint256 startDate,
                                                                                        uint256 cliffDate,
                                                                                        uint256 durationSec,
                                                                                        uint256 fullyVestedAmount,
                                                                                        uint256 releasedAmount,
                                                                                        uint256 revokeDate,
                                                                                        bool isRevocable) {
    startDate         = getVestingStart(_storage, _beneficiary);
    cliffDate         = getVestingCliff(_storage, _beneficiary);
    durationSec       = getVestingDuration(_storage, _beneficiary);
    fullyVestedAmount = getFullyVestedAmount(_storage, _beneficiary);
    releasedAmount    = getVestingReleasedAmount(_storage, _beneficiary);
    revokeDate        = getVestingRevokeDate(_storage, _beneficiary);
    isRevocable       = getVestingRevocable(_storage, _beneficiary);
  }

  function setVestingSchedule(address _storage,
                              address beneficiary,
                              uint256 fullyVestedAmount,
                              uint256 startDate,
                              uint256 cliffDate,
                              uint256 duration,
                              bool isRevocable) public {
    require(canGrantVestedTokens(_storage, beneficiary));

    uint256 totalUnvestedAndUnreleasedAmount = getTotalUnvestedAndUnreleasedTokens(_storage);
    setTotalUnvestedAndUnreleasedTokens(_storage, totalUnvestedAndUnreleasedAmount.add(fullyVestedAmount));

    ExternalStorage(_storage).setLedgerValue("cstVestingStart", beneficiary, startDate);
    ExternalStorage(_storage).setLedgerValue("cstVestingCliff", beneficiary, cliffDate);
    ExternalStorage(_storage).setLedgerValue("cstVestingDuration", beneficiary, duration);
    ExternalStorage(_storage).setLedgerValue("cstFullyVestedAmount", beneficiary, fullyVestedAmount);
    ExternalStorage(_storage).setBooleanMapValue("cstVestingRevocable", beneficiary, isRevocable);

    setVestingRevokeDate(_storage, beneficiary, 0);
    setVestingReleasedAmount(_storage, beneficiary, 0);
  }

  function releaseVestedTokens(address _storage, address beneficiary) public {
    uint256 unreleased = releasableAmount(_storage, beneficiary);
    uint256 releasedAmount = getVestingReleasedAmount(_storage, beneficiary);
    uint256 totalUnvestedAndUnreleasedAmount = getTotalUnvestedAndUnreleasedTokens(_storage);

    releasedAmount = releasedAmount.add(unreleased);
    setVestingReleasedAmount(_storage, beneficiary, releasedAmount);
    setTotalUnvestedAndUnreleasedTokens(_storage, totalUnvestedAndUnreleasedAmount.sub(unreleased));
  }

  function getVestingStart(address _storage, address beneficiary) public view returns(uint256) {
    return ExternalStorage(_storage).getLedgerValue("cstVestingStart", beneficiary);
  }

  function getVestingCliff(address _storage, address beneficiary) public view returns(uint256) {
    return ExternalStorage(_storage).getLedgerValue("cstVestingCliff", beneficiary);
  }

  function getVestingDuration(address _storage, address beneficiary) public view returns(uint256) {
    return ExternalStorage(_storage).getLedgerValue("cstVestingDuration", beneficiary);
  }

  function getFullyVestedAmount(address _storage, address beneficiary) public view returns(uint256) {
    return ExternalStorage(_storage).getLedgerValue("cstFullyVestedAmount", beneficiary);
  }

  function getVestingRevocable(address _storage, address beneficiary) public view returns(bool) {
    return ExternalStorage(_storage).getBooleanMapValue("cstVestingRevocable", beneficiary);
  }

  function setVestingReleasedAmount(address _storage, address beneficiary, uint256 value) public {
    ExternalStorage(_storage).setLedgerValue("cstVestingReleasedAmount", beneficiary, value);
  }

  function getVestingReleasedAmount(address _storage, address beneficiary) public view returns(uint256) {
    return ExternalStorage(_storage).getLedgerValue("cstVestingReleasedAmount", beneficiary);
  }

  function setVestingRevokeDate(address _storage, address beneficiary, uint256 value) public {
    ExternalStorage(_storage).setLedgerValue("cstVestingRevokeDate", beneficiary, value);
  }

  function getVestingRevokeDate(address _storage, address beneficiary) public view returns(uint256) {
    return ExternalStorage(_storage).getLedgerValue("cstVestingRevokeDate", beneficiary);
  }

  function getRewardsContractHash(address _storage) public view returns (bytes32) {
    return ExternalStorage(_storage).getBytes32Value("cstRewardsContractHash");
  }

  function setRewardsContractHash(address _storage, bytes32 rewardsContractHash) public {
    ExternalStorage(_storage).setBytes32Value("cstRewardsContractHash", rewardsContractHash);
  }

}

contract Displayable {
  function bytes32ToString(bytes32 x) public pure returns (string) {
    bytes memory bytesString = new bytes(32);
    uint256 charCount = 0;
    for (uint256 j = 0; j < 32; j++) {
      if (x[j] != 0) {
        bytesString[charCount] = x[j];
        charCount++;
      }
    }
    bytes memory bytesStringTrimmed = new bytes(charCount);
    for (j = 0; j < charCount; j++) {
      bytesStringTrimmed[j] = bytesString[j];
    }
    return string(bytesStringTrimmed);
  }
}

contract ERC20 {
  function allowance(address owner, address spender) public view returns (uint256);
  function transferFrom(address from, address to, uint256 value) public returns (bool);
  function approve(address spender, uint256 value) public returns (bool);
  function totalSupply() public view returns (uint256);
  function balanceOf(address account) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed _from, address indexed _to, uint256 _value);
  event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

contract ExternalStorage is Administratable {
  using SafeMath for uint256;

  mapping(bytes32 => address[]) public primaryLedgerEntryForIndex;
  mapping(bytes32 => mapping(address => address[])) public secondaryLedgerEntryForIndex;
  mapping(bytes32 => address[]) public ledgerEntryForIndex;
  mapping(bytes32 => address[]) public booleanMapEntryForIndex;

  mapping(bytes32 => mapping(address => mapping(address => uint256))) private MultiLedgerStorage;
  mapping(bytes32 => mapping(address => bool)) private ledgerPrimaryEntries;
  mapping(bytes32 => mapping(address => mapping(address => bool))) private ledgerSecondaryEntries;
  mapping(bytes32 => mapping(address => uint256)) private LedgerStorage;
  mapping(bytes32 => mapping(address => bool)) private ledgerAccounts;
  mapping(bytes32 => mapping(address => bool)) private BooleanMapStorage;
  mapping(bytes32 => mapping(address => bool)) private booleanMapAccounts;
  mapping(bytes32 => uint256) private UIntStorage;
  mapping(bytes32 => bytes32) private Bytes32Storage;
  mapping(bytes32 => address) private AddressStorage;
  mapping(bytes32 => bytes) private BytesStorage;
  mapping(bytes32 => bool) private BooleanStorage;
  mapping(bytes32 => int256) private IntStorage;

  function getMultiLedgerValue(string record, address primaryAddress, address secondaryAddress) external view returns (uint256) {
    return MultiLedgerStorage[keccak256(abi.encodePacked(record))][primaryAddress][secondaryAddress];
  }

  function primaryLedgerCount(string record) external view returns (uint256) {
    return primaryLedgerEntryForIndex[keccak256(abi.encodePacked(record))].length;
  }

  function secondaryLedgerCount(string record, address primaryAddress) external view returns (uint256) {
    return secondaryLedgerEntryForIndex[keccak256(abi.encodePacked(record))][primaryAddress].length;
  }

  function setMultiLedgerValue(string record, address primaryAddress, address secondaryAddress, uint256 value) external onlyAdmins {
    bytes32 hash = keccak256(abi.encodePacked(record));
    if (!ledgerSecondaryEntries[hash][primaryAddress][secondaryAddress]) {
      secondaryLedgerEntryForIndex[hash][primaryAddress].push(secondaryAddress);
      ledgerSecondaryEntries[hash][primaryAddress][secondaryAddress] = true;

      if (!ledgerPrimaryEntries[hash][primaryAddress]) {
        primaryLedgerEntryForIndex[hash].push(primaryAddress);
        ledgerPrimaryEntries[hash][primaryAddress] = true;
      }
    }

    MultiLedgerStorage[hash][primaryAddress][secondaryAddress] = value;
  }

  function getLedgerValue(string record, address _address) external view returns (uint256) {
    return LedgerStorage[keccak256(abi.encodePacked(record))][_address];
  }

  function getLedgerCount(string record) external view returns (uint256) {
    return ledgerEntryForIndex[keccak256(abi.encodePacked(record))].length;
  }

  function setLedgerValue(string record, address _address, uint256 value) external onlyAdmins {
    bytes32 hash = keccak256(abi.encodePacked(record));
    if (!ledgerAccounts[hash][_address]) {
      ledgerEntryForIndex[hash].push(_address);
      ledgerAccounts[hash][_address] = true;
    }

    LedgerStorage[hash][_address] = value;
  }

  function getBooleanMapValue(string record, address _address) external view returns (bool) {
    return BooleanMapStorage[keccak256(abi.encodePacked(record))][_address];
  }

  function getBooleanMapCount(string record) external view returns (uint256) {
    return booleanMapEntryForIndex[keccak256(abi.encodePacked(record))].length;
  }

  function setBooleanMapValue(string record, address _address, bool value) external onlyAdmins {
    bytes32 hash = keccak256(abi.encodePacked(record));
    if (!booleanMapAccounts[hash][_address]) {
      booleanMapEntryForIndex[hash].push(_address);
      booleanMapAccounts[hash][_address] = true;
    }

    BooleanMapStorage[hash][_address] = value;
  }

  function getUIntValue(string record) external view returns (uint256) {
    return UIntStorage[keccak256(abi.encodePacked(record))];
  }

  function setUIntValue(string record, uint256 value) external onlyAdmins {
    UIntStorage[keccak256(abi.encodePacked(record))] = value;
  }

  function getBytes32Value(string record) external view returns (bytes32) {
    return Bytes32Storage[keccak256(abi.encodePacked(record))];
  }

  function setBytes32Value(string record, bytes32 value) external onlyAdmins {
    Bytes32Storage[keccak256(abi.encodePacked(record))] = value;
  }

  function getAddressValue(string record) external view returns (address) {
    return AddressStorage[keccak256(abi.encodePacked(record))];
  }

  function setAddressValue(string record, address value) external onlyAdmins {
    AddressStorage[keccak256(abi.encodePacked(record))] = value;
  }

  function getBytesValue(string record) external view returns (bytes) {
    return BytesStorage[keccak256(abi.encodePacked(record))];
  }

  function setBytesValue(string record, bytes value) external onlyAdmins {
    BytesStorage[keccak256(abi.encodePacked(record))] = value;
  }

  function getBooleanValue(string record) external view returns (bool) {
    return BooleanStorage[keccak256(abi.encodePacked(record))];
  }

  function setBooleanValue(string record, bool value) external onlyAdmins {
    BooleanStorage[keccak256(abi.encodePacked(record))] = value;
  }

  function getIntValue(string record) external view returns (int256) {
    return IntStorage[keccak256(abi.encodePacked(record))];
  }

  function setIntValue(string record, int256 value) external onlyAdmins {
    IntStorage[keccak256(abi.encodePacked(record))] = value;
  }
}

contract Freezable is Administratable {
  using SafeMath for uint256;

  // zOS requires that the variables are never removed nor order changed
  // Since this is a parent contract, no new variables can be added here
  bool public frozenToken;
  // TODO move this into external storage
  address[] public frozenAccountForIndex;
  mapping (address => bool) public frozenAccount;
  mapping (address => bool) private processedAccount;

  event FrozenFunds(address indexed target, bool frozen);
  event FrozenToken(bool frozen);

  modifier unlessFrozen {
    require(!frozenToken);
    require(!frozenAccount[msg.sender]);
    _;
  }

  function freezeAccount(address target, bool freeze) public onlySuperAdmins {
    frozenAccount[target] = freeze;
    if (!processedAccount[target]) {
      frozenAccountForIndex.push(target);
      processedAccount[target] = true;
    }
    emit FrozenFunds(target, freeze);
  }

  function freezeToken(bool freeze) public onlySuperAdmins {
    frozenToken = freeze;
    emit FrozenToken(frozenToken);
  }

  function totalFrozenAccountsMapping() public view returns(uint256) {
    return frozenAccountForIndex.length;
  }

}

contract IStorable {
  function getLedgerNameHash() external view returns (bytes32);
  function getStorageNameHash() external view returns (bytes32);
}

contract CardstackToken is ERC20,
                           Initializable,
                           Freezable,
                           Displayable,
                           Configurable,
                           IStorable {

  using SafeMath for uint256;
  using CstLibrary for address;

  /* zOS requires that the variables are never removed nor order changed
  /* BEGIN VARIABLES */
  uint8 public constant decimals = 18;
  string public constant version = "3";
  uint256 public constant tokenMaxCap = 6000000000000000000000000000; // 6 billion * 10^18

  ITokenLedger public tokenLedger;
  string public storageName;
  string public ledgerName;
  address public externalStorage;
  address public registry;
  bool public haltPurchase;
  uint256 public contributionMinimum;
  /* END VARIABLES */

  event Mint(uint256 amountMinted);
  event Approval(address indexed _owner,
                 address indexed _spender,
                 uint256 _value);
  event Transfer(address indexed _from,
                 address indexed _to,
                 uint256 _value);
  event WhiteList(address indexed buyer, uint256 holdCap);
  event RemoveWhitelistedBuyer(address indexed buyer);
  event ConfigChanged(uint256 buyPrice, uint256 circulationCap, uint256 balanceLimit);
  event VestedTokenGrant(address indexed beneficiary, uint256 startDate, uint256 cliffDate, uint256 durationSec, uint256 fullyVestedAmount, bool isRevocable);
  event VestedTokenRevocation(address indexed beneficiary);
  event VestedTokenRelease(address indexed beneficiary, uint256 amount);
  event StorageUpdated(address storageAddress, address ledgerAddress);
  event FoundationDeposit(uint256 amount);
  event FoundationWithdraw(uint256 amount);
  event PurchaseHalted();
  event PurchaseResumed();

  modifier onlyFoundation {
    address foundation = externalStorage.getFoundation();
    require(foundation != address(0));
    if (msg.sender != owner && msg.sender != foundation) revert();
    _;
  }

  modifier initStorage {
    address ledgerAddress = Registry(registry).getStorage(ledgerName);
    address storageAddress = Registry(registry).getStorage(storageName);

    tokenLedger = ITokenLedger(ledgerAddress);
    externalStorage = storageAddress;
    _;
  }

  function buy() external payable unlessFrozen returns (uint256) {
    require(!haltPurchase);
    require(externalStorage.getApprovedBuyer(msg.sender));

    uint256 _buyPriceTokensPerWei = externalStorage.getBuyPrice();
    uint256 _circulationCap = externalStorage.getCirculationCap();
    require(msg.value > 0);
    require(_buyPriceTokensPerWei > 0);
    require(_circulationCap > 0);

    uint256 amount = msg.value.mul(_buyPriceTokensPerWei);
    require(totalInCirculation().add(amount) <= _circulationCap);
    require(amount <= tokensAvailable());

    uint256 balanceLimit;
    uint256 buyerBalance = tokenLedger.balanceOf(msg.sender);
    uint256 customLimit = externalStorage.getCustomBuyerLimit(msg.sender);
    require(contributionMinimum == 0 || buyerBalance.add(amount) >= contributionMinimum);

    if (customLimit > 0) {
      balanceLimit = customLimit;
    } else {
      balanceLimit = externalStorage.getBalanceLimit();
    }

    require(balanceLimit > 0 && balanceLimit >= buyerBalance.add(amount));

    tokenLedger.debitAccount(msg.sender, amount);
    emit Transfer(this, msg.sender, amount);

    return amount;
  }

  function getLedgerNameHash() external view returns (bytes32) {
    return keccak256(abi.encodePacked(ledgerName));
  }

  function getStorageNameHash() external view returns (bytes32) {
    return keccak256(abi.encodePacked(storageName));
  }

  function initialize(address _registry, string _storageName, string _ledgerName) public onlyInitializers {
    initializeAdmins();
    _initialize(_registry, _storageName, _ledgerName);
  }

  function configure(bytes32 _tokenName,
                     bytes32 _tokenSymbol,
                     uint256 _buyPrice,
                     uint256 _circulationCap,
                     uint256 _balanceLimit,
                     address _foundation) public onlySuperAdmins initStorage returns (bool) {

    uint256 __buyPrice = externalStorage.getBuyPrice();
    if (__buyPrice > 0 && __buyPrice != _buyPrice) {
      require(frozenToken);
    }

    externalStorage.setTokenName(_tokenName);
    externalStorage.setTokenSymbol(_tokenSymbol);
    externalStorage.setBuyPrice(_buyPrice);
    externalStorage.setCirculationCap(_circulationCap);
    externalStorage.setFoundation(_foundation);
    externalStorage.setBalanceLimit(_balanceLimit);

    emit ConfigChanged(_buyPrice, _circulationCap, _balanceLimit);

    return true;
  }

  function configureFromStorage() public onlySuperAdmins initStorage returns (bool) {
    freezeToken(true);
    return true;
  }

  function updateStorage(string newStorageName, string newLedgerName) public onlySuperAdmins returns (bool) {
    require(frozenToken);

    storageName = newStorageName;
    ledgerName = newLedgerName;

    configureFromStorage();

    address ledgerAddress = Registry(registry).getStorage(ledgerName);
    address storageAddress = Registry(registry).getStorage(storageName);
    emit StorageUpdated(storageAddress, ledgerAddress);
    return true;
  }

  function transfer(address recipient, uint256 amount) public unlessFrozen returns (bool) {
    require(!frozenAccount[recipient]);

    tokenLedger.transfer(msg.sender, recipient, amount);
    emit Transfer(msg.sender, recipient, amount);

    return true;
  }

  function mintTokens(uint256 mintedAmount) public onlySuperAdmins returns (bool) {
    require(mintedAmount.add(totalSupply()) <= tokenMaxCap);
    require(mintedAmount > 0);

    tokenLedger.mintTokens(mintedAmount);

    emit Mint(mintedAmount);
    emit Transfer(address(0), this, mintedAmount);

    return true;
  }

  function grantTokens(address recipient, uint256 amount) public onlySuperAdmins returns (bool) {
    require(haltPurchase);
    require(!frozenAccount[recipient]);

    uint256 _circulationCap = externalStorage.getCirculationCap();
    require(totalInCirculation().add(amount) <= _circulationCap);
    require(amount <= tokensAvailable()); // assert the granted tokens doesnt exceed the totalSupply minus the fully vested amount of vesting tokens

    tokenLedger.debitAccount(recipient, amount);
    emit Transfer(this, recipient, amount);

    return true;
  }

  function setHaltPurchase(bool _haltPurchase) public onlySuperAdmins returns (bool) {
    haltPurchase = _haltPurchase;

    if (_haltPurchase) {
      emit PurchaseHalted();
    } else {
      emit PurchaseResumed();
    }
    return true;
  }

  // intentionally allowing this to work when token is frozen as foundation is a form of a super admin
  function foundationWithdraw(uint256 amount) public onlyFoundation returns (bool) {
    /* UNTRUSTED */
    msg.sender.transfer(amount);

    emit FoundationWithdraw(amount);
    return true;
  }

  function foundationDeposit() public payable unlessFrozen returns (bool) {
    emit FoundationDeposit(msg.value);

    return true;
  }

  function transferFrom(address from, address to, uint256 value) public unlessFrozen returns (bool) {
    require(!frozenAccount[from]);
    require(!frozenAccount[to]);
    require(from != msg.sender);

    uint256 allowanceValue = allowance(from, msg.sender);
    require(allowanceValue >= value);

    tokenLedger.transfer(from, to, value);
    externalStorage.setAllowance(from, msg.sender, allowanceValue.sub(value));

    emit Transfer(from, to, value);
    return true;
  }

  /* Beware that changing an allowance with this method brings the risk that someone may use both the old
   * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
   * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Please use `increaseApproval` or `decreaseApproval` instead.
   */
  function approve(address spender, uint256 value) public unlessFrozen returns (bool) {
    require(value == 0 || allowance(msg.sender, spender) == 0);

    return _approve(spender, value);
  }

  function increaseApproval(address spender, uint256 addedValue) public unlessFrozen returns (bool) {
    return _approve(spender, externalStorage.getAllowance(msg.sender, spender).add(addedValue));
  }

  function decreaseApproval(address spender, uint256 subtractedValue) public unlessFrozen returns (bool) {
    uint256 oldValue = externalStorage.getAllowance(msg.sender, spender);

    if (subtractedValue > oldValue) {
      return _approve(spender, 0);
    } else {
      return _approve(spender, oldValue.sub(subtractedValue));
    }
  }

  function grantVestedTokens(address beneficiary,
                             uint256 fullyVestedAmount,
                             uint256 startDate, // 0 indicates start "now"
                             uint256 cliffSec,
                             uint256 durationSec,
                             bool isRevocable) public onlySuperAdmins returns(bool) {

    uint256 _circulationCap = externalStorage.getCirculationCap();

    require(beneficiary != address(0));
    require(!frozenAccount[beneficiary]);
    require(durationSec >= cliffSec);
    require(totalInCirculation().add(fullyVestedAmount) <= _circulationCap);
    require(fullyVestedAmount <= tokensAvailable());

    uint256 _startDate = startDate;
    if (_startDate == 0) {
      _startDate = now;
    }

    uint256 cliffDate = _startDate.add(cliffSec);

    externalStorage.setVestingSchedule(beneficiary,
                                       fullyVestedAmount,
                                       _startDate,
                                       cliffDate,
                                       durationSec,
                                       isRevocable);

    emit VestedTokenGrant(beneficiary, _startDate, cliffDate, durationSec, fullyVestedAmount, isRevocable);

    return true;
  }

  function revokeVesting(address beneficiary) public onlySuperAdmins returns (bool) {
    require(beneficiary != address(0));
    externalStorage.revokeVesting(beneficiary);

    releaseVestedTokensForBeneficiary(beneficiary);

    emit VestedTokenRevocation(beneficiary);

    return true;
  }

  function releaseVestedTokens() public unlessFrozen returns (bool) {
    return releaseVestedTokensForBeneficiary(msg.sender);
  }

  function releaseVestedTokensForBeneficiary(address beneficiary) public unlessFrozen returns (bool) {
    require(beneficiary != address(0));
    require(!frozenAccount[beneficiary]);

    uint256 unreleased = releasableAmount(beneficiary);

    if (unreleased == 0) { return true; }

    externalStorage.releaseVestedTokens(beneficiary);

    tokenLedger.debitAccount(beneficiary, unreleased);
    emit Transfer(this, beneficiary, unreleased);

    emit VestedTokenRelease(beneficiary, unreleased);

    return true;
  }

  function setCustomBuyer(address buyer, uint256 balanceLimit) public onlySuperAdmins returns (bool) {
    require(buyer != address(0));
    externalStorage.setCustomBuyerLimit(buyer, balanceLimit);
    addBuyer(buyer);

    return true;
  }

  function setContributionMinimum(uint256 _contributionMinimum) public onlySuperAdmins returns (bool) {
    contributionMinimum = _contributionMinimum;
    return true;
  }

  function addBuyer(address buyer) public onlySuperAdmins returns (bool) {
    require(buyer != address(0));
    externalStorage.setApprovedBuyer(buyer, true);

    uint256 balanceLimit = externalStorage.getCustomBuyerLimit(buyer);
    if (balanceLimit == 0) {
      balanceLimit = externalStorage.getBalanceLimit();
    }

    emit WhiteList(buyer, balanceLimit);

    return true;
  }

  function removeBuyer(address buyer) public onlySuperAdmins returns (bool) {
    require(buyer != address(0));
    externalStorage.setApprovedBuyer(buyer, false);

    emit RemoveWhitelistedBuyer(buyer);
    return true;
  }

  function name() public view returns(string) {
    return bytes32ToString(externalStorage.getTokenName());
  }

  function symbol() public view returns(string) {
    return bytes32ToString(externalStorage.getTokenSymbol());
  }

  function totalInCirculation() public view returns(uint256) {
    return tokenLedger.totalInCirculation().add(totalUnvestedAndUnreleasedTokens());
  }

  function cstBalanceLimit() public view returns(uint256) {
    return externalStorage.getBalanceLimit();
  }

  function buyPrice() public view returns(uint256) {
    return externalStorage.getBuyPrice();
  }

  function circulationCap() public view returns(uint256) {
    return externalStorage.getCirculationCap();
  }

  // intentionally allowing this to be visible if upgraded so foundation can
  // withdraw funds from contract that has a successor
  function foundation() public view returns(address) {
    return externalStorage.getFoundation();
  }

  function totalSupply() public view returns(uint256) {
    return tokenLedger.totalTokens();
  }

  function tokensAvailable() public view returns(uint256) {
    return totalSupply().sub(totalInCirculation());
  }

  function balanceOf(address account) public view returns (uint256) {
    address thisAddress = this;
    if (thisAddress == account) {
      return tokensAvailable();
    } else {
      return tokenLedger.balanceOf(account);
    }
  }

  function allowance(address _owner, address _spender) public view returns (uint256) {
    return externalStorage.getAllowance(_owner, _spender);
  }

  function releasableAmount(address beneficiary) public view returns (uint256) {
    return externalStorage.releasableAmount(beneficiary);
  }

  function totalUnvestedAndUnreleasedTokens() public view returns (uint256) {
    return externalStorage.getTotalUnvestedAndUnreleasedTokens();
  }

  function vestingMappingSize() public view returns (uint256) {
    return externalStorage.vestingMappingSize();
  }

  function vestingBeneficiaryForIndex(uint256 index) public view returns (address) {
    return externalStorage.vestingBeneficiaryForIndex(index);
  }

  function vestingSchedule(address _beneficiary) public
                                                 view returns (uint256 startDate,
                                                               uint256 cliffDate,
                                                               uint256 durationSec,
                                                               uint256 fullyVestedAmount,
                                                               uint256 vestedAmount,
                                                               uint256 vestedAvailableAmount,
                                                               uint256 releasedAmount,
                                                               uint256 revokeDate,
                                                               bool isRevocable) {
    (
      startDate,
      cliffDate,
      durationSec,
      fullyVestedAmount,
      releasedAmount,
      revokeDate,
      isRevocable
    ) =  externalStorage.getVestingSchedule(_beneficiary);

    vestedAmount = externalStorage.vestedAmount(_beneficiary);
    vestedAvailableAmount = externalStorage.vestedAvailableAmount(_beneficiary);
  }

  function totalCustomBuyersMapping() public view returns (uint256) {
    return externalStorage.getCustomBuyerMappingCount();
  }

  function customBuyerLimit(address buyer) public view returns (uint256) {
    return externalStorage.getCustomBuyerLimit(buyer);
  }

  function customBuyerForIndex(uint256 index) public view returns (address) {
    return externalStorage.getCustomBuyerForIndex(index);
  }

  function totalBuyersMapping() public view returns (uint256) {
    return externalStorage.getApprovedBuyerMappingCount();
  }

  function approvedBuyer(address buyer) public view returns (bool) {
    return externalStorage.getApprovedBuyer(buyer);
  }

  function approvedBuyerForIndex(uint256 index) public view returns (address) {
    return externalStorage.getApprovedBuyerForIndex(index);
  }

  function _initialize(address _registry, string _storageName, string _ledgerName) internal isInitializer {
    require(_registry != address(0));

    storageName = _storageName;
    ledgerName = _ledgerName;
    registry = _registry;

    addSuperAdmin(registry);

    emit Transfer(address(0), this, 0); // create ERC-20 signature for etherscan.io
  }

  function _approve(address spender, uint256 value) internal unlessFrozen returns(bool) {
    require(spender != address(0));
    require(!frozenAccount[spender]);
    require(msg.sender != spender);

    externalStorage.setAllowance(msg.sender, spender, value);

    emit Approval(msg.sender, spender, value);
    return true;
  }

}

interface ITokenLedger {
  function mintTokens(uint256 amount) external;
  function transfer(address sender, address reciever, uint256 amount) external;
  function creditAccount(address account, uint256 amount) external;
  function debitAccount(address account, uint256 amount) external;
  function addAdmin(address admin) external;
  function removeAdmin(address admin) external;
  function totalTokens() external view returns (uint256);
  function totalInCirculation() external view returns (uint256);
  function balanceOf(address account) external view returns (uint256);
}

contract CstLedger is ITokenLedger, Initializable, Administratable {

  using SafeMath for uint256;

  /* zOS requires that the variables are never removed nor order changed
  /* BEGIN VARIABLES */
  string public constant version = "2";

  uint256 private _totalInCirculation; // warning this does not take into account unvested nor vested-unreleased tokens into consideration
  uint256 private _totalTokens;
  mapping (address => uint256) private _balanceOf;
  mapping (address => bool) private accounts;
  /* END VARIABLES */

  function transfer(address sender, address recipient, uint256 amount) external onlyAdmins {
    require(sender != address(0));
    require(recipient != address(0));
    require(_balanceOf[sender] >= amount);

    _balanceOf[sender] = _balanceOf[sender].sub(amount);
    _balanceOf[recipient] = _balanceOf[recipient].add(amount);
  }

  function creditAccount(address account, uint256 amount) external onlyAdmins { // remove tokens
    require(account != address(0));
    require(_balanceOf[account] >= amount);

    _totalInCirculation = _totalInCirculation.sub(amount);
    _balanceOf[account] = _balanceOf[account].sub(amount);
  }

  function debitAccount(address account, uint256 amount) external onlyAdmins { // add tokens
    require(account != address(0));
    _totalInCirculation = _totalInCirculation.add(amount);
    _balanceOf[account] = _balanceOf[account].add(amount);
  }

  function totalTokens() external view returns (uint256) {
    return _totalTokens;
  }

  function totalInCirculation() external view returns (uint256) {
    return _totalInCirculation;
  }

  function balanceOf(address account) external view returns (uint256) {
    return _balanceOf[account];
  }

  function mintTokens(uint256 amount) external onlyAdmins {
    _totalTokens = _totalTokens.add(amount);
  }

  function initialize() public onlyInitializers isInitializer {
    initializeAdmins();
  }

}

contract Registry is Initializable, Administratable {
  using SafeMath for uint256;

  /* zOS requires that the variables are never removed nor order changed
  /* BEGIN VARIABLES */
  string public constant version = "2";
  bytes4 private constant INTERFACE_META_ID = 0x01ffc9a7;
  bytes4 private constant ADDR_INTERFACE_ID = 0x3b3b57de;
  bytes32 private constant BARE_DOMAIN_NAMEHASH = 0x794941fae74d6435d1b29ee1c08cc39941ba78470872e6afd0693c7eeb63025c; // namehash for "cardstack.eth"
  mapping(bytes32 => address) public storageForHash;
  mapping(bytes32 => address) public contractForHash;
  mapping(bytes32 => bytes32) public hashForNamehash;
  mapping(bytes32 => bytes32) public namehashForHash;
  string[] public contractNameForIndex;
  /* END VARIABLES */

  event ContractRegistered(address indexed _contract, string _name, bytes32 namehash);
  event StorageAdded(address indexed storageAddress, string name);
  event StorageRemoved(address indexed storageAddress, string name);
  event AddrChanged(bytes32 indexed node, address a);

  function() public {
    revert();
  }

  function setNamehash(string contractName, bytes32 namehash) external onlySuperAdmins returns (bool) {
    require(namehash != 0x0);

    bytes32 hash = keccak256(abi.encodePacked(contractName));
    address contractAddress = contractForHash[hash];

    require(contractAddress != 0x0);
    require(hashForNamehash[namehash] == 0x0);

    hashForNamehash[namehash] = hash;
    namehashForHash[hash] = namehash;

    emit AddrChanged(namehash, contractAddress);
  }

  function register(string name, address contractAddress, bytes32 namehash) external onlySuperAdmins returns (bool) {
    bytes32 hash = keccak256(abi.encodePacked(name));
    require(bytes(name).length > 0);
    require(contractAddress != 0x0);
    require(contractForHash[hash] == 0x0);
    require(hashForNamehash[namehash] == 0x0);

    contractNameForIndex.push(name);
    contractForHash[hash] = contractAddress;

    if (namehash != 0x0) {
      hashForNamehash[namehash] = hash;
      namehashForHash[hash] = namehash;
    }

    address storageAddress = storageForHash[IStorable(contractAddress).getStorageNameHash()];
    address ledgerAddress = storageForHash[IStorable(contractAddress).getLedgerNameHash()];

    if (storageAddress != 0x0) {
      ExternalStorage(storageAddress).addAdmin(contractAddress);
    }
    if (ledgerAddress != 0x0) {
      CstLedger(ledgerAddress).addAdmin(contractAddress);
    }

    Configurable(contractAddress).configureFromStorage();

    emit ContractRegistered(contractAddress, name, namehash);

    if (namehash != 0x0) {
      emit AddrChanged(namehash, contractAddress);
    }

    return true;
  }

  function addStorage(string name, address storageAddress) external onlySuperAdmins {
    require(storageAddress != address(0));
    bytes32 hash = keccak256(abi.encodePacked(name));
    storageForHash[hash] = storageAddress;

    emit StorageAdded(storageAddress, name);
  }

  function initialize() public onlyInitializers isInitializer {
    initializeAdmins();
  }

  function removeStorage(string name) public onlySuperAdmins {
    address storageAddress = storageForHash[keccak256(abi.encodePacked(name))];
    delete storageForHash[keccak256(abi.encodePacked(name))];

    emit StorageRemoved(storageAddress, name);
  }

  function getStorage(string name) public view returns (address) {
    return storageForHash[keccak256(abi.encodePacked(name))];
  }

  function addr(bytes32 node) public view returns (address) {
    return contractForHash[hashForNamehash[node]];
  }

  function numContracts() public view returns(uint256) {
    return contractNameForIndex.length;
  }

  function getContractHash(string name) public pure returns (bytes32) {
    return keccak256(abi.encodePacked(name));
  }

  function supportsInterface(bytes4 interfaceId) public pure returns (bool) {
    return interfaceId == ADDR_INTERFACE_ID ||
           interfaceId == INTERFACE_META_ID;
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"totalAdminsMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"buyer","type":"address"}],"name":"customBuyerLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newStorageName","type":"string"},{"name":"newLedgerName","type":"string"}],"name":"updateStorage","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"beneficiary","type":"address"}],"name":"releasableAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"}],"name":"removeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"configureFromStorage","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"vestingMappingSize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalFrozenAccountsMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"adminsForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenLedger","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"revokeVesting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"foundation","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"admins","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"vestingBeneficiaryForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"}],"name":"removeSuperAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contributionMinimum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"releaseVestedTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"circulationCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalInCirculation","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenName","type":"bytes32"},{"name":"_tokenSymbol","type":"bytes32"},{"name":"_buyPrice","type":"uint256"},{"name":"_circulationCap","type":"uint256"},{"name":"_balanceLimit","type":"uint256"},{"name":"_foundation","type":"address"}],"name":"configure","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokensAvailable","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_haltPurchase","type":"bool"}],"name":"setHaltPurchase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"frozenToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"buyer","type":"address"}],"name":"removeBuyer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"}],"name":"addAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"freeze","type":"bool"}],"name":"freezeToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"frozenAccountForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cstBalanceLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buyPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"externalStorage","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalUnvestedAndUnreleasedTokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLedgerNameHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_registry","type":"address"},{"name":"_storageName","type":"string"},{"name":"_ledgerName","type":"string"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"bytes32"}],"name":"bytes32ToString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"mintedAmount","type":"uint256"}],"name":"mintTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getStorageNameHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"releaseVestedTokensForBeneficiary","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"foundationDeposit","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"totalBuyersMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"buy","outputs":[{"name":"","type":"uint256"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSuperAdminsMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"superAdmins","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"}],"name":"addSuperAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"frozenAccount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"customBuyerForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"buyer","type":"address"}],"name":"addBuyer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"buyer","type":"address"}],"name":"approvedBuyer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"superAdminsForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"grantTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_contributionMinimum","type":"uint256"}],"name":"setContributionMinimum","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"foundationWithdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ledgerName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"haltPurchase","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"storageName","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"buyer","type":"address"},{"name":"balanceLimit","type":"uint256"}],"name":"setCustomBuyer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenMaxCap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"adminsInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalCustomBuyersMapping","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"target","type":"address"},{"name":"freeze","type":"bool"}],"name":"freezeAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"approvedBuyerForIndex","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"fullyVestedAmount","type":"uint256"},{"name":"startDate","type":"uint256"},{"name":"cliffSec","type":"uint256"},{"name":"durationSec","type":"uint256"},{"name":"isRevocable","type":"bool"}],"name":"grantVestedTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_beneficiary","type":"address"}],"name":"vestingSchedule","outputs":[{"name":"startDate","type":"uint256"},{"name":"cliffDate","type":"uint256"},{"name":"durationSec","type":"uint256"},{"name":"fullyVestedAmount","type":"uint256"},{"name":"vestedAmount","type":"uint256"},{"name":"vestedAvailableAmount","type":"uint256"},{"name":"releasedAmount","type":"uint256"},{"name":"revokeDate","type":"uint256"},{"name":"isRevocable","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amountMinted","type":"uint256"}],"name":"Mint","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"},{"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":"buyer","type":"address"},{"indexed":false,"name":"holdCap","type":"uint256"}],"name":"WhiteList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"}],"name":"RemoveWhitelistedBuyer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"buyPrice","type":"uint256"},{"indexed":false,"name":"circulationCap","type":"uint256"},{"indexed":false,"name":"balanceLimit","type":"uint256"}],"name":"ConfigChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"startDate","type":"uint256"},{"indexed":false,"name":"cliffDate","type":"uint256"},{"indexed":false,"name":"durationSec","type":"uint256"},{"indexed":false,"name":"fullyVestedAmount","type":"uint256"},{"indexed":false,"name":"isRevocable","type":"bool"}],"name":"VestedTokenGrant","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"}],"name":"VestedTokenRevocation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"VestedTokenRelease","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"storageAddress","type":"address"},{"indexed":false,"name":"ledgerAddress","type":"address"}],"name":"StorageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"FoundationDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"FoundationWithdraw","type":"event"},{"anonymous":false,"inputs":[],"name":"PurchaseHalted","type":"event"},{"anonymous":false,"inputs":[],"name":"PurchaseResumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"target","type":"address"},{"indexed":false,"name":"frozen","type":"bool"}],"name":"FrozenFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"frozen","type":"bool"}],"name":"FrozenToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"admin","type":"address"}],"name":"AddAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"admin","type":"address"}],"name":"RemoveAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"admin","type":"address"}],"name":"AddSuperAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"admin","type":"address"}],"name":"RemoveSuperAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

608060405260008054610100330261010060a860020a03199091161790556154458061002c6000396000f3006080604052600436106103765763ffffffff60e060020a6000350416630489882e811461037b57806306fdde03146103a2578063095ea7b31461042c578063115f2be21461046457806313bac8f214610485578063158ef93e1461051c5780631726cbc8146105315780631785f53c1461055257806318160ddd146105755780631a841b1b1461058a578063222101d11461059f57806323b872dd146105b45780632b28d2d0146105de578063313ce567146105f3578063313f2a211461061e5780633886c957146106525780633b0da2601461066757806341fbb05014610688578063429b62e51461069d5780634610a448146106be5780634902e4aa146106d65780634f2d7ab5146106f757806354dd1da41461070c57806354fd4d501461072157806356597e65146107365780635cb0c16f1461074b5780635da01a5b1461076057806360659a921461079057806366188463146107a55780636a420bbc146107c95780636df006f3146107e35780636f75b00c146107f8578063704802751461081957806370a082311461083a578063771eee161461085b5780637b103999146108755780637db6cc1b1461088a578063820e79ed146108a25780638620410b146108b757806388d7cd97146108cc5780638da5cb5b146108e15780638df388c1146108f65780638f1d5f7e1461090b57806390657147146109205780639201de55146109c557806395d89b41146109dd57806397304ced146109f25780639860811114610a0a57806399817b4714610a1f5780639ae066b014610a40578063a4453a9614610a48578063a6f2ae3a14610a5d578063a9059cbb14610a65578063abf7b06314610a89578063ad25cb4214610a9e578063b3292ff014610abf578063b414d4b614610ae0578063b9447f7e14610b01578063bbf8980314610b19578063c3437e0614610b3a578063c389439814610b5b578063c94e643c14610b73578063cb0b7b0314610b97578063cedcd77014610baf578063cf1f3dd714610bc7578063d28dcdea14610bdc578063d73c277c14610bf1578063d73dd62314610c06578063da14c72314610c2a578063dd62ed3e14610c4e578063ddad3ca114610c75578063deca6e7614610c8a578063e01bc60b14610c9f578063e724529c14610cb4578063f2fde38b14610cda578063f69f8a5c14610cfb578063fc13566d14610d13578063ffff6b0414610d45575b600080fd5b34801561038757600080fd5b50610390610daf565b60408051918252519081900360200190f35b3480156103ae57600080fd5b506103b7610db6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103f15781810151838201526020016103d9565b50505050905090810190601f16801561041e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043857600080fd5b50610450600160a060020a0360043516602435610e69565b604080519115158252519081900360200190f35b34801561047057600080fd5b50610390600160a060020a0360043516610ecb565b34801561049157600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261045094369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610f7f9650505050505050565b34801561052857600080fd5b50610450611238565b34801561053d57600080fd5b50610390600160a060020a0360043516611241565b34801561055e57600080fd5b50610573600160a060020a03600435166112c3565b005b34801561058157600080fd5b5061039061135b565b34801561059657600080fd5b506104506113eb565b3480156105ab57600080fd5b50610390611662565b3480156105c057600080fd5b50610450600160a060020a03600435811690602435166044356116f0565b3480156105ea57600080fd5b50610390611915565b3480156105ff57600080fd5b5061060861191b565b6040805160ff9092168252519081900360200190f35b34801561062a57600080fd5b50610636600435611920565b60408051600160a060020a039092168252519081900360200190f35b34801561065e57600080fd5b50610636611948565b34801561067357600080fd5b50610450600160a060020a0360043516611957565b34801561069457600080fd5b50610636611a83565b3480156106a957600080fd5b50610450600160a060020a0360043516611afd565b3480156106ca57600080fd5b50610636600435611b12565b3480156106e257600080fd5b50610573600160a060020a0360043516611b93565b34801561070357600080fd5b50610390611c2b565b34801561071857600080fd5b50610450611c31565b34801561072d57600080fd5b506103b7611c6a565b34801561074257600080fd5b50610390611ca1565b34801561075757600080fd5b50610390611d05565b34801561076c57600080fd5b50610450600435602435604435606435608435600160a060020a0360a43516611d9d565b34801561079c57600080fd5b50610390612496565b3480156107b157600080fd5b50610450600160a060020a03600435166024356124b7565b3480156107d557600080fd5b5061045060043515156125d5565b3480156107ef57600080fd5b506104506126b4565b34801561080457600080fd5b50610450600160a060020a03600435166126bd565b34801561082557600080fd5b50610573600160a060020a03600435166127e6565b34801561084657600080fd5b50610390600160a060020a0360043516612911565b34801561086757600080fd5b5061057360043515156129d1565b34801561088157600080fd5b50610636612a57565b34801561089657600080fd5b50610636600435612a66565b3480156108ae57600080fd5b50610390612a74565b3480156108c357600080fd5b50610390612aee565b3480156108d857600080fd5b50610636612b68565b3480156108ed57600080fd5b50610636612b77565b34801561090257600080fd5b50610390612b8b565b34801561091757600080fd5b50610390612c05565b34801561092c57600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610573958335600160a060020a031695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750612cdc9650505050505050565b3480156109d157600080fd5b506103b7600435612d34565b3480156109e957600080fd5b506103b7612ec9565b3480156109fe57600080fd5b50610450600435612f46565b348015610a1657600080fd5b5061039061309e565b348015610a2b57600080fd5b50610450600160a060020a03600435166130de565b6104506132f8565b348015610a5457600080fd5b50610390613361565b6103906133db565b348015610a7157600080fd5b50610450600160a060020a0360043516602435613997565b348015610a9557600080fd5b50610390613ab0565b348015610aaa57600080fd5b50610450600160a060020a0360043516613ab6565b348015610acb57600080fd5b50610573600160a060020a0360043516613acb565b348015610aec57600080fd5b50610450600160a060020a0360043516613b45565b348015610b0d57600080fd5b50610636600435613b5a565b348015610b2557600080fd5b50610450600160a060020a0360043516613bdb565b348015610b4657600080fd5b50610450600160a060020a0360043516613e6a565b348015610b6757600080fd5b50610636600435613eec565b348015610b7f57600080fd5b50610450600160a060020a0360043516602435613efa565b348015610ba357600080fd5b506104506004356140fe565b348015610bbb57600080fd5b50610450600435614142565b348015610bd357600080fd5b506103b761429d565b348015610be857600080fd5b5061045061432b565b348015610bfd57600080fd5b506103b761434c565b348015610c1257600080fd5b50610450600160a060020a03600435166024356143a7565b348015610c3657600080fd5b50610450600160a060020a036004351660243561447b565b348015610c5a57600080fd5b50610390600160a060020a036004358116906024351661457b565b348015610c8157600080fd5b50610390614638565b348015610c9657600080fd5b50610450614648565b348015610cab57600080fd5b5061039061466a565b348015610cc057600080fd5b50610573600160a060020a036004351660243515156146e4565b348015610ce657600080fd5b50610573600160a060020a036004351661480c565b348015610d0757600080fd5b506106366004356148b0565b348015610d1f57600080fd5b50610450600160a060020a036004351660243560443560643560843560a4351515614931565b348015610d5157600080fd5b50610d66600160a060020a0360043516614bbb565b60408051998a5260208a0198909852888801969096526060880194909452608087019290925260a086015260c085015260e0840152151561010083015251908190036101200190f35b6001545b90565b600e54604080517f6f0fccab000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251606091610e649173c0cc10d764f38245ca6b43aa1fe84c85002b826191636f0fccab916024808301926020929190829003018186803b158015610e3357600080fd5b505af4158015610e47573d6000803e3d6000fd5b505050506040513d6020811015610e5d57600080fd5b5051612d34565b905090565b60075460009060ff1615610e7c57600080fd5b3360009081526009602052604090205460ff1615610e9957600080fd5b811580610ead5750610eab338461457b565b155b1515610eb857600080fd5b610ec28383614e6a565b90505b92915050565b600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ddf9d61391604480820192602092909190829003018186803b158015610f4d57600080fd5b505af4158015610f61573d6000803e3d6000fd5b505050506040513d6020811015610f7757600080fd5b505192915050565b60008054819081906101009004600160a060020a03163314801590610fb457503360009081526004602052604090205460ff16155b15610fbe57600080fd5b60075460ff161515610fcf57600080fd5b8451610fe290600c906020880190615361565b508351610ff690600d906020870190615361565b50610fff6113eb565b50600f5460405160e160020a6328cf2aed028152602060048201908152600d80546002600019600183161561010002019091160460248401819052600160a060020a039094169363519e55da939192918291604490910190849080156110a65780601f1061107b576101008083540402835291602001916110a6565b820191906000526020600020905b81548152906001019060200180831161108957829003601f168201915b505092505050602060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b505050506040513d60208110156110f057600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da93928291604490910190849080156111995780601f1061116e57610100808354040283529160200191611199565b820191906000526020600020905b81548152906001019060200180831161117c57829003601f168201915b505092505050602060405180830381600087803b1580156111b957600080fd5b505af11580156111cd573d6000803e3d6000fd5b505050506040513d60208110156111e357600080fd5b505160408051600160a060020a0380841682528516602082015281519293507f8e2c71dfeb156b7c7d03fa7cba1af111d058c575816f578cb3c2d8c6be99e0ca929081900390910190a1506001949350505050565b60005460ff1681565b600e54604080517f7243cfbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191637243cfbb91604480820192602092909190829003018186803b158015610f4d57600080fd5b6000546101009004600160a060020a031633148015906112f357503360009081526004602052604090205460ff16155b156112fd57600080fd5b600160a060020a038116151561131257600080fd5b600160a060020a038116600081815260036020526040808220805460ff19169055517f753f40ca3312b2408759a67875b367955e7baa221daf08aa3d643d96202ac12b9190a250565b600b54604080517f7e1c0c090000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691637e1c0c0991600480830192602092919082900301818787803b1580156113ba57600080fd5b505af11580156113ce573d6000803e3d6000fd5b505050506040513d60208110156113e457600080fd5b5051905090565b600080546101009004600160a060020a0316331480159061141c57503360009081526004602052604090205460ff16155b1561142657600080fd5b600f5460405160e160020a6328cf2aed028152602060048201908152600d805460026000196001831615610100020190911604602484018190526000948594600160a060020a039091169363519e55da939290918291604490910190849080156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b505092505050602060405180830381600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b505050506040513d602081101561151b57600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da93928291604490910190849080156115c45780601f10611599576101008083540402835291602001916115c4565b820191906000526020600020905b8154815290600101906020018083116115a757829003601f168201915b505092505050602060405180830381600087803b1580156115e457600080fd5b505af11580156115f8573d6000803e3d6000fd5b505050506040513d602081101561160e57600080fd5b5051600b8054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831617909255600e805492841692909116919091179055905061165960016129d1565b60019250505090565b600e54604080517f0b96406a000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191630b96406a91602480820192602092909190829003018186803b1580156116dc57600080fd5b505af41580156113ce573d6000803e3d6000fd5b600754600090819060ff161561170557600080fd5b3360009081526009602052604090205460ff161561172257600080fd5b600160a060020a03851660009081526009602052604090205460ff161561174857600080fd5b600160a060020a03841660009081526009602052604090205460ff161561176e57600080fd5b600160a060020a03851633141561178457600080fd5b61178e853361457b565b90508281101561179d57600080fd5b600b54604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528781166024830152604482018790529151919092169163beabacc891606480830192600092919082900301818387803b15801561181357600080fd5b505af1158015611827573d6000803e3d6000fd5b5050600e5473c0cc10d764f38245ca6b43aa1fe84c85002b8261925063a70703739150600160a060020a03168733611865868963ffffffff614fd716565b6040805160e060020a63ffffffff8816028152600160a060020a0395861660048201529385166024850152919093166044830152606482019290925290516084808301926000929190829003018186803b1580156118c257600080fd5b505af41580156118d6573d6000803e3d6000fd5b5050604080518681529051600160a060020a038089169450891692506000805160206153fa8339815191529181900360200190a3506001949350505050565b60085490565b601281565b600180548290811061192e57fe5b600091825260209091200154600160a060020a0316905081565b600b54600160a060020a031681565b600080546101009004600160a060020a0316331480159061198857503360009081526004602052604090205460ff16155b1561199257600080fd5b600160a060020a03821615156119a757600080fd5b600e54604080517f3613b781000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291841660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191633613b781916044808301926000929190829003018186803b158015611a2557600080fd5b505af4158015611a39573d6000803e3d6000fd5b50505050611a46826130de565b50604051600160a060020a038316907fe8a24516e1d3bae0c4742f4e5ded148733d2193d648d57d54bbec9c20e4b444990600090a2506001919050565b600e54604080517f96468249000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191639646824991602480820192602092909190829003018186803b1580156116dc57600080fd5b60036020526000908152604090205460ff1681565b600e54604080517f52bafbfa000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916352bafbfa91604480820192602092909190829003018186803b158015610f4d57600080fd5b6000546101009004600160a060020a03163314801590611bc357503360009081526004602052604090205460ff16155b15611bcd57600080fd5b600160a060020a0381161515611be257600080fd5b600160a060020a038116600081815260046020526040808220805460ff19169055517f1aaaaf7609619e631f47eb3546f9fdd8c61b1af2175988a0ddb9a06680c3b9ed9190a250565b60105481565b60075460009060ff1615611c4457600080fd5b3360009081526009602052604090205460ff1615611c6157600080fd5b610e64336130de565b60408051808201909152600181527f3300000000000000000000000000000000000000000000000000000000000000602082015281565b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000610e64611d12612b8b565b600b60009054906101000a9004600160a060020a0316600160a060020a0316635cb0c16f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611d6557600080fd5b505af1158015611d79573d6000803e3d6000fd5b505050506040513d6020811015611d8f57600080fd5b50519063ffffffff614fe916565b6000805481906101009004600160a060020a03163314801590611dd057503360009081526004602052604090205460ff16155b15611dda57600080fd5b600f5460405160e160020a6328cf2aed028152602060048201908152600d805460026000196001831615610100020190911604602484018190526000948594600160a060020a039091169363519e55da93929091829160449091019084908015611e855780601f10611e5a57610100808354040283529160200191611e85565b820191906000526020600020905b815481529060010190602001808311611e6857829003601f168201915b505092505050602060405180830381600087803b158015611ea557600080fd5b505af1158015611eb9573d6000803e3d6000fd5b505050506040513d6020811015611ecf57600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da9392829160449091019084908015611f785780601f10611f4d57610100808354040283529160200191611f78565b820191906000526020600020905b815481529060010190602001808311611f5b57829003601f168201915b505092505050602060405180830381600087803b158015611f9857600080fd5b505af1158015611fac573d6000803e3d6000fd5b505050506040513d6020811015611fc257600080fd5b5051600b8054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831617909255600e805483851692169190911790819055604080517fcedc7277000000000000000000000000000000000000000000000000000000008152919092166004820152905191925073c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc727791602480820192602092909190829003018186803b15801561207257600080fd5b505af4158015612086573d6000803e3d6000fd5b505050506040513d602081101561209c57600080fd5b505192506000831180156120b05750878314155b156120c65760075460ff1615156120c657600080fd5b600e54604080517f9c473bb2000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173c0cc10d764f38245ca6b43aa1fe84c85002b826191639c473bb2916044808301926000929190829003018186803b15801561214357600080fd5b505af4158015612157573d6000803e3d6000fd5b5050600e54604080517fe6e623d5000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018d90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063e6e623d592506044808301926000929190829003018186803b1580156121d857600080fd5b505af41580156121ec573d6000803e3d6000fd5b5050600e54604080517f1112b124000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173c0cc10d764f38245ca6b43aa1fe84c85002b82619350631112b12492506044808301926000929190829003018186803b15801561226d57600080fd5b505af4158015612281573d6000803e3d6000fd5b5050600e54604080517fcd54c54e000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018b90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063cd54c54e92506044808301926000929190829003018186803b15801561230257600080fd5b505af4158015612316573d6000803e3d6000fd5b5050600e54604080517f05bf779f000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291891660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826193506305bf779f92506044808301926000929190829003018186803b15801561239857600080fd5b505af41580156123ac573d6000803e3d6000fd5b5050600e54604080517fdbafdbb6000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018a90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063dbafdbb692506044808301926000929190829003018186803b15801561242d57600080fd5b505af4158015612441573d6000803e3d6000fd5b5050604080518b8152602081018b90528082018a905290517f9d1a3ea811a60a1b2c08f8e30a09832514a3ec19ba354d73d8fe12ad66591cec9350908190036060019150a15060019998505050505050505050565b6000610e646124a3611d05565b6124ab61135b565b9063ffffffff614fd716565b600754600090819060ff16156124cc57600080fd5b3360009081526009602052604090205460ff16156124e957600080fd5b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015233602482015291861660448301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b41916064808301926020929190829003018186803b15801561256d57600080fd5b505af4158015612581573d6000803e3d6000fd5b505050506040513d602081101561259757600080fd5b50519050808311156125b5576125ae846000614e6a565b91506125ce565b6125ae846125c9838663ffffffff614fd716565b614e6a565b5092915050565b600080546101009004600160a060020a0316331480159061260657503360009081526004602052604090205460ff16155b1561261057600080fd5b600f805483158015740100000000000000000000000000000000000000000274ff00000000000000000000000000000000000000001990921691909117909155612682576040517ff5eced797ccd723743102a9d898a1372f6bd7a0206c4facf99081b9471f5727290600090a16126ac565b6040517fd20fe4b54e307993c74930d195aa389bf91e188918e31ad1da29aad5a748a4d390600090a15b506001919050565b60075460ff1681565b600080546101009004600160a060020a031633148015906126ee57503360009081526004602052604090205460ff16155b156126f857600080fd5b600160a060020a038216151561270d57600080fd5b600e54604080517f6ace6dc8000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529184166024830152600060448301819052905173c0cc10d764f38245ca6b43aa1fe84c85002b826192636ace6dc8926064808301939192829003018186803b15801561279257600080fd5b505af41580156127a6573d6000803e3d6000fd5b5050604051600160a060020a03851692507f434d4944e12211f9f671e6e354248816735c0452bc160d31e737245b3dcb45c39150600090a2506001919050565b6000546101009004600160a060020a0316331480159061281657503360009081526004602052604090205460ff16155b1561282057600080fd5b600160a060020a038116151561283557600080fd5b600160a060020a0381166000908152600360209081526040808320805460ff19166001179055600590915290205460ff1615156128da576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091556000908152600560205260409020805460ff191690911790555b604051600160a060020a038216907fad6de4452a631e641cb59902236607946ce9272b9b981f2f80e8d129cb9084ba90600090a250565b600030600160a060020a0383168114156129345761292d612496565b91506129cb565b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915191909216916370a082319160248083019260209291908290030181600087803b15801561299c57600080fd5b505af11580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b505191505b50919050565b6000546101009004600160a060020a03163314801590612a0157503360009081526004602052604090205460ff16155b15612a0b57600080fd5b6007805460ff191682151517908190556040805160ff90921615158252517f1623ff1a4138a65cb1f44d1a94c034f7dd8c1e826fefb1f27f0898580601e68d916020908290030190a150565b600f54600160a060020a031681565b600880548290811061192e57fe5b600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d91602480820192602092909190829003018186803b1580156116dc57600080fd5b600e54604080517fcedc7277000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc727791602480820192602092909190829003018186803b1580156116dc57600080fd5b600e54600160a060020a031681565b6000546101009004600160a060020a031681565b600e54604080517feec5d076000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163eec5d07691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000600d6040516020018082805460018160011615610100020316600290048015612c675780601f10612c45576101008083540402835291820191612c67565b820191906000526020600020905b815481529060010190602001808311612c53575b50509150506040516020818303038152906040526040518082805190602001908083835b60208310612caa5780518252601f199092019160209182019101612c8b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b33730aeaf8c2fe778797cd5464e7eb8351d28da2e8231480612d11575033731e65f71b024937b988fdba09814d60049e0fc59d145b1515612d1c57600080fd5b612d24614ff6565b612d2f838383615132565b505050565b6040805160208082528183019092526060918291600091829184918082016104008038833901905050935060009250600091505b6020821015612e1857858260208110612d7d57fe5b1a60f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916600060f860020a02141515612e0d57858260208110612dc157fe5b1a60f860020a028484815181101515612dd657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909201915b600190910190612d68565b826040519080825280601f01601f191660200182016040528015612e46578160200160208202803883390190505b509050600091505b82821015612ec0578382815181101515612e6457fe5b90602001015160f860020a900460f860020a028183815181101515612e8557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190910190612e4e565b95945050505050565b600e54604080517f81a73ad5000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251606091610e649173c0cc10d764f38245ca6b43aa1fe84c85002b8261916381a73ad5916024808301926020929190829003018186803b158015610e3357600080fd5b600080546101009004600160a060020a03163314801590612f7757503360009081526004602052604090205460ff16155b15612f8157600080fd5b6b1363156bbee3016d70000000612fa6612f9961135b565b849063ffffffff614fe916565b1115612fb157600080fd5b60008211612fbe57600080fd5b600b54604080517f97304ced000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a03909216916397304ced9160248082019260009290919082900301818387803b15801561302457600080fd5b505af1158015613038573d6000803e3d6000fd5b50506040805185815290517f07883703ed0e86588a40d76551c92f8a4b329e3bf19765e0e6749473c1a846659350908190036020019150a160408051838152905130916000916000805160206153fa8339815191529181900360200190a3506001919050565b6000600c6040516020018082805460018160011615610100020316600290048015612c675780601f10612c45576101008083540402835291820191612c67565b600754600090819060ff16156130f357600080fd5b3360009081526009602052604090205460ff161561311057600080fd5b600160a060020a038316151561312557600080fd5b600160a060020a03831660009081526009602052604090205460ff161561314b57600080fd5b61315483611241565b905080151561316657600191506129cb565b600e54604080517f4698da9d000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291851660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191634698da9d916044808301926000929190829003018186803b1580156131e457600080fd5b505af41580156131f8573d6000803e3d6000fd5b5050600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152602482018790529151919092169350634cfe3e7f9250604480830192600092919082900301818387803b15801561326a57600080fd5b505af115801561327e573d6000803e3d6000fd5b5050604080518481529051600160a060020a03871693503092506000805160206153fa8339815191529181900360200190a3604080518281529051600160a060020a038516917f39dfd9c15a87979822cf6b236d0974075578d5b822244050f3c876a6cd1d2055919081900360200190a250600192915050565b60075460009060ff161561330b57600080fd5b3360009081526009602052604090205460ff161561332857600080fd5b6040805134815290517fdfcc97ccd559bb2bb289cefc32e1a1212d9bf091c06ffb121083134325afa3f89181900360200190a150600190565b600e54604080517f576f7e31000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163576f7e3191602480820192602092909190829003018186803b1580156116dc57600080fd5b60075460009081908190819081908190819060ff16156133fa57600080fd5b3360009081526009602052604090205460ff161561341757600080fd5b600f5474010000000000000000000000000000000000000000900460ff161561343f57600080fd5b600e54604080517f336077c3000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301523360248301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163336077c3916044808301926020929190829003018186803b1580156134bb57600080fd5b505af41580156134cf573d6000803e3d6000fd5b505050506040513d60208110156134e557600080fd5b505115156134f257600080fd5b600e54604080517fcedc7277000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc7277916024808301926020929190829003018186803b15801561356857600080fd5b505af415801561357c573d6000803e3d6000fd5b505050506040513d602081101561359257600080fd5b5051600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525191975073c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae691602480820192602092909190829003018186803b1580156135f857600080fd5b505af415801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b505194506000341161363357600080fd5b6000861161364057600080fd5b6000851161364d57600080fd5b61365d348763ffffffff61527816565b9350846136788561366c611d05565b9063ffffffff614fe916565b111561368357600080fd5b61368b612496565b84111561369757600080fd5b600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b1580156136fd57600080fd5b505af1158015613711573d6000803e3d6000fd5b505050506040513d602081101561372757600080fd5b5051600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301523360248301525191935073c0cc10d764f38245ca6b43aa1fe84c85002b82619163ddf9d61391604480820192602092909190829003018186803b1580156137a957600080fd5b505af41580156137bd573d6000803e3d6000fd5b505050506040513d60208110156137d357600080fd5b505160105490915015806137f857506010546137f5838663ffffffff614fe916565b10155b151561380357600080fd5b6000811115613814578092506138b9565b600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d916024808301926020929190829003018186803b15801561388a57600080fd5b505af415801561389e573d6000803e3d6000fd5b505050506040513d60208110156138b457600080fd5b505192505b6000831180156138d857506138d4828563ffffffff614fe916565b8310155b15156138e357600080fd5b600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a0390921691634cfe3e7f9160448082019260009290919082900301818387803b15801561394f57600080fd5b505af1158015613963573d6000803e3d6000fd5b50506040805187815290513393503092506000805160206153fa8339815191529181900360200190a3509195945050505050565b60075460009060ff16156139aa57600080fd5b3360009081526009602052604090205460ff16156139c757600080fd5b600160a060020a03831660009081526009602052604090205460ff16156139ed57600080fd5b600b54604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a038681166024830152604482018690529151919092169163beabacc891606480830192600092919082900301818387803b158015613a6157600080fd5b505af1158015613a75573d6000803e3d6000fd5b5050604080518581529051600160a060020a03871693503392506000805160206153fa8339815191529181900360200190a350600192915050565b60025490565b60046020526000908152604090205460ff1681565b6000546101009004600160a060020a03163314801590613afb57503360009081526004602052604090205460ff16155b15613b0557600080fd5b613b0e816152a1565b604051600160a060020a038216907ffba24c034afca607a35e1f221b154b3f8e1f88c7924c8a0a06755b70708c44d890600090a250565b60096020526000908152604090205460ff1681565b600e54604080517f58c6bce8000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916358c6bce891604480820192602092909190829003018186803b158015610f4d57600080fd5b6000805481906101009004600160a060020a03163314801590613c0e57503360009081526004602052604090205460ff16155b15613c1857600080fd5b600160a060020a0383161515613c2d57600080fd5b600e54604080517f6ace6dc8000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152600160448301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191636ace6dc8916064808301926000929190829003018186803b158015613cb257600080fd5b505af4158015613cc6573d6000803e3d6000fd5b5050600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291871660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063ddf9d61392506044808301926020929190829003018186803b158015613d4857600080fd5b505af4158015613d5c573d6000803e3d6000fd5b505050506040513d6020811015613d7257600080fd5b50519050801515613e2257600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d916024808301926020929190829003018186803b158015613df357600080fd5b505af4158015613e07573d6000803e3d6000fd5b505050506040513d6020811015613e1d57600080fd5b505190505b604080518281529051600160a060020a038516917fcb3de9106aa8cc3efea54defa4b3ec342e8ae23607fd0255b1dcee4813f9f4bc919081900360200190a250600192915050565b600e54604080517f336077c3000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163336077c391604480820192602092909190829003018186803b158015610f4d57600080fd5b600280548290811061192e57fe5b6000805481906101009004600160a060020a03163314801590613f2d57503360009081526004602052604090205460ff16155b15613f3757600080fd5b600f5474010000000000000000000000000000000000000000900460ff161515613f6057600080fd5b600160a060020a03841660009081526009602052604090205460ff1615613f8657600080fd5b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae6916024808301926020929190829003018186803b158015613fe657600080fd5b505af4158015613ffa573d6000803e3d6000fd5b505050506040513d602081101561401057600080fd5b50519050806140218461366c611d05565b111561402c57600080fd5b614034612496565b83111561404057600080fd5b600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301526024820187905291519190921691634cfe3e7f91604480830192600092919082900301818387803b1580156140ae57600080fd5b505af11580156140c2573d6000803e3d6000fd5b5050604080518681529051600160a060020a03881693503092506000805160206153fa8339815191529181900360200190a35060019392505050565b600080546101009004600160a060020a0316331480159061412f57503360009081526004602052604090205460ff16155b1561413957600080fd5b50601055600190565b600e54604080517f96468249000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251600091829173c0cc10d764f38245ca6b43aa1fe84c85002b8261916396468249916024808301926020929190829003018186803b1580156141bd57600080fd5b505af41580156141d1573d6000803e3d6000fd5b505050506040513d60208110156141e757600080fd5b50519050600160a060020a038116151561420057600080fd5b6000546101009004600160a060020a03163314801590614229575033600160a060020a03821614155b1561423357600080fd5b604051339084156108fc029085906000818181858888f19350505050158015614260573d6000803e3d6000fd5b506040805184815290517f4938436c771c2d50d08d91b156ca4b3ab759fa99c83c50d541e72166d46f85e09181900360200190a150600192915050565b600d805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156143235780601f106142f857610100808354040283529160200191614323565b820191906000526020600020905b81548152906001019060200180831161430657829003601f168201915b505050505081565b600f5474010000000000000000000000000000000000000000900460ff1681565b600c805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156143235780601f106142f857610100808354040283529160200191614323565b60075460009060ff16156143ba57600080fd5b3360009081526009602052604090205460ff16156143d757600080fd5b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152336024820152918516604483015251610ec29185916125c991869173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b41916064808301926020929190829003018186803b15801561446757600080fd5b505af4158015611d79573d6000803e3d6000fd5b600080546101009004600160a060020a031633148015906144ac57503360009081526004602052604090205460ff16155b156144b657600080fd5b600160a060020a03831615156144cb57600080fd5b600e54604080517f4989b0b6000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152604482018490525173c0cc10d764f38245ca6b43aa1fe84c85002b826191634989b0b6916064808301926000929190829003018186803b15801561455057600080fd5b505af4158015614564573d6000803e3d6000fd5b5050505061457183613bdb565b5060019392505050565b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152848316602482015291831660448301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b4191606480820192602092909190829003018186803b15801561460557600080fd5b505af4158015614619573d6000803e3d6000fd5b505050506040513d602081101561462f57600080fd5b50519392505050565b6b1363156bbee3016d7000000081565b6000547501000000000000000000000000000000000000000000900460ff1681565b600e54604080517f27132be6000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916327132be691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000546101009004600160a060020a0316331480159061471457503360009081526004602052604090205460ff16155b1561471e57600080fd5b600160a060020a0382166000908152600960209081526040808320805460ff1916851515179055600a90915290205460ff1615156147c7576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385169081179091556000908152600a60205260409020805460ff191690911790555b6040805182151581529051600160a060020a038416917f48335238b4855f35377ed80f164e8c6f3c366e54ac00b96a6402d4a9814a03a5919081900360200190a25050565b6000546101009004600160a060020a0316331461482857600080fd5b600160a060020a038116151561483d57600080fd5b60008054604051600160a060020a038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b600e54604080517fd97e38d6000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163d97e38d691604480820192602092909190829003018186803b158015610f4d57600080fd5b600080548190819081906101009004600160a060020a0316331480159061496857503360009081526004602052604090205460ff16155b1561497257600080fd5b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae6916024808301926020929190829003018186803b1580156149d257600080fd5b505af41580156149e6573d6000803e3d6000fd5b505050506040513d60208110156149fc57600080fd5b50519250600160a060020a038a161515614a1557600080fd5b600160a060020a038a1660009081526009602052604090205460ff1615614a3b57600080fd5b86861015614a4857600080fd5b82614a558a61366c611d05565b1115614a6057600080fd5b614a68612496565b891115614a7457600080fd5b879150811515614a82574291505b614a92828863ffffffff614fe916565b600e54604080517fc4b9223f000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918d166024830152604482018c9052606482018590526084820183905260a4820189905287151560c48301525191925073c0cc10d764f38245ca6b43aa1fe84c85002b82619163c4b9223f9160e480820192600092909190829003018186803b158015614b3857600080fd5b505af4158015614b4c573d6000803e3d6000fd5b505060408051858152602081018590528082018a9052606081018d905288151560808201529051600160a060020a038e1693507f9c30dc484837afde1ded2722ef11ba4a8f599b3cf3205def0b668e9f5e33c79f92509081900360a00190a25060019998505050505050505050565b600e54604080517fe16dd936000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529183166024830152516000918291829182918291829182918291829173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e16dd9369160448082019260e092909190829003018186803b158015614c4d57600080fd5b505af4158015614c61573d6000803e3d6000fd5b505050506040513d60e0811015614c7757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050809750819850829950839c50849d50859e50869f5050505050505050600e60009054906101000a9004600160a060020a0316600160a060020a031673c0cc10d764f38245ca6b43aa1fe84c85002b826163aa77f26c90918c6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b158015614d7e57600080fd5b505af4158015614d92573d6000803e3d6000fd5b505050506040513d6020811015614da857600080fd5b5051600e54604080517fbca9adef000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918d1660248301525191965073c0cc10d764f38245ca6b43aa1fe84c85002b82619163bca9adef91604480820192602092909190829003018186803b158015614e2c57600080fd5b505af4158015614e40573d6000803e3d6000fd5b505050506040513d6020811015614e5657600080fd5b5051989a9799509597949693959193909250565b60075460009060ff1615614e7d57600080fd5b3360009081526009602052604090205460ff1615614e9a57600080fd5b600160a060020a0383161515614eaf57600080fd5b600160a060020a03831660009081526009602052604090205460ff1615614ed557600080fd5b33600160a060020a0384161415614eeb57600080fd5b600e54604080517fa7070373000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201523360248201529185166044830152606482018490525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163a7070373916084808301926000929190829003018186803b158015614f7657600080fd5b505af4158015614f8a573d6000803e3d6000fd5b5050604080518581529051600160a060020a03871693503392507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a350600192915050565b600082821115614fe357fe5b50900390565b81810182811015610ec557fe5b6000547501000000000000000000000000000000000000000000900460ff16156150a757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f436f6e747261637420696e7374616e63652068617320616c726561647920696e60448201527f697469616c697a6564207468652061646d696e73000000000000000000000000606482015290519081900360840190fd5b6000805474ffffffffffffffffffffffffffffffffffffffff001916740aeaf8c2fe778797cd5464e7eb8351d28da2e823001790556150f9731e65f71b024937b988fdba09814d60049e0fc59d6152a1565b6000805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055565b60005460ff16156151ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560448201527f656e20696e697469616c697a6564000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831615156151df57600080fd5b81516151f290600c906020850190615361565b50805161520690600d906020840190615361565b50600f805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03858116919091179182905561523f9116613acb565b60408051600080825291513092916000805160206153fa833981519152919081900360200190a350506000805460ff1916600117905550565b600082151561528957506000610ec5565b5081810281838281151561529957fe5b0414610ec557fe5b600160a060020a03811615156152b657600080fd5b600160a060020a0381166000908152600460209081526040808320805460ff19166001179055600690915290205460ff16151561535e576002805460018082019092557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091556000908152600660205260409020805460ff191690911790555b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153a257805160ff19168380011785556153cf565b828001600101855582156153cf579182015b828111156153cf5782518255916020019190600101906153b4565b506153db9291506153df565b5090565b610db391905b808211156153db57600081556001016153e55600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582070319faccac26b10e15dad418173f3479c86b27fb8e7783f1d756049bb4ce0a70029

Deployed Bytecode

0x6080604052600436106103765763ffffffff60e060020a6000350416630489882e811461037b57806306fdde03146103a2578063095ea7b31461042c578063115f2be21461046457806313bac8f214610485578063158ef93e1461051c5780631726cbc8146105315780631785f53c1461055257806318160ddd146105755780631a841b1b1461058a578063222101d11461059f57806323b872dd146105b45780632b28d2d0146105de578063313ce567146105f3578063313f2a211461061e5780633886c957146106525780633b0da2601461066757806341fbb05014610688578063429b62e51461069d5780634610a448146106be5780634902e4aa146106d65780634f2d7ab5146106f757806354dd1da41461070c57806354fd4d501461072157806356597e65146107365780635cb0c16f1461074b5780635da01a5b1461076057806360659a921461079057806366188463146107a55780636a420bbc146107c95780636df006f3146107e35780636f75b00c146107f8578063704802751461081957806370a082311461083a578063771eee161461085b5780637b103999146108755780637db6cc1b1461088a578063820e79ed146108a25780638620410b146108b757806388d7cd97146108cc5780638da5cb5b146108e15780638df388c1146108f65780638f1d5f7e1461090b57806390657147146109205780639201de55146109c557806395d89b41146109dd57806397304ced146109f25780639860811114610a0a57806399817b4714610a1f5780639ae066b014610a40578063a4453a9614610a48578063a6f2ae3a14610a5d578063a9059cbb14610a65578063abf7b06314610a89578063ad25cb4214610a9e578063b3292ff014610abf578063b414d4b614610ae0578063b9447f7e14610b01578063bbf8980314610b19578063c3437e0614610b3a578063c389439814610b5b578063c94e643c14610b73578063cb0b7b0314610b97578063cedcd77014610baf578063cf1f3dd714610bc7578063d28dcdea14610bdc578063d73c277c14610bf1578063d73dd62314610c06578063da14c72314610c2a578063dd62ed3e14610c4e578063ddad3ca114610c75578063deca6e7614610c8a578063e01bc60b14610c9f578063e724529c14610cb4578063f2fde38b14610cda578063f69f8a5c14610cfb578063fc13566d14610d13578063ffff6b0414610d45575b600080fd5b34801561038757600080fd5b50610390610daf565b60408051918252519081900360200190f35b3480156103ae57600080fd5b506103b7610db6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103f15781810151838201526020016103d9565b50505050905090810190601f16801561041e5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561043857600080fd5b50610450600160a060020a0360043516602435610e69565b604080519115158252519081900360200190f35b34801561047057600080fd5b50610390600160a060020a0360043516610ecb565b34801561049157600080fd5b506040805160206004803580820135601f810184900484028501840190955284845261045094369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610f7f9650505050505050565b34801561052857600080fd5b50610450611238565b34801561053d57600080fd5b50610390600160a060020a0360043516611241565b34801561055e57600080fd5b50610573600160a060020a03600435166112c3565b005b34801561058157600080fd5b5061039061135b565b34801561059657600080fd5b506104506113eb565b3480156105ab57600080fd5b50610390611662565b3480156105c057600080fd5b50610450600160a060020a03600435811690602435166044356116f0565b3480156105ea57600080fd5b50610390611915565b3480156105ff57600080fd5b5061060861191b565b6040805160ff9092168252519081900360200190f35b34801561062a57600080fd5b50610636600435611920565b60408051600160a060020a039092168252519081900360200190f35b34801561065e57600080fd5b50610636611948565b34801561067357600080fd5b50610450600160a060020a0360043516611957565b34801561069457600080fd5b50610636611a83565b3480156106a957600080fd5b50610450600160a060020a0360043516611afd565b3480156106ca57600080fd5b50610636600435611b12565b3480156106e257600080fd5b50610573600160a060020a0360043516611b93565b34801561070357600080fd5b50610390611c2b565b34801561071857600080fd5b50610450611c31565b34801561072d57600080fd5b506103b7611c6a565b34801561074257600080fd5b50610390611ca1565b34801561075757600080fd5b50610390611d05565b34801561076c57600080fd5b50610450600435602435604435606435608435600160a060020a0360a43516611d9d565b34801561079c57600080fd5b50610390612496565b3480156107b157600080fd5b50610450600160a060020a03600435166024356124b7565b3480156107d557600080fd5b5061045060043515156125d5565b3480156107ef57600080fd5b506104506126b4565b34801561080457600080fd5b50610450600160a060020a03600435166126bd565b34801561082557600080fd5b50610573600160a060020a03600435166127e6565b34801561084657600080fd5b50610390600160a060020a0360043516612911565b34801561086757600080fd5b5061057360043515156129d1565b34801561088157600080fd5b50610636612a57565b34801561089657600080fd5b50610636600435612a66565b3480156108ae57600080fd5b50610390612a74565b3480156108c357600080fd5b50610390612aee565b3480156108d857600080fd5b50610636612b68565b3480156108ed57600080fd5b50610636612b77565b34801561090257600080fd5b50610390612b8b565b34801561091757600080fd5b50610390612c05565b34801561092c57600080fd5b5060408051602060046024803582810135601f8101859004850286018501909652858552610573958335600160a060020a031695369560449491939091019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750612cdc9650505050505050565b3480156109d157600080fd5b506103b7600435612d34565b3480156109e957600080fd5b506103b7612ec9565b3480156109fe57600080fd5b50610450600435612f46565b348015610a1657600080fd5b5061039061309e565b348015610a2b57600080fd5b50610450600160a060020a03600435166130de565b6104506132f8565b348015610a5457600080fd5b50610390613361565b6103906133db565b348015610a7157600080fd5b50610450600160a060020a0360043516602435613997565b348015610a9557600080fd5b50610390613ab0565b348015610aaa57600080fd5b50610450600160a060020a0360043516613ab6565b348015610acb57600080fd5b50610573600160a060020a0360043516613acb565b348015610aec57600080fd5b50610450600160a060020a0360043516613b45565b348015610b0d57600080fd5b50610636600435613b5a565b348015610b2557600080fd5b50610450600160a060020a0360043516613bdb565b348015610b4657600080fd5b50610450600160a060020a0360043516613e6a565b348015610b6757600080fd5b50610636600435613eec565b348015610b7f57600080fd5b50610450600160a060020a0360043516602435613efa565b348015610ba357600080fd5b506104506004356140fe565b348015610bbb57600080fd5b50610450600435614142565b348015610bd357600080fd5b506103b761429d565b348015610be857600080fd5b5061045061432b565b348015610bfd57600080fd5b506103b761434c565b348015610c1257600080fd5b50610450600160a060020a03600435166024356143a7565b348015610c3657600080fd5b50610450600160a060020a036004351660243561447b565b348015610c5a57600080fd5b50610390600160a060020a036004358116906024351661457b565b348015610c8157600080fd5b50610390614638565b348015610c9657600080fd5b50610450614648565b348015610cab57600080fd5b5061039061466a565b348015610cc057600080fd5b50610573600160a060020a036004351660243515156146e4565b348015610ce657600080fd5b50610573600160a060020a036004351661480c565b348015610d0757600080fd5b506106366004356148b0565b348015610d1f57600080fd5b50610450600160a060020a036004351660243560443560643560843560a4351515614931565b348015610d5157600080fd5b50610d66600160a060020a0360043516614bbb565b60408051998a5260208a0198909852888801969096526060880194909452608087019290925260a086015260c085015260e0840152151561010083015251908190036101200190f35b6001545b90565b600e54604080517f6f0fccab000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251606091610e649173c0cc10d764f38245ca6b43aa1fe84c85002b826191636f0fccab916024808301926020929190829003018186803b158015610e3357600080fd5b505af4158015610e47573d6000803e3d6000fd5b505050506040513d6020811015610e5d57600080fd5b5051612d34565b905090565b60075460009060ff1615610e7c57600080fd5b3360009081526009602052604090205460ff1615610e9957600080fd5b811580610ead5750610eab338461457b565b155b1515610eb857600080fd5b610ec28383614e6a565b90505b92915050565b600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ddf9d61391604480820192602092909190829003018186803b158015610f4d57600080fd5b505af4158015610f61573d6000803e3d6000fd5b505050506040513d6020811015610f7757600080fd5b505192915050565b60008054819081906101009004600160a060020a03163314801590610fb457503360009081526004602052604090205460ff16155b15610fbe57600080fd5b60075460ff161515610fcf57600080fd5b8451610fe290600c906020880190615361565b508351610ff690600d906020870190615361565b50610fff6113eb565b50600f5460405160e160020a6328cf2aed028152602060048201908152600d80546002600019600183161561010002019091160460248401819052600160a060020a039094169363519e55da939192918291604490910190849080156110a65780601f1061107b576101008083540402835291602001916110a6565b820191906000526020600020905b81548152906001019060200180831161108957829003601f168201915b505092505050602060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b505050506040513d60208110156110f057600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da93928291604490910190849080156111995780601f1061116e57610100808354040283529160200191611199565b820191906000526020600020905b81548152906001019060200180831161117c57829003601f168201915b505092505050602060405180830381600087803b1580156111b957600080fd5b505af11580156111cd573d6000803e3d6000fd5b505050506040513d60208110156111e357600080fd5b505160408051600160a060020a0380841682528516602082015281519293507f8e2c71dfeb156b7c7d03fa7cba1af111d058c575816f578cb3c2d8c6be99e0ca929081900390910190a1506001949350505050565b60005460ff1681565b600e54604080517f7243cfbb000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191637243cfbb91604480820192602092909190829003018186803b158015610f4d57600080fd5b6000546101009004600160a060020a031633148015906112f357503360009081526004602052604090205460ff16155b156112fd57600080fd5b600160a060020a038116151561131257600080fd5b600160a060020a038116600081815260036020526040808220805460ff19169055517f753f40ca3312b2408759a67875b367955e7baa221daf08aa3d643d96202ac12b9190a250565b600b54604080517f7e1c0c090000000000000000000000000000000000000000000000000000000081529051600092600160a060020a031691637e1c0c0991600480830192602092919082900301818787803b1580156113ba57600080fd5b505af11580156113ce573d6000803e3d6000fd5b505050506040513d60208110156113e457600080fd5b5051905090565b600080546101009004600160a060020a0316331480159061141c57503360009081526004602052604090205460ff16155b1561142657600080fd5b600f5460405160e160020a6328cf2aed028152602060048201908152600d805460026000196001831615610100020190911604602484018190526000948594600160a060020a039091169363519e55da939290918291604490910190849080156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b505092505050602060405180830381600087803b1580156114f157600080fd5b505af1158015611505573d6000803e3d6000fd5b505050506040513d602081101561151b57600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da93928291604490910190849080156115c45780601f10611599576101008083540402835291602001916115c4565b820191906000526020600020905b8154815290600101906020018083116115a757829003601f168201915b505092505050602060405180830381600087803b1580156115e457600080fd5b505af11580156115f8573d6000803e3d6000fd5b505050506040513d602081101561160e57600080fd5b5051600b8054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831617909255600e805492841692909116919091179055905061165960016129d1565b60019250505090565b600e54604080517f0b96406a000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191630b96406a91602480820192602092909190829003018186803b1580156116dc57600080fd5b505af41580156113ce573d6000803e3d6000fd5b600754600090819060ff161561170557600080fd5b3360009081526009602052604090205460ff161561172257600080fd5b600160a060020a03851660009081526009602052604090205460ff161561174857600080fd5b600160a060020a03841660009081526009602052604090205460ff161561176e57600080fd5b600160a060020a03851633141561178457600080fd5b61178e853361457b565b90508281101561179d57600080fd5b600b54604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301528781166024830152604482018790529151919092169163beabacc891606480830192600092919082900301818387803b15801561181357600080fd5b505af1158015611827573d6000803e3d6000fd5b5050600e5473c0cc10d764f38245ca6b43aa1fe84c85002b8261925063a70703739150600160a060020a03168733611865868963ffffffff614fd716565b6040805160e060020a63ffffffff8816028152600160a060020a0395861660048201529385166024850152919093166044830152606482019290925290516084808301926000929190829003018186803b1580156118c257600080fd5b505af41580156118d6573d6000803e3d6000fd5b5050604080518681529051600160a060020a038089169450891692506000805160206153fa8339815191529181900360200190a3506001949350505050565b60085490565b601281565b600180548290811061192e57fe5b600091825260209091200154600160a060020a0316905081565b600b54600160a060020a031681565b600080546101009004600160a060020a0316331480159061198857503360009081526004602052604090205460ff16155b1561199257600080fd5b600160a060020a03821615156119a757600080fd5b600e54604080517f3613b781000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291841660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191633613b781916044808301926000929190829003018186803b158015611a2557600080fd5b505af4158015611a39573d6000803e3d6000fd5b50505050611a46826130de565b50604051600160a060020a038316907fe8a24516e1d3bae0c4742f4e5ded148733d2193d648d57d54bbec9c20e4b444990600090a2506001919050565b600e54604080517f96468249000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b826191639646824991602480820192602092909190829003018186803b1580156116dc57600080fd5b60036020526000908152604090205460ff1681565b600e54604080517f52bafbfa000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916352bafbfa91604480820192602092909190829003018186803b158015610f4d57600080fd5b6000546101009004600160a060020a03163314801590611bc357503360009081526004602052604090205460ff16155b15611bcd57600080fd5b600160a060020a0381161515611be257600080fd5b600160a060020a038116600081815260046020526040808220805460ff19169055517f1aaaaf7609619e631f47eb3546f9fdd8c61b1af2175988a0ddb9a06680c3b9ed9190a250565b60105481565b60075460009060ff1615611c4457600080fd5b3360009081526009602052604090205460ff1615611c6157600080fd5b610e64336130de565b60408051808201909152600181527f3300000000000000000000000000000000000000000000000000000000000000602082015281565b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000610e64611d12612b8b565b600b60009054906101000a9004600160a060020a0316600160a060020a0316635cb0c16f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611d6557600080fd5b505af1158015611d79573d6000803e3d6000fd5b505050506040513d6020811015611d8f57600080fd5b50519063ffffffff614fe916565b6000805481906101009004600160a060020a03163314801590611dd057503360009081526004602052604090205460ff16155b15611dda57600080fd5b600f5460405160e160020a6328cf2aed028152602060048201908152600d805460026000196001831615610100020190911604602484018190526000948594600160a060020a039091169363519e55da93929091829160449091019084908015611e855780601f10611e5a57610100808354040283529160200191611e85565b820191906000526020600020905b815481529060010190602001808311611e6857829003601f168201915b505092505050602060405180830381600087803b158015611ea557600080fd5b505af1158015611eb9573d6000803e3d6000fd5b505050506040513d6020811015611ecf57600080fd5b5051600f5460405160e160020a6328cf2aed028152602060048201908152600c80546002600019600183161561010002019091160460248401819052949650600160a060020a039093169363519e55da9392829160449091019084908015611f785780601f10611f4d57610100808354040283529160200191611f78565b820191906000526020600020905b815481529060010190602001808311611f5b57829003601f168201915b505092505050602060405180830381600087803b158015611f9857600080fd5b505af1158015611fac573d6000803e3d6000fd5b505050506040513d6020811015611fc257600080fd5b5051600b8054600160a060020a0380861673ffffffffffffffffffffffffffffffffffffffff1992831617909255600e805483851692169190911790819055604080517fcedc7277000000000000000000000000000000000000000000000000000000008152919092166004820152905191925073c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc727791602480820192602092909190829003018186803b15801561207257600080fd5b505af4158015612086573d6000803e3d6000fd5b505050506040513d602081101561209c57600080fd5b505192506000831180156120b05750878314155b156120c65760075460ff1615156120c657600080fd5b600e54604080517f9c473bb2000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173c0cc10d764f38245ca6b43aa1fe84c85002b826191639c473bb2916044808301926000929190829003018186803b15801561214357600080fd5b505af4158015612157573d6000803e3d6000fd5b5050600e54604080517fe6e623d5000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018d90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063e6e623d592506044808301926000929190829003018186803b1580156121d857600080fd5b505af41580156121ec573d6000803e3d6000fd5b5050600e54604080517f1112b124000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018c90525173c0cc10d764f38245ca6b43aa1fe84c85002b82619350631112b12492506044808301926000929190829003018186803b15801561226d57600080fd5b505af4158015612281573d6000803e3d6000fd5b5050600e54604080517fcd54c54e000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018b90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063cd54c54e92506044808301926000929190829003018186803b15801561230257600080fd5b505af4158015612316573d6000803e3d6000fd5b5050600e54604080517f05bf779f000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291891660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826193506305bf779f92506044808301926000929190829003018186803b15801561239857600080fd5b505af41580156123ac573d6000803e3d6000fd5b5050600e54604080517fdbafdbb6000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018a90525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063dbafdbb692506044808301926000929190829003018186803b15801561242d57600080fd5b505af4158015612441573d6000803e3d6000fd5b5050604080518b8152602081018b90528082018a905290517f9d1a3ea811a60a1b2c08f8e30a09832514a3ec19ba354d73d8fe12ad66591cec9350908190036060019150a15060019998505050505050505050565b6000610e646124a3611d05565b6124ab61135b565b9063ffffffff614fd716565b600754600090819060ff16156124cc57600080fd5b3360009081526009602052604090205460ff16156124e957600080fd5b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015233602482015291861660448301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b41916064808301926020929190829003018186803b15801561256d57600080fd5b505af4158015612581573d6000803e3d6000fd5b505050506040513d602081101561259757600080fd5b50519050808311156125b5576125ae846000614e6a565b91506125ce565b6125ae846125c9838663ffffffff614fd716565b614e6a565b5092915050565b600080546101009004600160a060020a0316331480159061260657503360009081526004602052604090205460ff16155b1561261057600080fd5b600f805483158015740100000000000000000000000000000000000000000274ff00000000000000000000000000000000000000001990921691909117909155612682576040517ff5eced797ccd723743102a9d898a1372f6bd7a0206c4facf99081b9471f5727290600090a16126ac565b6040517fd20fe4b54e307993c74930d195aa389bf91e188918e31ad1da29aad5a748a4d390600090a15b506001919050565b60075460ff1681565b600080546101009004600160a060020a031633148015906126ee57503360009081526004602052604090205460ff16155b156126f857600080fd5b600160a060020a038216151561270d57600080fd5b600e54604080517f6ace6dc8000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529184166024830152600060448301819052905173c0cc10d764f38245ca6b43aa1fe84c85002b826192636ace6dc8926064808301939192829003018186803b15801561279257600080fd5b505af41580156127a6573d6000803e3d6000fd5b5050604051600160a060020a03851692507f434d4944e12211f9f671e6e354248816735c0452bc160d31e737245b3dcb45c39150600090a2506001919050565b6000546101009004600160a060020a0316331480159061281657503360009081526004602052604090205460ff16155b1561282057600080fd5b600160a060020a038116151561283557600080fd5b600160a060020a0381166000908152600360209081526040808320805460ff19166001179055600590915290205460ff1615156128da576001805480820182557fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf601805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091556000908152600560205260409020805460ff191690911790555b604051600160a060020a038216907fad6de4452a631e641cb59902236607946ce9272b9b981f2f80e8d129cb9084ba90600090a250565b600030600160a060020a0383168114156129345761292d612496565b91506129cb565b600b54604080517f70a08231000000000000000000000000000000000000000000000000000000008152600160a060020a038681166004830152915191909216916370a082319160248083019260209291908290030181600087803b15801561299c57600080fd5b505af11580156129b0573d6000803e3d6000fd5b505050506040513d60208110156129c657600080fd5b505191505b50919050565b6000546101009004600160a060020a03163314801590612a0157503360009081526004602052604090205460ff16155b15612a0b57600080fd5b6007805460ff191682151517908190556040805160ff90921615158252517f1623ff1a4138a65cb1f44d1a94c034f7dd8c1e826fefb1f27f0898580601e68d916020908290030190a150565b600f54600160a060020a031681565b600880548290811061192e57fe5b600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d91602480820192602092909190829003018186803b1580156116dc57600080fd5b600e54604080517fcedc7277000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc727791602480820192602092909190829003018186803b1580156116dc57600080fd5b600e54600160a060020a031681565b6000546101009004600160a060020a031681565b600e54604080517feec5d076000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163eec5d07691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000600d6040516020018082805460018160011615610100020316600290048015612c675780601f10612c45576101008083540402835291820191612c67565b820191906000526020600020905b815481529060010190602001808311612c53575b50509150506040516020818303038152906040526040518082805190602001908083835b60208310612caa5780518252601f199092019160209182019101612c8b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905090565b33730aeaf8c2fe778797cd5464e7eb8351d28da2e8231480612d11575033731e65f71b024937b988fdba09814d60049e0fc59d145b1515612d1c57600080fd5b612d24614ff6565b612d2f838383615132565b505050565b6040805160208082528183019092526060918291600091829184918082016104008038833901905050935060009250600091505b6020821015612e1857858260208110612d7d57fe5b1a60f860020a027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916600060f860020a02141515612e0d57858260208110612dc157fe5b1a60f860020a028484815181101515612dd657fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506001909201915b600190910190612d68565b826040519080825280601f01601f191660200182016040528015612e46578160200160208202803883390190505b509050600091505b82821015612ec0578382815181101515612e6457fe5b90602001015160f860020a900460f860020a028183815181101515612e8557fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600190910190612e4e565b95945050505050565b600e54604080517f81a73ad5000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251606091610e649173c0cc10d764f38245ca6b43aa1fe84c85002b8261916381a73ad5916024808301926020929190829003018186803b158015610e3357600080fd5b600080546101009004600160a060020a03163314801590612f7757503360009081526004602052604090205460ff16155b15612f8157600080fd5b6b1363156bbee3016d70000000612fa6612f9961135b565b849063ffffffff614fe916565b1115612fb157600080fd5b60008211612fbe57600080fd5b600b54604080517f97304ced000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a03909216916397304ced9160248082019260009290919082900301818387803b15801561302457600080fd5b505af1158015613038573d6000803e3d6000fd5b50506040805185815290517f07883703ed0e86588a40d76551c92f8a4b329e3bf19765e0e6749473c1a846659350908190036020019150a160408051838152905130916000916000805160206153fa8339815191529181900360200190a3506001919050565b6000600c6040516020018082805460018160011615610100020316600290048015612c675780601f10612c45576101008083540402835291820191612c67565b600754600090819060ff16156130f357600080fd5b3360009081526009602052604090205460ff161561311057600080fd5b600160a060020a038316151561312557600080fd5b600160a060020a03831660009081526009602052604090205460ff161561314b57600080fd5b61315483611241565b905080151561316657600191506129cb565b600e54604080517f4698da9d000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291851660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191634698da9d916044808301926000929190829003018186803b1580156131e457600080fd5b505af41580156131f8573d6000803e3d6000fd5b5050600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152600160a060020a038881166004830152602482018790529151919092169350634cfe3e7f9250604480830192600092919082900301818387803b15801561326a57600080fd5b505af115801561327e573d6000803e3d6000fd5b5050604080518481529051600160a060020a03871693503092506000805160206153fa8339815191529181900360200190a3604080518281529051600160a060020a038516917f39dfd9c15a87979822cf6b236d0974075578d5b822244050f3c876a6cd1d2055919081900360200190a250600192915050565b60075460009060ff161561330b57600080fd5b3360009081526009602052604090205460ff161561332857600080fd5b6040805134815290517fdfcc97ccd559bb2bb289cefc32e1a1212d9bf091c06ffb121083134325afa3f89181900360200190a150600190565b600e54604080517f576f7e31000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163576f7e3191602480820192602092909190829003018186803b1580156116dc57600080fd5b60075460009081908190819081908190819060ff16156133fa57600080fd5b3360009081526009602052604090205460ff161561341757600080fd5b600f5474010000000000000000000000000000000000000000900460ff161561343f57600080fd5b600e54604080517f336077c3000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301523360248301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163336077c3916044808301926020929190829003018186803b1580156134bb57600080fd5b505af41580156134cf573d6000803e3d6000fd5b505050506040513d60208110156134e557600080fd5b505115156134f257600080fd5b600e54604080517fcedc7277000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163cedc7277916024808301926020929190829003018186803b15801561356857600080fd5b505af415801561357c573d6000803e3d6000fd5b505050506040513d602081101561359257600080fd5b5051600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525191975073c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae691602480820192602092909190829003018186803b1580156135f857600080fd5b505af415801561360c573d6000803e3d6000fd5b505050506040513d602081101561362257600080fd5b505194506000341161363357600080fd5b6000861161364057600080fd5b6000851161364d57600080fd5b61365d348763ffffffff61527816565b9350846136788561366c611d05565b9063ffffffff614fe916565b111561368357600080fd5b61368b612496565b84111561369757600080fd5b600b54604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b1580156136fd57600080fd5b505af1158015613711573d6000803e3d6000fd5b505050506040513d602081101561372757600080fd5b5051600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301523360248301525191935073c0cc10d764f38245ca6b43aa1fe84c85002b82619163ddf9d61391604480820192602092909190829003018186803b1580156137a957600080fd5b505af41580156137bd573d6000803e3d6000fd5b505050506040513d60208110156137d357600080fd5b505160105490915015806137f857506010546137f5838663ffffffff614fe916565b10155b151561380357600080fd5b6000811115613814578092506138b9565b600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d916024808301926020929190829003018186803b15801561388a57600080fd5b505af415801561389e573d6000803e3d6000fd5b505050506040513d60208110156138b457600080fd5b505192505b6000831180156138d857506138d4828563ffffffff614fe916565b8310155b15156138e357600080fd5b600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a0390921691634cfe3e7f9160448082019260009290919082900301818387803b15801561394f57600080fd5b505af1158015613963573d6000803e3d6000fd5b50506040805187815290513393503092506000805160206153fa8339815191529181900360200190a3509195945050505050565b60075460009060ff16156139aa57600080fd5b3360009081526009602052604090205460ff16156139c757600080fd5b600160a060020a03831660009081526009602052604090205460ff16156139ed57600080fd5b600b54604080517fbeabacc8000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a038681166024830152604482018690529151919092169163beabacc891606480830192600092919082900301818387803b158015613a6157600080fd5b505af1158015613a75573d6000803e3d6000fd5b5050604080518581529051600160a060020a03871693503392506000805160206153fa8339815191529181900360200190a350600192915050565b60025490565b60046020526000908152604090205460ff1681565b6000546101009004600160a060020a03163314801590613afb57503360009081526004602052604090205460ff16155b15613b0557600080fd5b613b0e816152a1565b604051600160a060020a038216907ffba24c034afca607a35e1f221b154b3f8e1f88c7924c8a0a06755b70708c44d890600090a250565b60096020526000908152604090205460ff1681565b600e54604080517f58c6bce8000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916358c6bce891604480820192602092909190829003018186803b158015610f4d57600080fd5b6000805481906101009004600160a060020a03163314801590613c0e57503360009081526004602052604090205460ff16155b15613c1857600080fd5b600160a060020a0383161515613c2d57600080fd5b600e54604080517f6ace6dc8000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152600160448301525173c0cc10d764f38245ca6b43aa1fe84c85002b826191636ace6dc8916064808301926000929190829003018186803b158015613cb257600080fd5b505af4158015613cc6573d6000803e3d6000fd5b5050600e54604080517fddf9d613000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291871660248301525173c0cc10d764f38245ca6b43aa1fe84c85002b8261935063ddf9d61392506044808301926020929190829003018186803b158015613d4857600080fd5b505af4158015613d5c573d6000803e3d6000fd5b505050506040513d6020811015613d7257600080fd5b50519050801515613e2257600e54604080517fec7c637d000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163ec7c637d916024808301926020929190829003018186803b158015613df357600080fd5b505af4158015613e07573d6000803e3d6000fd5b505050506040513d6020811015613e1d57600080fd5b505190505b604080518281529051600160a060020a038516917fcb3de9106aa8cc3efea54defa4b3ec342e8ae23607fd0255b1dcee4813f9f4bc919081900360200190a250600192915050565b600e54604080517f336077c3000000000000000000000000000000000000000000000000000000008152600160a060020a03928316600482015291831660248301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163336077c391604480820192602092909190829003018186803b158015610f4d57600080fd5b600280548290811061192e57fe5b6000805481906101009004600160a060020a03163314801590613f2d57503360009081526004602052604090205460ff16155b15613f3757600080fd5b600f5474010000000000000000000000000000000000000000900460ff161515613f6057600080fd5b600160a060020a03841660009081526009602052604090205460ff1615613f8657600080fd5b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae6916024808301926020929190829003018186803b158015613fe657600080fd5b505af4158015613ffa573d6000803e3d6000fd5b505050506040513d602081101561401057600080fd5b50519050806140218461366c611d05565b111561402c57600080fd5b614034612496565b83111561404057600080fd5b600b54604080517f4cfe3e7f000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301526024820187905291519190921691634cfe3e7f91604480830192600092919082900301818387803b1580156140ae57600080fd5b505af11580156140c2573d6000803e3d6000fd5b5050604080518681529051600160a060020a03881693503092506000805160206153fa8339815191529181900360200190a35060019392505050565b600080546101009004600160a060020a0316331480159061412f57503360009081526004602052604090205460ff16155b1561413957600080fd5b50601055600190565b600e54604080517f96468249000000000000000000000000000000000000000000000000000000008152600160a060020a03909216600483015251600091829173c0cc10d764f38245ca6b43aa1fe84c85002b8261916396468249916024808301926020929190829003018186803b1580156141bd57600080fd5b505af41580156141d1573d6000803e3d6000fd5b505050506040513d60208110156141e757600080fd5b50519050600160a060020a038116151561420057600080fd5b6000546101009004600160a060020a03163314801590614229575033600160a060020a03821614155b1561423357600080fd5b604051339084156108fc029085906000818181858888f19350505050158015614260573d6000803e3d6000fd5b506040805184815290517f4938436c771c2d50d08d91b156ca4b3ab759fa99c83c50d541e72166d46f85e09181900360200190a150600192915050565b600d805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156143235780601f106142f857610100808354040283529160200191614323565b820191906000526020600020905b81548152906001019060200180831161430657829003601f168201915b505050505081565b600f5474010000000000000000000000000000000000000000900460ff1681565b600c805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156143235780601f106142f857610100808354040283529160200191614323565b60075460009060ff16156143ba57600080fd5b3360009081526009602052604090205460ff16156143d757600080fd5b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152336024820152918516604483015251610ec29185916125c991869173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b41916064808301926020929190829003018186803b15801561446757600080fd5b505af4158015611d79573d6000803e3d6000fd5b600080546101009004600160a060020a031633148015906144ac57503360009081526004602052604090205460ff16155b156144b657600080fd5b600160a060020a03831615156144cb57600080fd5b600e54604080517f4989b0b6000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529185166024830152604482018490525173c0cc10d764f38245ca6b43aa1fe84c85002b826191634989b0b6916064808301926000929190829003018186803b15801561455057600080fd5b505af4158015614564573d6000803e3d6000fd5b5050505061457183613bdb565b5060019392505050565b600e54604080517fe7092b41000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152848316602482015291831660448301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e7092b4191606480820192602092909190829003018186803b15801561460557600080fd5b505af4158015614619573d6000803e3d6000fd5b505050506040513d602081101561462f57600080fd5b50519392505050565b6b1363156bbee3016d7000000081565b6000547501000000000000000000000000000000000000000000900460ff1681565b600e54604080517f27132be6000000000000000000000000000000000000000000000000000000008152600160a060020a0390921660048301525160009173c0cc10d764f38245ca6b43aa1fe84c85002b8261916327132be691602480820192602092909190829003018186803b1580156116dc57600080fd5b6000546101009004600160a060020a0316331480159061471457503360009081526004602052604090205460ff16155b1561471e57600080fd5b600160a060020a0382166000908152600960209081526040808320805460ff1916851515179055600a90915290205460ff1615156147c7576008805460018082019092557ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385169081179091556000908152600a60205260409020805460ff191690911790555b6040805182151581529051600160a060020a038416917f48335238b4855f35377ed80f164e8c6f3c366e54ac00b96a6402d4a9814a03a5919081900360200190a25050565b6000546101009004600160a060020a0316331461482857600080fd5b600160a060020a038116151561483d57600080fd5b60008054604051600160a060020a038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a039092166101000274ffffffffffffffffffffffffffffffffffffffff0019909216919091179055565b600e54604080517fd97e38d6000000000000000000000000000000000000000000000000000000008152600160a060020a039092166004830152602482018390525160009173c0cc10d764f38245ca6b43aa1fe84c85002b82619163d97e38d691604480820192602092909190829003018186803b158015610f4d57600080fd5b600080548190819081906101009004600160a060020a0316331480159061496857503360009081526004602052604090205460ff16155b1561497257600080fd5b600e546040805160e160020a635ac01573028152600160a060020a0390921660048301525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163b5802ae6916024808301926020929190829003018186803b1580156149d257600080fd5b505af41580156149e6573d6000803e3d6000fd5b505050506040513d60208110156149fc57600080fd5b50519250600160a060020a038a161515614a1557600080fd5b600160a060020a038a1660009081526009602052604090205460ff1615614a3b57600080fd5b86861015614a4857600080fd5b82614a558a61366c611d05565b1115614a6057600080fd5b614a68612496565b891115614a7457600080fd5b879150811515614a82574291505b614a92828863ffffffff614fe916565b600e54604080517fc4b9223f000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918d166024830152604482018c9052606482018590526084820183905260a4820189905287151560c48301525191925073c0cc10d764f38245ca6b43aa1fe84c85002b82619163c4b9223f9160e480820192600092909190829003018186803b158015614b3857600080fd5b505af4158015614b4c573d6000803e3d6000fd5b505060408051858152602081018590528082018a9052606081018d905288151560808201529051600160a060020a038e1693507f9c30dc484837afde1ded2722ef11ba4a8f599b3cf3205def0b668e9f5e33c79f92509081900360a00190a25060019998505050505050505050565b600e54604080517fe16dd936000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201529183166024830152516000918291829182918291829182918291829173c0cc10d764f38245ca6b43aa1fe84c85002b82619163e16dd9369160448082019260e092909190829003018186803b158015614c4d57600080fd5b505af4158015614c61573d6000803e3d6000fd5b505050506040513d60e0811015614c7757600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050809750819850829950839c50849d50859e50869f5050505050505050600e60009054906101000a9004600160a060020a0316600160a060020a031673c0cc10d764f38245ca6b43aa1fe84c85002b826163aa77f26c90918c6040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182600160a060020a0316600160a060020a031681526020019250505060206040518083038186803b158015614d7e57600080fd5b505af4158015614d92573d6000803e3d6000fd5b505050506040513d6020811015614da857600080fd5b5051600e54604080517fbca9adef000000000000000000000000000000000000000000000000000000008152600160a060020a039283166004820152918d1660248301525191965073c0cc10d764f38245ca6b43aa1fe84c85002b82619163bca9adef91604480820192602092909190829003018186803b158015614e2c57600080fd5b505af4158015614e40573d6000803e3d6000fd5b505050506040513d6020811015614e5657600080fd5b5051989a9799509597949693959193909250565b60075460009060ff1615614e7d57600080fd5b3360009081526009602052604090205460ff1615614e9a57600080fd5b600160a060020a0383161515614eaf57600080fd5b600160a060020a03831660009081526009602052604090205460ff1615614ed557600080fd5b33600160a060020a0384161415614eeb57600080fd5b600e54604080517fa7070373000000000000000000000000000000000000000000000000000000008152600160a060020a0392831660048201523360248201529185166044830152606482018490525173c0cc10d764f38245ca6b43aa1fe84c85002b82619163a7070373916084808301926000929190829003018186803b158015614f7657600080fd5b505af4158015614f8a573d6000803e3d6000fd5b5050604080518581529051600160a060020a03871693503392507f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259181900360200190a350600192915050565b600082821115614fe357fe5b50900390565b81810182811015610ec557fe5b6000547501000000000000000000000000000000000000000000900460ff16156150a757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f436f6e747261637420696e7374616e63652068617320616c726561647920696e60448201527f697469616c697a6564207468652061646d696e73000000000000000000000000606482015290519081900360840190fd5b6000805474ffffffffffffffffffffffffffffffffffffffff001916740aeaf8c2fe778797cd5464e7eb8351d28da2e823001790556150f9731e65f71b024937b988fdba09814d60049e0fc59d6152a1565b6000805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055565b60005460ff16156151ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f436f6e747261637420696e7374616e63652068617320616c726561647920626560448201527f656e20696e697469616c697a6564000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831615156151df57600080fd5b81516151f290600c906020850190615361565b50805161520690600d906020840190615361565b50600f805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03858116919091179182905561523f9116613acb565b60408051600080825291513092916000805160206153fa833981519152919081900360200190a350506000805460ff1916600117905550565b600082151561528957506000610ec5565b5081810281838281151561529957fe5b0414610ec557fe5b600160a060020a03811615156152b657600080fd5b600160a060020a0381166000908152600460209081526040808320805460ff19166001179055600690915290205460ff16151561535e576002805460018082019092557f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384169081179091556000908152600660205260409020805460ff191690911790555b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106153a257805160ff19168380011785556153cf565b828001600101855582156153cf579182015b828111156153cf5782518255916020019190600101906153b4565b506153db9291506153df565b5090565b610db391905b808211156153db57600081556001016153e55600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582070319faccac26b10e15dad418173f3479c86b27fb8e7783f1d756049bb4ce0a70029

Libraries Used


Swarm Source

bzzr://70319faccac26b10e15dad418173f3479c86b27fb8e7783f1d756049bb4ce0a7

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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