ERC-20
Exchange
Overview
Max Total Supply
999,999,999.9999 BUX
Holders
516 (0.00%)
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 4 Decimals)
Balance
63,272,552.7226 BUXValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SmartzToken
Compiler Version
v0.4.25+commit.59dbf8f1
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-04-07 */ pragma solidity ^0.4.18; interface IApprovalRecipient { /** * @notice Signals that token holder approved spending of tokens and some action should be taken. * * @param _sender token holder which approved spending of his tokens * @param _value amount of tokens approved to be spent * @param _extraData any extra data token holder provided to the call * * @dev warning: implementors should validate sender of this message (it should be the token) and make no further * assumptions unless validated them via ERC20 methods. */ function receiveApproval(address _sender, uint256 _value, bytes _extraData) public; } interface IKYCProvider { function isKYCPassed(address _address) public view returns (bool); } library SafeMath { function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; assert(c / a == b); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { // 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 c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; assert(c >= a); return c; } } contract ArgumentsChecker { /// @dev check which prevents short address attack modifier payloadSizeIs(uint size) { require(msg.data.length == size + 4 /* function selector */); _; } /// @dev check that address is valid modifier validAddress(address addr) { require(addr != address(0)); _; } } contract multiowned { // TYPES // struct for the status of a pending operation. struct MultiOwnedOperationPendingState { // count of confirmations needed uint yetNeeded; // bitmap of confirmations where owner #ownerIndex's decision corresponds to 2**ownerIndex bit uint ownersDone; // position of this operation key in m_multiOwnedPendingIndex uint index; } // EVENTS event Confirmation(address owner, bytes32 operation); event Revoke(address owner, bytes32 operation); event FinalConfirmation(address owner, bytes32 operation); // some others are in the case of an owner changing. event OwnerChanged(address oldOwner, address newOwner); event OwnerAdded(address newOwner); event OwnerRemoved(address oldOwner); // the last one is emitted if the required signatures change event RequirementChanged(uint newRequirement); // MODIFIERS // simple single-sig function modifier. modifier onlyowner { require(isOwner(msg.sender)); _; } // multi-sig function modifier: the operation must have an intrinsic hash in order // that later attempts can be realised as the same underlying operation and // thus count as confirmations. modifier onlymanyowners(bytes32 _operation) { if (confirmAndCheck(_operation)) { _; } // Even if required number of confirmations has't been collected yet, // we can't throw here - because changes to the state have to be preserved. // But, confirmAndCheck itself will throw in case sender is not an owner. } modifier validNumOwners(uint _numOwners) { require(_numOwners > 0 && _numOwners <= c_maxOwners); _; } modifier multiOwnedValidRequirement(uint _required, uint _numOwners) { require(_required > 0 && _required <= _numOwners); _; } modifier ownerExists(address _address) { require(isOwner(_address)); _; } modifier ownerDoesNotExist(address _address) { require(!isOwner(_address)); _; } modifier multiOwnedOperationIsActive(bytes32 _operation) { require(isOperationActive(_operation)); _; } // METHODS // constructor is given number of sigs required to do protected "onlymanyowners" transactions // as well as the selection of addresses capable of confirming them (msg.sender is not added to the owners!). function multiowned(address[] _owners, uint _required) public validNumOwners(_owners.length) multiOwnedValidRequirement(_required, _owners.length) { assert(c_maxOwners <= 255); m_numOwners = _owners.length; m_multiOwnedRequired = _required; for (uint i = 0; i < _owners.length; ++i) { address owner = _owners[i]; // invalid and duplicate addresses are not allowed require(0 != owner && !isOwner(owner) /* not isOwner yet! */); uint currentOwnerIndex = checkOwnerIndex(i + 1 /* first slot is unused */); m_owners[currentOwnerIndex] = owner; m_ownerIndex[owner] = currentOwnerIndex; } assertOwnersAreConsistent(); } /// @notice replaces an owner `_from` with another `_to`. /// @param _from address of owner to replace /// @param _to address of new owner // All pending operations will be canceled! function changeOwner(address _from, address _to) external ownerExists(_from) ownerDoesNotExist(_to) onlymanyowners(keccak256(msg.data)) { assertOwnersAreConsistent(); clearPending(); uint ownerIndex = checkOwnerIndex(m_ownerIndex[_from]); m_owners[ownerIndex] = _to; m_ownerIndex[_from] = 0; m_ownerIndex[_to] = ownerIndex; assertOwnersAreConsistent(); OwnerChanged(_from, _to); } /// @notice adds an owner /// @param _owner address of new owner // All pending operations will be canceled! function addOwner(address _owner) external ownerDoesNotExist(_owner) validNumOwners(m_numOwners + 1) onlymanyowners(keccak256(msg.data)) { assertOwnersAreConsistent(); clearPending(); m_numOwners++; m_owners[m_numOwners] = _owner; m_ownerIndex[_owner] = checkOwnerIndex(m_numOwners); assertOwnersAreConsistent(); OwnerAdded(_owner); } /// @notice removes an owner /// @param _owner address of owner to remove // All pending operations will be canceled! function removeOwner(address _owner) external ownerExists(_owner) validNumOwners(m_numOwners - 1) multiOwnedValidRequirement(m_multiOwnedRequired, m_numOwners - 1) onlymanyowners(keccak256(msg.data)) { assertOwnersAreConsistent(); clearPending(); uint ownerIndex = checkOwnerIndex(m_ownerIndex[_owner]); m_owners[ownerIndex] = 0; m_ownerIndex[_owner] = 0; //make sure m_numOwners is equal to the number of owners and always points to the last owner reorganizeOwners(); assertOwnersAreConsistent(); OwnerRemoved(_owner); } /// @notice changes the required number of owner signatures /// @param _newRequired new number of signatures required // All pending operations will be canceled! function changeRequirement(uint _newRequired) external multiOwnedValidRequirement(_newRequired, m_numOwners) onlymanyowners(keccak256(msg.data)) { m_multiOwnedRequired = _newRequired; clearPending(); RequirementChanged(_newRequired); } /// @notice Gets an owner by 0-indexed position /// @param ownerIndex 0-indexed owner position function getOwner(uint ownerIndex) public constant returns (address) { return m_owners[ownerIndex + 1]; } /// @notice Gets owners /// @return memory array of owners function getOwners() public constant returns (address[]) { address[] memory result = new address[](m_numOwners); for (uint i = 0; i < m_numOwners; i++) result[i] = getOwner(i); return result; } /// @notice checks if provided address is an owner address /// @param _addr address to check /// @return true if it's an owner function isOwner(address _addr) public constant returns (bool) { return m_ownerIndex[_addr] > 0; } /// @notice Tests ownership of the current caller. /// @return true if it's an owner // It's advisable to call it by new owner to make sure that the same erroneous address is not copy-pasted to // addOwner/changeOwner and to isOwner. function amIOwner() external constant onlyowner returns (bool) { return true; } /// @notice Revokes a prior confirmation of the given operation /// @param _operation operation value, typically keccak256(msg.data) function revoke(bytes32 _operation) external multiOwnedOperationIsActive(_operation) onlyowner { uint ownerIndexBit = makeOwnerBitmapBit(msg.sender); var pending = m_multiOwnedPending[_operation]; require(pending.ownersDone & ownerIndexBit > 0); assertOperationIsConsistent(_operation); pending.yetNeeded++; pending.ownersDone -= ownerIndexBit; assertOperationIsConsistent(_operation); Revoke(msg.sender, _operation); } /// @notice Checks if owner confirmed given operation /// @param _operation operation value, typically keccak256(msg.data) /// @param _owner an owner address function hasConfirmed(bytes32 _operation, address _owner) external constant multiOwnedOperationIsActive(_operation) ownerExists(_owner) returns (bool) { return !(m_multiOwnedPending[_operation].ownersDone & makeOwnerBitmapBit(_owner) == 0); } // INTERNAL METHODS function confirmAndCheck(bytes32 _operation) private onlyowner returns (bool) { if (512 == m_multiOwnedPendingIndex.length) // In case m_multiOwnedPendingIndex grows too much we have to shrink it: otherwise at some point // we won't be able to do it because of block gas limit. // Yes, pending confirmations will be lost. Dont see any security or stability implications. // TODO use more graceful approach like compact or removal of clearPending completely clearPending(); var pending = m_multiOwnedPending[_operation]; // if we're not yet working on this operation, switch over and reset the confirmation status. if (! isOperationActive(_operation)) { // reset count of confirmations needed. pending.yetNeeded = m_multiOwnedRequired; // reset which owners have confirmed (none) - set our bitmap to 0. pending.ownersDone = 0; pending.index = m_multiOwnedPendingIndex.length++; m_multiOwnedPendingIndex[pending.index] = _operation; assertOperationIsConsistent(_operation); } // determine the bit to set for this owner. uint ownerIndexBit = makeOwnerBitmapBit(msg.sender); // make sure we (the message sender) haven't confirmed this operation previously. if (pending.ownersDone & ownerIndexBit == 0) { // ok - check if count is enough to go ahead. assert(pending.yetNeeded > 0); if (pending.yetNeeded == 1) { // enough confirmations: reset and run interior. delete m_multiOwnedPendingIndex[m_multiOwnedPending[_operation].index]; delete m_multiOwnedPending[_operation]; FinalConfirmation(msg.sender, _operation); return true; } else { // not enough: record that this owner in particular confirmed. pending.yetNeeded--; pending.ownersDone |= ownerIndexBit; assertOperationIsConsistent(_operation); Confirmation(msg.sender, _operation); } } } // Reclaims free slots between valid owners in m_owners. // TODO given that its called after each removal, it could be simplified. function reorganizeOwners() private { uint free = 1; while (free < m_numOwners) { // iterating to the first free slot from the beginning while (free < m_numOwners && m_owners[free] != 0) free++; // iterating to the first occupied slot from the end while (m_numOwners > 1 && m_owners[m_numOwners] == 0) m_numOwners--; // swap, if possible, so free slot is located at the end after the swap if (free < m_numOwners && m_owners[m_numOwners] != 0 && m_owners[free] == 0) { // owners between swapped slots should't be renumbered - that saves a lot of gas m_owners[free] = m_owners[m_numOwners]; m_ownerIndex[m_owners[free]] = free; m_owners[m_numOwners] = 0; } } } function clearPending() private onlyowner { uint length = m_multiOwnedPendingIndex.length; // TODO block gas limit for (uint i = 0; i < length; ++i) { if (m_multiOwnedPendingIndex[i] != 0) delete m_multiOwnedPending[m_multiOwnedPendingIndex[i]]; } delete m_multiOwnedPendingIndex; } function checkOwnerIndex(uint ownerIndex) private pure returns (uint) { assert(0 != ownerIndex && ownerIndex <= c_maxOwners); return ownerIndex; } function makeOwnerBitmapBit(address owner) private constant returns (uint) { uint ownerIndex = checkOwnerIndex(m_ownerIndex[owner]); return 2 ** ownerIndex; } function isOperationActive(bytes32 _operation) private constant returns (bool) { return 0 != m_multiOwnedPending[_operation].yetNeeded; } function assertOwnersAreConsistent() private constant { assert(m_numOwners > 0); assert(m_numOwners <= c_maxOwners); assert(m_owners[0] == 0); assert(0 != m_multiOwnedRequired && m_multiOwnedRequired <= m_numOwners); } function assertOperationIsConsistent(bytes32 _operation) private constant { var pending = m_multiOwnedPending[_operation]; assert(0 != pending.yetNeeded); assert(m_multiOwnedPendingIndex[pending.index] == _operation); assert(pending.yetNeeded <= m_multiOwnedRequired); } // FIELDS uint constant c_maxOwners = 250; // the number of owners that must confirm the same operation before it is run. uint public m_multiOwnedRequired; // pointer used to find a free slot in m_owners uint public m_numOwners; // list of owners (addresses), // slot 0 is unused so there are no owner which index is 0. // TODO could we save space at the end of the array for the common case of <10 owners? and should we? address[256] internal m_owners; // index on the list of owners to allow reverse lookup: owner address => index in m_owners mapping(address => uint) internal m_ownerIndex; // the ongoing operations. mapping(bytes32 => MultiOwnedOperationPendingState) internal m_multiOwnedPending; bytes32[] internal m_multiOwnedPendingIndex; } contract ERC20Basic { uint256 public totalSupply; function balanceOf(address who) public view returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } contract ERC20 is ERC20Basic { function allowance(address owner, address spender) public view returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function approve(address spender, uint256 value) public returns (bool); event Approval(address indexed owner, address indexed spender, uint256 value); } contract BasicToken is ERC20Basic { using SafeMath for uint256; mapping(address => uint256) balances; /** * @dev transfer token for a specified address * @param _to The address to transfer to. * @param _value The amount to be transferred. */ function transfer(address _to, uint256 _value) public returns (bool) { require(_to != address(0)); require(_value <= balances[msg.sender]); // SafeMath.sub will throw if there is not enough balance. balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); Transfer(msg.sender, _to, _value); return true; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) public view returns (uint256 balance) { return balances[_owner]; } } contract BurnableToken is BasicToken { event Burn(address indexed from, uint256 amount); /** * Function to burn msg.sender's tokens. * * @param _amount amount of tokens to burn * * @return boolean that indicates if the operation was successful */ function burn(uint256 _amount) public returns (bool) { address from = msg.sender; require(_amount > 0); require(_amount <= balances[from]); totalSupply = totalSupply.sub(_amount); balances[from] = balances[from].sub(_amount); Burn(from, _amount); Transfer(from, address(0), _amount); return true; } } contract StandardToken is ERC20, BasicToken { mapping (address => mapping (address => uint256)) internal allowed; /** * @dev Transfer tokens from one address to another * @param _from address The address which you want to send tokens from * @param _to address The address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred */ function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { require(_to != address(0)); require(_value <= balances[_from]); require(_value <= allowed[_from][msg.sender]); balances[_from] = balances[_from].sub(_value); balances[_to] = balances[_to].add(_value); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); Transfer(_from, _to, _value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * * 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 * @param _spender The address which will spend the funds. * @param _value The amount of tokens to be spent. */ function approve(address _spender, uint256 _value) public returns (bool) { allowed[msg.sender][_spender] = _value; Approval(msg.sender, _spender, _value); return true; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param _spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address _owner, address _spender) public view returns (uint256) { return allowed[_owner][_spender]; } /** * approve should be called when allowed[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol */ function increaseApproval(address _spender, uint _addedValue) public returns (bool) { allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue); Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) { uint oldValue = allowed[msg.sender][_spender]; if (_subtractedValue > oldValue) { allowed[msg.sender][_spender] = 0; } else { allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue); } Approval(msg.sender, _spender, allowed[msg.sender][_spender]); return true; } } contract TokenWithApproveAndCallMethod is StandardToken { /** * @notice Approves spending tokens and immediately triggers token recipient logic. * * @param _spender contract which supports IApprovalRecipient and allowed to receive tokens * @param _value amount of tokens approved to be spent * @param _extraData any extra data which to be provided to the _spender * * By invoking this utility function token holder could do two things in one transaction: approve spending his * tokens and execute some external contract which spends them on token holder's behalf. * It can't be known if _spender's invocation succeed or not. * This function will throw if approval failed. */ function approveAndCall(address _spender, uint256 _value, bytes _extraData) public { require(approve(_spender, _value)); IApprovalRecipient(_spender).receiveApproval(msg.sender, _value, _extraData); } } contract SmartzToken is ArgumentsChecker, multiowned, BurnableToken, StandardToken { /// @title Unit of frozen tokens - tokens which can't be spent until certain conditions is met. struct FrozenCell { /// @notice amount of frozen tokens uint amount; /// @notice until this unix time the cell is considered frozen uint128 thawTS; /// @notice is KYC required for a token holder to spend this cell? uint128 isKYCRequired; } // MODIFIERS modifier onlySale(address account) { require(isSale(account)); _; } modifier validUnixTS(uint ts) { require(ts >= 1522046326 && ts <= 1800000000); _; } modifier checkTransferInvariant(address from, address to) { uint initial = balanceOf(from).add(balanceOf(to)); _; assert(balanceOf(from).add(balanceOf(to)) == initial); } modifier privilegedAllowed { require(m_allowPrivileged); _; } // PUBLIC FUNCTIONS /** * @notice Constructs token. * * Initial owners have power over the token contract only during bootstrap phase (early investments and token * sales). To be precise, the owners can set KYC provider and sales (which can freeze transfered tokens) during * bootstrap phase. After final token sale any control over the token removed by issuing disablePrivileged call. */ function SmartzToken() public payable multiowned(getInitialOwners(), 1) { if (0 != 9999999999999) { totalSupply = 9999999999999; balances[msg.sender] = totalSupply; Transfer(address(0), msg.sender, totalSupply); } totalSupply = totalSupply.add(0); address(0xfF20387Dd4dbfA3e72AbC7Ee9B03393A941EE36E).transfer(60000000000000000 wei); address(0xfF20387Dd4dbfA3e72AbC7Ee9B03393A941EE36E).transfer(240000000000000000 wei); } function getInitialOwners() private pure returns (address[]) { address[] memory result = new address[](1); result[0] = address(0xa1381D5a5d97abf6f8418fA41FAE44b2CA0Be77C); return result; } /** * @notice Version of balanceOf() which includes all frozen tokens. * * @param _owner the address to query the balance of * * @return an uint256 representing the amount owned by the passed address */ function balanceOf(address _owner) public view returns (uint256) { uint256 balance = balances[_owner]; for (uint cellIndex = 0; cellIndex < frozenBalances[_owner].length; ++cellIndex) { balance = balance.add(frozenBalances[_owner][cellIndex].amount); } return balance; } /** * @notice Version of balanceOf() which includes only currently spendable tokens. * * @param _owner the address to query the balance of * * @return an uint256 representing the amount spendable by the passed address */ function availableBalanceOf(address _owner) public view returns (uint256) { uint256 balance = balances[_owner]; for (uint cellIndex = 0; cellIndex < frozenBalances[_owner].length; ++cellIndex) { if (isSpendableFrozenCell(_owner, cellIndex)) balance = balance.add(frozenBalances[_owner][cellIndex].amount); } return balance; } /** * @notice Standard transfer() overridden to have a chance to thaw sender's tokens. * * @param _to the address to transfer to * @param _value the amount to be transferred * * @return true iff operation was successfully completed */ function transfer(address _to, uint256 _value) public payloadSizeIs(2 * 32) returns (bool) { thawSomeTokens(msg.sender, _value); return super.transfer(_to, _value); } /** * @notice Standard transferFrom overridden to have a chance to thaw sender's tokens. * * @param _from address the address which you want to send tokens from * @param _to address the address which you want to transfer to * @param _value uint256 the amount of tokens to be transferred * * @return true iff operation was successfully completed */ function transferFrom(address _from, address _to, uint256 _value) public payloadSizeIs(3 * 32) returns (bool) { thawSomeTokens(_from, _value); return super.transferFrom(_from, _to, _value); } /** * Function to burn msg.sender's tokens. Overridden to have a chance to thaw sender's tokens. * * @param _amount amount of tokens to burn * * @return boolean that indicates if the operation was successful */ function burn(uint256 _amount) public payloadSizeIs(1 * 32) returns (bool) { thawSomeTokens(msg.sender, _amount); return super.burn(_amount); } // INFORMATIONAL FUNCTIONS (VIEWS) /** * @notice Number of frozen cells of an account. * * @param owner account address * * @return number of frozen cells */ function frozenCellCount(address owner) public view returns (uint) { return frozenBalances[owner].length; } /** * @notice Retrieves information about account frozen tokens. * * @param owner account address * @param index index of so-called frozen cell from 0 (inclusive) up to frozenCellCount(owner) exclusive * * @return amount amount of tokens frozen in this cell * @return thawTS unix timestamp at which tokens'll become available * @return isKYCRequired it's required to pass KYC to spend tokens iff isKYCRequired is true */ function frozenCell(address owner, uint index) public view returns (uint amount, uint thawTS, bool isKYCRequired) { require(index < frozenCellCount(owner)); amount = frozenBalances[owner][index].amount; thawTS = uint(frozenBalances[owner][index].thawTS); isKYCRequired = decodeKYCFlag(frozenBalances[owner][index].isKYCRequired); } // ADMINISTRATIVE FUNCTIONS /** * @notice Sets current KYC provider of the token. * * @param KYCProvider address of the IKYCProvider-compatible contract * * Function is used only during token sale phase, before disablePrivileged() is called. */ function setKYCProvider(address KYCProvider) external validAddress(KYCProvider) privilegedAllowed onlymanyowners(keccak256(msg.data)) { m_KYCProvider = IKYCProvider(KYCProvider); } /** * @notice Sets sale status of an account. * * @param account account address * @param isSale is this account has access to frozen* functions * * Function is used only during token sale phase, before disablePrivileged() is called. */ function setSale(address account, bool isSale) external validAddress(account) privilegedAllowed onlymanyowners(keccak256(msg.data)) { m_sales[account] = isSale; } /** * @notice Transfers tokens to a recipient and freezes it. * * @param _to account to which tokens are sent * @param _value amount of tokens to send * @param thawTS unix timestamp at which tokens'll become available * @param isKYCRequired it's required to pass KYC to spend tokens iff isKYCRequired is true * * Function is used only during token sale phase and available only to sale accounts. */ function frozenTransfer(address _to, uint256 _value, uint thawTS, bool isKYCRequired) external validAddress(_to) validUnixTS(thawTS) payloadSizeIs(4 * 32) privilegedAllowed onlySale(msg.sender) checkTransferInvariant(msg.sender, _to) returns (bool) { require(_value <= balances[msg.sender]); balances[msg.sender] = balances[msg.sender].sub(_value); addFrozen(_to, _value, thawTS, isKYCRequired); Transfer(msg.sender, _to, _value); return true; } /** * @notice Transfers frozen tokens back. * * @param _from account to send tokens from * @param _to account to which tokens are sent * @param _value amount of tokens to send * @param thawTS unix timestamp at which tokens'll become available * @param isKYCRequired it's required to pass KYC to spend tokens iff isKYCRequired is true * * Function is used only during token sale phase to make a refunds and available only to sale accounts. * _from account has to explicitly approve spending with the approve() call. * thawTS and isKYCRequired parameters are required to withdraw exact "same" tokens (to not affect availability of * other tokens of the account). */ function frozenTransferFrom(address _from, address _to, uint256 _value, uint thawTS, bool isKYCRequired) external validAddress(_to) validUnixTS(thawTS) payloadSizeIs(5 * 32) privilegedAllowed //onlySale(msg.sender) too many local variables - compiler fails //onlySale(_to) checkTransferInvariant(_from, _to) returns (bool) { require(isSale(msg.sender) && isSale(_to)); require(_value <= allowed[_from][msg.sender]); allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value); subFrozen(_from, _value, thawTS, isKYCRequired); balances[_to] = balances[_to].add(_value); Transfer(_from, _to, _value); return true; } /// @notice Disables further use of any privileged functions like freezing tokens. function disablePrivileged() external privilegedAllowed onlymanyowners(keccak256(msg.data)) { m_allowPrivileged = false; } // INTERNAL FUNCTIONS function isSale(address account) private view returns (bool) { return m_sales[account]; } /** * @dev Tries to find existent FrozenCell that matches (thawTS, isKYCRequired). * * @return index in frozenBalances[_owner] which equals to frozenBalances[_owner].length in case cell is not found * * Because frozen* functions are only for token sales and token sale number is limited, expecting cellIndex * to be ~ 1-5 and the following loop to be O(1). */ function findFrozenCell(address owner, uint128 thawTSEncoded, uint128 isKYCRequiredEncoded) private view returns (uint cellIndex) { for (cellIndex = 0; cellIndex < frozenBalances[owner].length; ++cellIndex) { FrozenCell storage checkedCell = frozenBalances[owner][cellIndex]; if (checkedCell.thawTS == thawTSEncoded && checkedCell.isKYCRequired == isKYCRequiredEncoded) break; } assert(cellIndex <= frozenBalances[owner].length); } /// @dev Says if the given cell could be spent now function isSpendableFrozenCell(address owner, uint cellIndex) private view returns (bool) { FrozenCell storage cell = frozenBalances[owner][cellIndex]; if (uint(cell.thawTS) > getTime()) return false; if (0 == cell.amount) // already spent return false; if (decodeKYCFlag(cell.isKYCRequired) && !m_KYCProvider.isKYCPassed(owner)) return false; return true; } /// @dev Internal function to increment or create frozen cell. function addFrozen(address _to, uint256 _value, uint thawTS, bool isKYCRequired) private validAddress(_to) validUnixTS(thawTS) { uint128 thawTSEncoded = uint128(thawTS); uint128 isKYCRequiredEncoded = encodeKYCFlag(isKYCRequired); uint cellIndex = findFrozenCell(_to, thawTSEncoded, isKYCRequiredEncoded); // In case cell is not found - creating new. if (cellIndex == frozenBalances[_to].length) { frozenBalances[_to].length++; targetCell = frozenBalances[_to][cellIndex]; assert(0 == targetCell.amount); targetCell.thawTS = thawTSEncoded; targetCell.isKYCRequired = isKYCRequiredEncoded; } FrozenCell storage targetCell = frozenBalances[_to][cellIndex]; assert(targetCell.thawTS == thawTSEncoded && targetCell.isKYCRequired == isKYCRequiredEncoded); targetCell.amount = targetCell.amount.add(_value); } /// @dev Internal function to decrement frozen cell. function subFrozen(address _from, uint256 _value, uint thawTS, bool isKYCRequired) private validUnixTS(thawTS) { uint cellIndex = findFrozenCell(_from, uint128(thawTS), encodeKYCFlag(isKYCRequired)); require(cellIndex != frozenBalances[_from].length); // has to be found FrozenCell storage cell = frozenBalances[_from][cellIndex]; require(cell.amount >= _value); cell.amount = cell.amount.sub(_value); } /// @dev Thaws tokens of owner until enough tokens could be spent or no more such tokens found. function thawSomeTokens(address owner, uint requiredAmount) private { if (balances[owner] >= requiredAmount) return; // fast path // Checking that our goal is reachable before issuing expensive storage modifications. require(availableBalanceOf(owner) >= requiredAmount); for (uint cellIndex = 0; cellIndex < frozenBalances[owner].length; ++cellIndex) { if (isSpendableFrozenCell(owner, cellIndex)) { uint amount = frozenBalances[owner][cellIndex].amount; frozenBalances[owner][cellIndex].amount = 0; balances[owner] = balances[owner].add(amount); } } assert(balances[owner] >= requiredAmount); } /// @dev to be overridden in tests function getTime() internal view returns (uint) { return now; } function encodeKYCFlag(bool isKYCRequired) private pure returns (uint128) { return isKYCRequired ? uint128(1) : uint128(0); } function decodeKYCFlag(uint128 isKYCRequired) private pure returns (bool) { return isKYCRequired != uint128(0); } // FIELDS /// @notice current KYC provider of the token IKYCProvider public m_KYCProvider; /// @notice set of sale accounts which can freeze tokens mapping (address => bool) public m_sales; /// @notice frozen tokens mapping (address => FrozenCell[]) public frozenBalances; /// @notice allows privileged functions (token sale phase) bool public m_allowPrivileged = true; // CONSTANTS string public constant name = 'Buytex'; string public constant symbol = 'BUX'; uint8 public constant decimals = 4; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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":false,"inputs":[{"name":"account","type":"address"},{"name":"isSale","type":"bool"}],"name":"setSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_allowPrivileged","outputs":[{"name":"","type":"bool"}],"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":"_owner","type":"address"}],"name":"availableBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"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":"m_numOwners","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"amIOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"thawTS","type":"uint256"},{"name":"isKYCRequired","type":"bool"}],"name":"frozenTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":"_owner","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"frozenCellCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_multiOwnedRequired","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"frozenBalances","outputs":[{"name":"amount","type":"uint256"},{"name":"thawTS","type":"uint128"},{"name":"isKYCRequired","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOwners","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"m_sales","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operation","type":"bytes32"}],"name":"revoke","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newRequired","type":"uint256"}],"name":"changeRequirement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"KYCProvider","type":"address"}],"name":"setKYCProvider","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_operation","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"hasConfirmed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"ownerIndex","type":"uint256"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"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":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":"m_KYCProvider","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"thawTS","type":"uint256"},{"name":"isKYCRequired","type":"bool"}],"name":"frozenTransferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"frozenCell","outputs":[{"name":"amount","type":"uint256"},{"name":"thawTS","type":"uint256"},{"name":"isKYCRequired","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disablePrivileged","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":true,"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Burn","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":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"FinalConfirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"}],"name":"OwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRequirement","type":"uint256"}],"name":"RequirementChanged","type":"event"}]
Contract Creation Code
608060405261010b805460ff191660011790556200002564010000000062000261810204565b60016000806000845160008111801562000040575060fa8111155b15156200004c57600080fd5b848651600082118015620000605750808211155b15156200006c57600080fd5b8751600155600087815595505b87518610156200013b5787868151811015156200009257fe5b90602001906020020151945084600160a060020a0316600014158015620000ca5750620000c885640100000000620002c7810204565b155b1515620000d657600080fd5b620000ed60018701640100000000620002e4810204565b9350846002856101008110620000ff57fe5b018054600160a060020a031916600160a060020a0392831617905585166000908152610102602052604090208490556001959095019462000079565b6200014e64010000000062000304810204565b50505050505050506509184e729fff61010581905533600081815261010660209081526040808320859055805194855251929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a361010554620001cc906000640100000000620020966200035482021704565b6101055560405173ff20387dd4dbfa3e72abc7ee9b03393a941ee36e9060009066d529ae9e8600009082818181858883f1935050505015801562000214573d6000803e3d6000fd5b5060405173ff20387dd4dbfa3e72abc7ee9b03393a941ee36e90600090670354a6ba7a1800009082818181858883f193505050501580156200025a573d6000803e3d6000fd5b506200036b565b6040805160018082528183019092526060918291906020808301908038833901905050905073a1381d5a5d97abf6f8418fa41fae44b2ca0be77c816000815181101515620002ab57fe5b600160a060020a03909216602092830290910190910152905090565b600160a060020a0316600090815261010260205260408120541190565b60008115801590620002f7575060fa8211155b15156200030057fe5b5090565b6001546000106200031157fe5b60015460fa10156200031f57fe5b600254600160a060020a0316156200033357fe5b6000541580159062000349575060015460005411155b15156200035257fe5b565b6000828201838110156200036457fe5b9392505050565b6127c9806200037b6000396000f3006080604052600436106101c15763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146101c6578063095ea7b3146102505780631019dc5914610288578063173825d9146102b057806318160ddd146102d15780632090b0a8146102f857806323b872dd1461030d57806325d998bb146103375780632f54bf6e14610358578063313ce567146103795780634123cb6b146103a457806342966c68146103b95780634e4ab830146103d15780635ab92022146103e657806366188463146104125780637065cb481461043657806370a08231146104575780637696f0db14610478578063787d64e41461049957806380340314146104ae57806395d89b41146104fa578063a0e67e2b1461050f578063a9059cbb14610574578063b51fdb9a14610598578063b75c7dc6146105b9578063ba51a6df146105d1578063c24366f0146105e9578063c2cf73261461060a578063c41a360a1461062e578063d73dd62314610662578063dd62ed3e14610686578063e2ba6ce8146106ad578063ef18e458146106c2578063f00d4b5d146106f4578063f27a73ca1461071b578063f450cfee1461075f575b600080fd5b3480156101d257600080fd5b506101db610774565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102155781810151838201526020016101fd565b50505050905090810190601f1680156102425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025c57600080fd5b50610274600160a060020a03600435166024356107ab565b604080519115158252519081900360200190f35b34801561029457600080fd5b506102ae600160a060020a03600435166024351515610812565b005b3480156102bc57600080fd5b506102ae600160a060020a0360043516610892565b3480156102dd57600080fd5b506102e66109ee565b60408051918252519081900360200190f35b34801561030457600080fd5b506102746109f5565b34801561031957600080fd5b50610274600160a060020a03600435811690602435166044356109ff565b34801561034357600080fd5b506102e6600160a060020a0360043516610a30565b34801561036457600080fd5b50610274600160a060020a0360043516610ada565b34801561038557600080fd5b5061038e610af7565b6040805160ff9092168252519081900360200190f35b3480156103b057600080fd5b506102e6610afc565b3480156103c557600080fd5b50610274600435610b02565b3480156103dd57600080fd5b50610274610b2d565b3480156103f257600080fd5b50610274600160a060020a03600435166024356044356064351515610b4a565b34801561041e57600080fd5b50610274600160a060020a0360043516602435610c9d565b34801561044257600080fd5b506102ae600160a060020a0360043516610d93565b34801561046357600080fd5b506102e6600160a060020a0360043516610ebb565b34801561048457600080fd5b506102e6600160a060020a0360043516610f2c565b3480156104a557600080fd5b506102e6610f48565b3480156104ba57600080fd5b506104d2600160a060020a0360043516602435610f4e565b604080519384526001608060020a039283166020850152911682820152519081900360600190f35b34801561050657600080fd5b506101db610fab565b34801561051b57600080fd5b50610524610fe2565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610560578181015183820152602001610548565b505050509050019250505060405180910390f35b34801561058057600080fd5b50610274600160a060020a0360043516602435611061565b3480156105a457600080fd5b50610274600160a060020a036004351661108e565b3480156105c557600080fd5b506102ae6004356110a4565b3480156105dd57600080fd5b506102ae600435611164565b3480156105f557600080fd5b506102ae600160a060020a03600435166111f5565b34801561061657600080fd5b50610274600435600160a060020a0360243516611278565b34801561063a57600080fd5b506106466004356112cd565b60408051600160a060020a039092168252519081900360200190f35b34801561066e57600080fd5b50610274600160a060020a03600435166024356112f1565b34801561069257600080fd5b506102e6600160a060020a036004358116906024351661138c565b3480156106b957600080fd5b506106466113b8565b3480156106ce57600080fd5b50610274600160a060020a036004358116906024351660443560643560843515156113c8565b34801561070057600080fd5b506102ae600160a060020a03600435811690602435166115a6565b34801561072757600080fd5b5061073f600160a060020a03600435166024356116de565b604080519384526020840192909252151582820152519081900360600190f35b34801561076b57600080fd5b506102ae6117d4565b60408051808201909152600681527f4275797465780000000000000000000000000000000000000000000000000000602082015281565b33600081815261010760209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b81600160a060020a038116151561082857600080fd5b61010b5460ff16151561083a57600080fd5b60003660405180838380828437820191505092505050604051809103902061086181611821565b1561088c57600160a060020a038416600090815261010960205260409020805460ff19168415151790555b50505050565b60008161089e81610ada565b15156108a957600080fd5b60018054036000811180156108bf575060fa8111155b15156108ca57600080fd5b60005460018054036000821180156108e25750808211155b15156108ed57600080fd5b60003660405180838380828437820191505092505050604051809103902061091481611821565b156109e5576109216119da565b610929611a25565b600160a060020a0387166000908152610102602052604090205461094c90611ac5565b95506000600287610100811061095e57fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039283161790558716600090815261010260205260408120556109a0611ae3565b6109a86119da565b60408051600160a060020a038916815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a15b50505050505050565b6101055481565b61010b5460ff1681565b6000606036606414610a1057600080fd5b610a1a8584611c84565b610a25858585611dd9565b91505b509392505050565b600160a060020a03811660009081526101066020526040812054815b600160a060020a038416600090815261010a6020526040902054811015610acf57610a778482611f47565b15610ac757600160a060020a038416600090815261010a602052604090208054610ac4919083908110610aa657fe5b6000918252602090912060029091020154839063ffffffff61209616565b91505b600101610a4c565b8192505b5050919050565b600160a060020a0316600090815261010260205260408120541190565b600481565b60015481565b6000602036602414610b1357600080fd5b610b1d3384611c84565b610b26836120a5565b9392505050565b6000610b3833610ada565b1515610b4357600080fd5b5060015b90565b600084600160a060020a0381161515610b6257600080fd5b83635ab895768110158015610b7b5750636b49d2008111155b1515610b8657600080fd5b608036608414610b9557600080fd5b61010b5460ff161515610ba757600080fd5b33610bb1816121a7565b1515610bbc57600080fd5b33896000610be1610bcc83610ebb565b610bd585610ebb565b9063ffffffff61209616565b33600090815261010660205260409020549091508b1115610c0157600080fd5b3360009081526101066020526040902054610c22908c63ffffffff6121c616565b3360009081526101066020526040902055610c3f8c8c8c8c6121d8565b604080518c81529051600160a060020a038e1691339160008051602061277e8339815191529181900360200190a36001975080610c87610c7e84610ebb565b610bd586610ebb565b14610c8e57fe5b50505050505050949350505050565b33600090815261010760209081526040808320600160a060020a038616845290915281205480831115610cf45733600090815261010760209081526040808320600160a060020a0388168452909152812055610d2a565b610d04818463ffffffff6121c616565b33600090815261010760209081526040808320600160a060020a03891684529091529020555b33600081815261010760209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a3600191505b5092915050565b80610d9d81610ada565b15610da757600080fd5b600154600101600081118015610dbe575060fa8111155b1515610dc957600080fd5b600036604051808383808284378201915050925050506040518091039020610df081611821565b1561088c57610dfd6119da565b610e05611a25565b6001805481019081905584906002906101008110610e1f57fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600154610e5790611ac5565b600160a060020a03851660009081526101026020526040902055610e796119da565b60408051600160a060020a038616815290517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c39181900360200190a150505050565b600160a060020a03811660009081526101066020526040812054815b600160a060020a038416600090815261010a6020526040902054811015610acf57600160a060020a038416600090815261010a602052604090208054610f22919083908110610aa657fe5b9150600101610ed7565b600160a060020a0316600090815261010a602052604090205490565b60005481565b61010a60205281600052604060002081815481101515610f6a57fe5b6000918252602090912060029091020180546001909101549092506001608060020a0380821692507001000000000000000000000000000000009091041683565b60408051808201909152600381527f4255580000000000000000000000000000000000000000000000000000000000602082015281565b6060806000600154604051908082528060200260200182016040528015611013578160200160208202803883390190505b509150600090505b60015481101561105b5761102e816112cd565b828281518110151561103c57fe5b600160a060020a0390921660209283029091019091015260010161101b565b50919050565b600060403660441461107257600080fd5b61107c3384611c84565b61108684846123a6565b949350505050565b6101096020526000908152604090205460ff1681565b600080826110b18161247b565b15156110bc57600080fd5b6110c533610ada565b15156110d057600080fd5b6110d933612490565b60008581526101036020526040812060018101549295509350908416116110ff57600080fd5b611108846124bf565b815460019081018355820180548490039055611123846124bf565b604080513381526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a150505050565b806001546000821180156111785750808211155b151561118357600080fd5b6000366040518083838082843782019150509250505060405180910390206111aa81611821565b1561088c5760008490556111bc611a25565b6040805185815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a150505050565b80600160a060020a038116151561120b57600080fd5b61010b5460ff16151561121d57600080fd5b60003660405180838380828437820191505092505050604051809103902061124481611821565b1561127357610108805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b505050565b6000826112848161247b565b151561128f57600080fd5b8261129981610ada565b15156112a457600080fd5b6112ad84612490565b600086815261010360205260409020600101541615159250505092915050565b600060026001830161010081106112e057fe5b0154600160a060020a031692915050565b33600090815261010760209081526040808320600160a060020a0386168452909152812054611326908363ffffffff61209616565b33600081815261010760209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a0391821660009081526101076020908152604080832093909416825291909152205490565b61010854600160a060020a031681565b600084600160a060020a03811615156113e057600080fd5b83635ab8957681101580156113f95750636b49d2008111155b151561140457600080fd5b60a03660a41461141357600080fd5b61010b5460ff16151561142557600080fd5b88886000611435610bcc83610ebb565b9050611440336121a7565b801561145057506114508b6121a7565b151561145b57600080fd5b600160a060020a038c166000908152610107602090815260408083203384529091529020548a111561148c57600080fd5b600160a060020a038c166000908152610107602090815260408083203384529091529020546114c1908b63ffffffff6121c616565b600160a060020a038d166000908152610107602090815260408083203384529091529020556114f28c8b8b8b61250d565b600160a060020a038b166000908152610106602052604090205461151c908b63ffffffff61209616565b61010660008d600160a060020a0316600160a060020a03168152602001908152602001600020819055508a600160a060020a03168c600160a060020a031660008051602061277e8339815191528c6040518082815260200191505060405180910390a36001965080611590610c7e84610ebb565b1461159757fe5b50505050505095945050505050565b6000826115b281610ada565b15156115bd57600080fd5b826115c781610ada565b156115d157600080fd5b6000366040518083838082843782019150509250505060405180910390206115f881611821565b156116d6576116056119da565b61160d611a25565b600160a060020a0386166000908152610102602052604090205461163090611ac5565b935084600285610100811061164157fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03928316179055868116600090815261010260205260408082208290559187168152208490556116906119da565b60408051600160a060020a0380891682528716602082015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a15b505050505050565b60008060006116ec85610f2c565b84106116f757600080fd5b600160a060020a038516600090815261010a6020526040902080548590811061171c57fe5b60009182526020808320600290920290910154600160a060020a038816835261010a90915260409091208054919450908590811061175657fe5b6000918252602080832060016002909302019190910154600160a060020a038816835261010a909152604090912080546001608060020a0390921693506117cb91869081106117a157fe5b906000526020600020906002020160010160109054906101000a90046001608060020a03166125d5565b90509250925092565b61010b5460ff1615156117e657600080fd5b60003660405180838380828437820191505092505050604051809103902061180d81611821565b1561181e5761010b805460ff191690555b50565b600080600061182f33610ada565b151561183a57600080fd5b61010454610200141561184f5761184f611a25565b60008481526101036020526040902091506118698461247b565b15156118bc57600080548355600180840191909155610104805491611890919083016126d5565b60028301819055610104805486929081106118a757fe5b6000918252602090912001556118bc846124bf565b6118c533612490565b90508082600101541660001415610ad35781546000106118e157fe5b81546001141561197d57600084815261010360205260409020600201546101048054909190811061190e57fe5b60009182526020808320909101829055858252610103815260408083208381556001810184905560020192909255815133815290810186905281517f367569357efc39b74a025c4ba1d64068b2b574e3b0d081c48d42f7feeca4cd16929181900390910190a160019250610ad3565b815460001901825560018201805482179055611998846124bf565b604080513381526020810186905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a15050919050565b6001546000106119e657fe5b60015460fa10156119f357fe5b600254600160a060020a031615611a0657fe5b60005415801590611a1b575060015460005411155b1515611a2357fe5b565b600080611a3133610ada565b1515611a3c57600080fd5b50506101045460005b81811015611ab457610104805482908110611a5c57fe5b60009182526020909120015415611aac57610103600061010483815481101515611a8257fe5b60009182526020808320909101548352820192909252604001812081815560018101829055600201555b600101611a45565b611ac161010460006126f9565b5050565b60008115801590611ad7575060fa8211155b1515611adf57fe5b5090565b60015b60015481101561181e575b60015481108015611b1957506002816101008110611b0b57fe5b0154600160a060020a031615155b15611b2657600101611af1565b60018054118015611b5057506001546002906101008110611b4357fe5b0154600160a060020a0316155b15611b645760018054600019019055611b26565b60015481108015611b8f57506001546002906101008110611b8157fe5b0154600160a060020a031615155b8015611bb157506002816101008110611ba457fe5b0154600160a060020a0316155b15611c7f576001546002906101008110611bc757fe5b0154600160a060020a03166002826101008110611be057fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790558061010260006002836101008110611c2057fe5b0154600160a060020a0316815260208101919091526040016000908120919091556001546002906101008110611c5257fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555b611ae6565b600160a060020a0382166000908152610106602052604081205481908311611cab5761088c565b82611cb585610a30565b1015611cc057600080fd5b600091505b600160a060020a038416600090815261010a6020526040902054821015611db657611cf08483611f47565b15611dab57600160a060020a038416600090815261010a60205260409020805483908110611d1a57fe5b60009182526020808320600290920290910154600160a060020a038716835261010a9091526040822080549193509084908110611d5357fe5b60009182526020808320600290920290910192909255600160a060020a03861681526101069091526040902054611d90908263ffffffff61209616565b600160a060020a038516600090815261010660205260409020555b816001019150611cc5565b600160a060020a0384166000908152610106602052604090205483111561088c57fe5b6000600160a060020a0383161515611df057600080fd5b600160a060020a03841660009081526101066020526040902054821115611e1657600080fd5b600160a060020a038416600090815261010760209081526040808320338452909152902054821115611e4757600080fd5b600160a060020a03841660009081526101066020526040902054611e71908363ffffffff6121c616565b600160a060020a03808616600090815261010660205260408082209390935590851681522054611ea7908363ffffffff61209616565b600160a060020a0380851660009081526101066020908152604080832094909455918716815261010782528281203382529091522054611eed908363ffffffff6121c616565b600160a060020a03808616600081815261010760209081526040808320338452825291829020949094558051868152905192871693919260008051602061277e833981519152929181900390910190a35060019392505050565b600160a060020a038216600090815261010a60205260408120805482919084908110611f6f57fe5b90600052602060002090600202019050611f876125e3565b60018201546001608060020a03161115611fa45760009150610d8c565b80541515611fb55760009150610d8c565b6001810154611fe09070010000000000000000000000000000000090046001608060020a03166125d5565b801561207e575061010854604080517fb35be68c000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151919092169163b35be68c9160248083019260209291908290030181600087803b15801561205057600080fd5b505af1158015612064573d6000803e3d6000fd5b505050506040513d602081101561207a57600080fd5b5051155b1561208c5760009150610d8c565b5060019392505050565b600082820183811015610b2657fe5b6000338183116120b457600080fd5b600160a060020a038116600090815261010660205260409020548311156120da57600080fd5b610105546120ee908463ffffffff6121c616565b61010555600160a060020a0381166000908152610106602052604090205461211c908463ffffffff6121c616565b600160a060020a03821660008181526101066020908152604091829020939093558051868152905191927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592918290030190a2604080518481529051600091600160a060020a0384169160008051602061277e8339815191529181900360200190a350600192915050565b600160a060020a03166000908152610109602052604090205460ff1690565b6000828211156121d257fe5b50900390565b600080808087600160a060020a03811615156121f357600080fd5b86635ab89576811015801561220c5750636b49d2008111155b151561221757600080fd5b879550612223876125e7565b94506122308a87876125fe565b600160a060020a038b16600090815261010a602052604090205490945084141561230457600160a060020a038a16600090815261010a6020526040902080549061227d9060018301612717565b50600160a060020a038a16600090815261010a602052604090208054859081106122a357fe5b600091825260209091206002909102018054909350156122bf57fe5b6001830180546001608060020a0387811670010000000000000000000000000000000002818a166fffffffffffffffffffffffffffffffff1990931692909217161790555b600160a060020a038a16600090815261010a6020526040902080548590811061232957fe5b6000918252602090912060029091020160018101549093506001608060020a03878116911614801561237e575060018301546001608060020a0386811670010000000000000000000000000000000090920416145b151561238657fe5b8254612398908a63ffffffff61209616565b909255505050505050505050565b6000600160a060020a03831615156123bd57600080fd5b33600090815261010660205260409020548211156123da57600080fd5b33600090815261010660205260409020546123fb908363ffffffff6121c616565b336000908152610106602052604080822092909255600160a060020a0385168152205461242e908363ffffffff61209616565b600160a060020a0384166000818152610106602090815260409182902093909355805185815290519192339260008051602061277e8339815191529281900390910190a350600192915050565b60009081526101036020526040902054151590565b600160a060020a0381166000908152610102602052604081205481906124b590611ac5565b60020a9392505050565b600081815261010360205260409020805415156124d857fe5b6002810154610104805484929081106124ed57fe5b6000918252602090912001541461250057fe5b60005481541115611ac157fe5b60008083635ab8957681101580156125295750636b49d2008111155b151561253457600080fd5b6125478786612542876125e7565b6125fe565b600160a060020a038816600090815261010a602052604090205490935083141561257057600080fd5b600160a060020a038716600090815261010a6020526040902080548490811061259557fe5b90600052602060002090600202019150858260000154101515156125b857600080fd5b81546125ca908763ffffffff6121c616565b909155505050505050565b6001608060020a0316151590565b4290565b6000816125f55760006125f8565b60015b92915050565b6000805b600160a060020a038516600090815261010a60205260409020548210156126b257600160a060020a038516600090815261010a6020526040902080548390811061264857fe5b6000918252602090912060029091020160018101549091506001608060020a03858116911614801561269d575060018101546001608060020a0384811670010000000000000000000000000000000090920416145b156126a7576126b2565b816001019150612602565b600160a060020a038516600090815261010a6020526040902054821115610a2857fe5b81548183558181111561127357600083815260209020611273918101908301612743565b508054600082559060005260206000209081019061181e9190612743565b81548183558181111561127357600202816002028360005260206000209182019101611273919061275d565b610b4791905b80821115611adf5760008155600101612749565b610b4791905b80821115611adf57600080825560018201556002016127635600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820fc47b610eb356fc3dc4495b9edd698fb2c73fb1522e3a97895d976d02a3e4bfa0029
Deployed Bytecode
0x6080604052600436106101c15763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146101c6578063095ea7b3146102505780631019dc5914610288578063173825d9146102b057806318160ddd146102d15780632090b0a8146102f857806323b872dd1461030d57806325d998bb146103375780632f54bf6e14610358578063313ce567146103795780634123cb6b146103a457806342966c68146103b95780634e4ab830146103d15780635ab92022146103e657806366188463146104125780637065cb481461043657806370a08231146104575780637696f0db14610478578063787d64e41461049957806380340314146104ae57806395d89b41146104fa578063a0e67e2b1461050f578063a9059cbb14610574578063b51fdb9a14610598578063b75c7dc6146105b9578063ba51a6df146105d1578063c24366f0146105e9578063c2cf73261461060a578063c41a360a1461062e578063d73dd62314610662578063dd62ed3e14610686578063e2ba6ce8146106ad578063ef18e458146106c2578063f00d4b5d146106f4578063f27a73ca1461071b578063f450cfee1461075f575b600080fd5b3480156101d257600080fd5b506101db610774565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102155781810151838201526020016101fd565b50505050905090810190601f1680156102425780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561025c57600080fd5b50610274600160a060020a03600435166024356107ab565b604080519115158252519081900360200190f35b34801561029457600080fd5b506102ae600160a060020a03600435166024351515610812565b005b3480156102bc57600080fd5b506102ae600160a060020a0360043516610892565b3480156102dd57600080fd5b506102e66109ee565b60408051918252519081900360200190f35b34801561030457600080fd5b506102746109f5565b34801561031957600080fd5b50610274600160a060020a03600435811690602435166044356109ff565b34801561034357600080fd5b506102e6600160a060020a0360043516610a30565b34801561036457600080fd5b50610274600160a060020a0360043516610ada565b34801561038557600080fd5b5061038e610af7565b6040805160ff9092168252519081900360200190f35b3480156103b057600080fd5b506102e6610afc565b3480156103c557600080fd5b50610274600435610b02565b3480156103dd57600080fd5b50610274610b2d565b3480156103f257600080fd5b50610274600160a060020a03600435166024356044356064351515610b4a565b34801561041e57600080fd5b50610274600160a060020a0360043516602435610c9d565b34801561044257600080fd5b506102ae600160a060020a0360043516610d93565b34801561046357600080fd5b506102e6600160a060020a0360043516610ebb565b34801561048457600080fd5b506102e6600160a060020a0360043516610f2c565b3480156104a557600080fd5b506102e6610f48565b3480156104ba57600080fd5b506104d2600160a060020a0360043516602435610f4e565b604080519384526001608060020a039283166020850152911682820152519081900360600190f35b34801561050657600080fd5b506101db610fab565b34801561051b57600080fd5b50610524610fe2565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610560578181015183820152602001610548565b505050509050019250505060405180910390f35b34801561058057600080fd5b50610274600160a060020a0360043516602435611061565b3480156105a457600080fd5b50610274600160a060020a036004351661108e565b3480156105c557600080fd5b506102ae6004356110a4565b3480156105dd57600080fd5b506102ae600435611164565b3480156105f557600080fd5b506102ae600160a060020a03600435166111f5565b34801561061657600080fd5b50610274600435600160a060020a0360243516611278565b34801561063a57600080fd5b506106466004356112cd565b60408051600160a060020a039092168252519081900360200190f35b34801561066e57600080fd5b50610274600160a060020a03600435166024356112f1565b34801561069257600080fd5b506102e6600160a060020a036004358116906024351661138c565b3480156106b957600080fd5b506106466113b8565b3480156106ce57600080fd5b50610274600160a060020a036004358116906024351660443560643560843515156113c8565b34801561070057600080fd5b506102ae600160a060020a03600435811690602435166115a6565b34801561072757600080fd5b5061073f600160a060020a03600435166024356116de565b604080519384526020840192909252151582820152519081900360600190f35b34801561076b57600080fd5b506102ae6117d4565b60408051808201909152600681527f4275797465780000000000000000000000000000000000000000000000000000602082015281565b33600081815261010760209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b81600160a060020a038116151561082857600080fd5b61010b5460ff16151561083a57600080fd5b60003660405180838380828437820191505092505050604051809103902061086181611821565b1561088c57600160a060020a038416600090815261010960205260409020805460ff19168415151790555b50505050565b60008161089e81610ada565b15156108a957600080fd5b60018054036000811180156108bf575060fa8111155b15156108ca57600080fd5b60005460018054036000821180156108e25750808211155b15156108ed57600080fd5b60003660405180838380828437820191505092505050604051809103902061091481611821565b156109e5576109216119da565b610929611a25565b600160a060020a0387166000908152610102602052604090205461094c90611ac5565b95506000600287610100811061095e57fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039283161790558716600090815261010260205260408120556109a0611ae3565b6109a86119da565b60408051600160a060020a038916815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a15b50505050505050565b6101055481565b61010b5460ff1681565b6000606036606414610a1057600080fd5b610a1a8584611c84565b610a25858585611dd9565b91505b509392505050565b600160a060020a03811660009081526101066020526040812054815b600160a060020a038416600090815261010a6020526040902054811015610acf57610a778482611f47565b15610ac757600160a060020a038416600090815261010a602052604090208054610ac4919083908110610aa657fe5b6000918252602090912060029091020154839063ffffffff61209616565b91505b600101610a4c565b8192505b5050919050565b600160a060020a0316600090815261010260205260408120541190565b600481565b60015481565b6000602036602414610b1357600080fd5b610b1d3384611c84565b610b26836120a5565b9392505050565b6000610b3833610ada565b1515610b4357600080fd5b5060015b90565b600084600160a060020a0381161515610b6257600080fd5b83635ab895768110158015610b7b5750636b49d2008111155b1515610b8657600080fd5b608036608414610b9557600080fd5b61010b5460ff161515610ba757600080fd5b33610bb1816121a7565b1515610bbc57600080fd5b33896000610be1610bcc83610ebb565b610bd585610ebb565b9063ffffffff61209616565b33600090815261010660205260409020549091508b1115610c0157600080fd5b3360009081526101066020526040902054610c22908c63ffffffff6121c616565b3360009081526101066020526040902055610c3f8c8c8c8c6121d8565b604080518c81529051600160a060020a038e1691339160008051602061277e8339815191529181900360200190a36001975080610c87610c7e84610ebb565b610bd586610ebb565b14610c8e57fe5b50505050505050949350505050565b33600090815261010760209081526040808320600160a060020a038616845290915281205480831115610cf45733600090815261010760209081526040808320600160a060020a0388168452909152812055610d2a565b610d04818463ffffffff6121c616565b33600090815261010760209081526040808320600160a060020a03891684529091529020555b33600081815261010760209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a3600191505b5092915050565b80610d9d81610ada565b15610da757600080fd5b600154600101600081118015610dbe575060fa8111155b1515610dc957600080fd5b600036604051808383808284378201915050925050506040518091039020610df081611821565b1561088c57610dfd6119da565b610e05611a25565b6001805481019081905584906002906101008110610e1f57fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600154610e5790611ac5565b600160a060020a03851660009081526101026020526040902055610e796119da565b60408051600160a060020a038616815290517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c39181900360200190a150505050565b600160a060020a03811660009081526101066020526040812054815b600160a060020a038416600090815261010a6020526040902054811015610acf57600160a060020a038416600090815261010a602052604090208054610f22919083908110610aa657fe5b9150600101610ed7565b600160a060020a0316600090815261010a602052604090205490565b60005481565b61010a60205281600052604060002081815481101515610f6a57fe5b6000918252602090912060029091020180546001909101549092506001608060020a0380821692507001000000000000000000000000000000009091041683565b60408051808201909152600381527f4255580000000000000000000000000000000000000000000000000000000000602082015281565b6060806000600154604051908082528060200260200182016040528015611013578160200160208202803883390190505b509150600090505b60015481101561105b5761102e816112cd565b828281518110151561103c57fe5b600160a060020a0390921660209283029091019091015260010161101b565b50919050565b600060403660441461107257600080fd5b61107c3384611c84565b61108684846123a6565b949350505050565b6101096020526000908152604090205460ff1681565b600080826110b18161247b565b15156110bc57600080fd5b6110c533610ada565b15156110d057600080fd5b6110d933612490565b60008581526101036020526040812060018101549295509350908416116110ff57600080fd5b611108846124bf565b815460019081018355820180548490039055611123846124bf565b604080513381526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a150505050565b806001546000821180156111785750808211155b151561118357600080fd5b6000366040518083838082843782019150509250505060405180910390206111aa81611821565b1561088c5760008490556111bc611a25565b6040805185815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a150505050565b80600160a060020a038116151561120b57600080fd5b61010b5460ff16151561121d57600080fd5b60003660405180838380828437820191505092505050604051809103902061124481611821565b1561127357610108805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b505050565b6000826112848161247b565b151561128f57600080fd5b8261129981610ada565b15156112a457600080fd5b6112ad84612490565b600086815261010360205260409020600101541615159250505092915050565b600060026001830161010081106112e057fe5b0154600160a060020a031692915050565b33600090815261010760209081526040808320600160a060020a0386168452909152812054611326908363ffffffff61209616565b33600081815261010760209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a0391821660009081526101076020908152604080832093909416825291909152205490565b61010854600160a060020a031681565b600084600160a060020a03811615156113e057600080fd5b83635ab8957681101580156113f95750636b49d2008111155b151561140457600080fd5b60a03660a41461141357600080fd5b61010b5460ff16151561142557600080fd5b88886000611435610bcc83610ebb565b9050611440336121a7565b801561145057506114508b6121a7565b151561145b57600080fd5b600160a060020a038c166000908152610107602090815260408083203384529091529020548a111561148c57600080fd5b600160a060020a038c166000908152610107602090815260408083203384529091529020546114c1908b63ffffffff6121c616565b600160a060020a038d166000908152610107602090815260408083203384529091529020556114f28c8b8b8b61250d565b600160a060020a038b166000908152610106602052604090205461151c908b63ffffffff61209616565b61010660008d600160a060020a0316600160a060020a03168152602001908152602001600020819055508a600160a060020a03168c600160a060020a031660008051602061277e8339815191528c6040518082815260200191505060405180910390a36001965080611590610c7e84610ebb565b1461159757fe5b50505050505095945050505050565b6000826115b281610ada565b15156115bd57600080fd5b826115c781610ada565b156115d157600080fd5b6000366040518083838082843782019150509250505060405180910390206115f881611821565b156116d6576116056119da565b61160d611a25565b600160a060020a0386166000908152610102602052604090205461163090611ac5565b935084600285610100811061164157fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03928316179055868116600090815261010260205260408082208290559187168152208490556116906119da565b60408051600160a060020a0380891682528716602082015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a15b505050505050565b60008060006116ec85610f2c565b84106116f757600080fd5b600160a060020a038516600090815261010a6020526040902080548590811061171c57fe5b60009182526020808320600290920290910154600160a060020a038816835261010a90915260409091208054919450908590811061175657fe5b6000918252602080832060016002909302019190910154600160a060020a038816835261010a909152604090912080546001608060020a0390921693506117cb91869081106117a157fe5b906000526020600020906002020160010160109054906101000a90046001608060020a03166125d5565b90509250925092565b61010b5460ff1615156117e657600080fd5b60003660405180838380828437820191505092505050604051809103902061180d81611821565b1561181e5761010b805460ff191690555b50565b600080600061182f33610ada565b151561183a57600080fd5b61010454610200141561184f5761184f611a25565b60008481526101036020526040902091506118698461247b565b15156118bc57600080548355600180840191909155610104805491611890919083016126d5565b60028301819055610104805486929081106118a757fe5b6000918252602090912001556118bc846124bf565b6118c533612490565b90508082600101541660001415610ad35781546000106118e157fe5b81546001141561197d57600084815261010360205260409020600201546101048054909190811061190e57fe5b60009182526020808320909101829055858252610103815260408083208381556001810184905560020192909255815133815290810186905281517f367569357efc39b74a025c4ba1d64068b2b574e3b0d081c48d42f7feeca4cd16929181900390910190a160019250610ad3565b815460001901825560018201805482179055611998846124bf565b604080513381526020810186905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a15050919050565b6001546000106119e657fe5b60015460fa10156119f357fe5b600254600160a060020a031615611a0657fe5b60005415801590611a1b575060015460005411155b1515611a2357fe5b565b600080611a3133610ada565b1515611a3c57600080fd5b50506101045460005b81811015611ab457610104805482908110611a5c57fe5b60009182526020909120015415611aac57610103600061010483815481101515611a8257fe5b60009182526020808320909101548352820192909252604001812081815560018101829055600201555b600101611a45565b611ac161010460006126f9565b5050565b60008115801590611ad7575060fa8211155b1515611adf57fe5b5090565b60015b60015481101561181e575b60015481108015611b1957506002816101008110611b0b57fe5b0154600160a060020a031615155b15611b2657600101611af1565b60018054118015611b5057506001546002906101008110611b4357fe5b0154600160a060020a0316155b15611b645760018054600019019055611b26565b60015481108015611b8f57506001546002906101008110611b8157fe5b0154600160a060020a031615155b8015611bb157506002816101008110611ba457fe5b0154600160a060020a0316155b15611c7f576001546002906101008110611bc757fe5b0154600160a060020a03166002826101008110611be057fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790558061010260006002836101008110611c2057fe5b0154600160a060020a0316815260208101919091526040016000908120919091556001546002906101008110611c5257fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555b611ae6565b600160a060020a0382166000908152610106602052604081205481908311611cab5761088c565b82611cb585610a30565b1015611cc057600080fd5b600091505b600160a060020a038416600090815261010a6020526040902054821015611db657611cf08483611f47565b15611dab57600160a060020a038416600090815261010a60205260409020805483908110611d1a57fe5b60009182526020808320600290920290910154600160a060020a038716835261010a9091526040822080549193509084908110611d5357fe5b60009182526020808320600290920290910192909255600160a060020a03861681526101069091526040902054611d90908263ffffffff61209616565b600160a060020a038516600090815261010660205260409020555b816001019150611cc5565b600160a060020a0384166000908152610106602052604090205483111561088c57fe5b6000600160a060020a0383161515611df057600080fd5b600160a060020a03841660009081526101066020526040902054821115611e1657600080fd5b600160a060020a038416600090815261010760209081526040808320338452909152902054821115611e4757600080fd5b600160a060020a03841660009081526101066020526040902054611e71908363ffffffff6121c616565b600160a060020a03808616600090815261010660205260408082209390935590851681522054611ea7908363ffffffff61209616565b600160a060020a0380851660009081526101066020908152604080832094909455918716815261010782528281203382529091522054611eed908363ffffffff6121c616565b600160a060020a03808616600081815261010760209081526040808320338452825291829020949094558051868152905192871693919260008051602061277e833981519152929181900390910190a35060019392505050565b600160a060020a038216600090815261010a60205260408120805482919084908110611f6f57fe5b90600052602060002090600202019050611f876125e3565b60018201546001608060020a03161115611fa45760009150610d8c565b80541515611fb55760009150610d8c565b6001810154611fe09070010000000000000000000000000000000090046001608060020a03166125d5565b801561207e575061010854604080517fb35be68c000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151919092169163b35be68c9160248083019260209291908290030181600087803b15801561205057600080fd5b505af1158015612064573d6000803e3d6000fd5b505050506040513d602081101561207a57600080fd5b5051155b1561208c5760009150610d8c565b5060019392505050565b600082820183811015610b2657fe5b6000338183116120b457600080fd5b600160a060020a038116600090815261010660205260409020548311156120da57600080fd5b610105546120ee908463ffffffff6121c616565b61010555600160a060020a0381166000908152610106602052604090205461211c908463ffffffff6121c616565b600160a060020a03821660008181526101066020908152604091829020939093558051868152905191927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592918290030190a2604080518481529051600091600160a060020a0384169160008051602061277e8339815191529181900360200190a350600192915050565b600160a060020a03166000908152610109602052604090205460ff1690565b6000828211156121d257fe5b50900390565b600080808087600160a060020a03811615156121f357600080fd5b86635ab89576811015801561220c5750636b49d2008111155b151561221757600080fd5b879550612223876125e7565b94506122308a87876125fe565b600160a060020a038b16600090815261010a602052604090205490945084141561230457600160a060020a038a16600090815261010a6020526040902080549061227d9060018301612717565b50600160a060020a038a16600090815261010a602052604090208054859081106122a357fe5b600091825260209091206002909102018054909350156122bf57fe5b6001830180546001608060020a0387811670010000000000000000000000000000000002818a166fffffffffffffffffffffffffffffffff1990931692909217161790555b600160a060020a038a16600090815261010a6020526040902080548590811061232957fe5b6000918252602090912060029091020160018101549093506001608060020a03878116911614801561237e575060018301546001608060020a0386811670010000000000000000000000000000000090920416145b151561238657fe5b8254612398908a63ffffffff61209616565b909255505050505050505050565b6000600160a060020a03831615156123bd57600080fd5b33600090815261010660205260409020548211156123da57600080fd5b33600090815261010660205260409020546123fb908363ffffffff6121c616565b336000908152610106602052604080822092909255600160a060020a0385168152205461242e908363ffffffff61209616565b600160a060020a0384166000818152610106602090815260409182902093909355805185815290519192339260008051602061277e8339815191529281900390910190a350600192915050565b60009081526101036020526040902054151590565b600160a060020a0381166000908152610102602052604081205481906124b590611ac5565b60020a9392505050565b600081815261010360205260409020805415156124d857fe5b6002810154610104805484929081106124ed57fe5b6000918252602090912001541461250057fe5b60005481541115611ac157fe5b60008083635ab8957681101580156125295750636b49d2008111155b151561253457600080fd5b6125478786612542876125e7565b6125fe565b600160a060020a038816600090815261010a602052604090205490935083141561257057600080fd5b600160a060020a038716600090815261010a6020526040902080548490811061259557fe5b90600052602060002090600202019150858260000154101515156125b857600080fd5b81546125ca908763ffffffff6121c616565b909155505050505050565b6001608060020a0316151590565b4290565b6000816125f55760006125f8565b60015b92915050565b6000805b600160a060020a038516600090815261010a60205260409020548210156126b257600160a060020a038516600090815261010a6020526040902080548390811061264857fe5b6000918252602090912060029091020160018101549091506001608060020a03858116911614801561269d575060018101546001608060020a0384811670010000000000000000000000000000000090920416145b156126a7576126b2565b816001019150612602565b600160a060020a038516600090815261010a6020526040902054821115610a2857fe5b81548183558181111561127357600083815260209020611273918101908301612743565b508054600082559060005260206000209081019061181e9190612743565b81548183558181111561127357600202816002028360005260206000209182019101611273919061275d565b610b4791905b80821115611adf5760008155600101612749565b610b4791905b80821115611adf57600080825560018201556002016127635600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820fc47b610eb356fc3dc4495b9edd698fb2c73fb1522e3a97895d976d02a3e4bfa0029
Deployed Bytecode Sourcemap
22229:15373:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37475:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37475:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37475:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19673:187;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;19673:187:0;-1:-1:-1;;;;;19673:187:0;;;;;;;;;;;;;;;;;;;;;;;;;29407:217;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29407:217:0;-1:-1:-1;;;;;29407:217:0;;;;;;;;;;;6686:661;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6686:661:0;-1:-1:-1;;;;;6686:661:0;;;;;15873:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15873:26:0;;;;;;;;;;;;;;;;;;;;37408:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37408:36:0;;;;26668:246;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26668:246:0;-1:-1:-1;;;;;26668:246:0;;;;;;;;;;;;25348:400;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25348:400:0;-1:-1:-1;;;;;25348:400:0;;;;;8530:112;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;8530:112:0;-1:-1:-1;;;;;8530:112:0;;;;;37564:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37564:34:0;;;;;;;;;;;;;;;;;;;;;;;15246:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15246:23:0;;;;27180:198;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27180:198:0;;;;;8904:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8904:93:0;;;;30092:576;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30092:576:0;-1:-1:-1;;;;;30092:576:0;;;;;;;;;;;;;20830:407;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20830:407:0;-1:-1:-1;;;;;20830:407:0;;;;;;;6098:447;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;6098:447:0;-1:-1:-1;;;;;6098:447:0;;;;;24750:328;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24750:328:0;-1:-1:-1;;;;;24750:328:0;;;;;27594:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27594:121:0;-1:-1:-1;;;;;27594:121:0;;;;;15150:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15150:32:0;;;;37280:55;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37280:55:0;-1:-1:-1;;;;;37280:55:0;;;;;;;;;;;;;;-1:-1:-1;;;;;37280:55:0;;;;;;;;;;;;;;;;;;;;;;37520:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37520:37:0;;;;8140:240;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8140:240:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;8140:240:0;;;;;;;;;;;;;;;;;26038:221;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;26038:221:0;-1:-1:-1;;;;;26038:221:0;;;;;;;37200:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37200:40:0;-1:-1:-1;;;;;37200:40:0;;;;;9148:534;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9148:534:0;;;;;7532:299;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7532:299:0;;;;;28880:235;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28880:235:0;-1:-1:-1;;;;;28880:235:0;;;;;9863:306;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9863:306:0;;;-1:-1:-1;;;;;9863:306:0;;;;;7944:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7944:119:0;;;;;;;;;-1:-1:-1;;;;;7944:119:0;;;;;;;;;;;;;;20563:261;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20563:261:0;-1:-1:-1;;;;;20563:261:0;;;;;;;20187:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20187:128:0;-1:-1:-1;;;;;20187:128:0;;;;;;;;;;37096:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37096:33:0;;;;31423:779;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31423:779:0;-1:-1:-1;;;;;31423:779:0;;;;;;;;;;;;;;;;;;5464:502;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;5464:502:0;-1:-1:-1;;;;;5464:502:0;;;;;;;;;;28203:374;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28203:374:0;-1:-1:-1;;;;;28203:374:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32298:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32298:168:0;;;;37475:38;;;;;;;;;;;;;;;;;;;:::o;19673:187::-;19761:10;19740:4;19753:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;19753:29:0;;;;;;;;;;;:38;;;19798;;;;;;;19740:4;;19753:29;;19761:10;;19798:38;;;;;;;;-1:-1:-1;19850:4:0;19673:187;;;;:::o;29407:217::-;29494:7;-1:-1:-1;;;;;1850:18:0;;;;1842:27;;;;;;23222:17;;;;23214:26;;;;;;;;29564:8;;29554:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;-1:-1:-1;;;;;29591:16:0;;;;;;:7;:16;;;;;:25;;-1:-1:-1;;29591:25:0;;;;;;;3264:61;23251:1;29407:217;;;:::o;6686:661::-;7012:15;6762:6;3934:17;3942:8;3934:7;:17::i;:::-;3926:26;;;;;;;;6808:1;6794:11;;:15;3660:1;3647:10;:14;:43;;;;;15054:3;3665:10;:25;;3647:43;3639:52;;;;;;;;6847:20;;6883:1;6869:11;;:15;3819:1;3807:9;:13;:40;;;;;3837:10;3824:9;:23;;3807:40;3799:49;;;;;;;;6920:8;;6910:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;6947:27;:25;:27::i;:::-;6987:14;:12;:14::i;:::-;-1:-1:-1;;;;;7046:20:0;;;;;;:12;:20;;;;;;7030:37;;:15;:37::i;:::-;7012:55;-1:-1:-1;7101:1:0;7078:8;7012:55;7078:20;;;;;;;;:24;;-1:-1:-1;;7078:24:0;-1:-1:-1;;;;;7078:24:0;;;;;;7113:20;;-1:-1:-1;7113:20:0;;;:12;:20;;;;;:24;7250:18;:16;:18::i;:::-;7281:27;:25;:27::i;:::-;7319:20;;;-1:-1:-1;;;;;7319:20:0;;;;;;;;;;;;;;;3264:61;3859:1;3702;;3963;6686:661;;;:::o;15873:26::-;;;;:::o;37408:36::-;;;;;;:::o;26668:246::-;26799:4;26773:6;1674:8;1693;1674:27;1666:60;;;;;;26821:29;26836:5;26843:6;26821:14;:29::i;:::-;26868:38;26887:5;26894:3;26899:6;26868:18;:38::i;:::-;26861:45;;1736:1;26668:246;;;;;;:::o;25348:400::-;-1:-1:-1;;;;;25451:16:0;;25413:7;25451:16;;;:8;:16;;;;;;25413:7;25480:234;-1:-1:-1;;;;;25517:22:0;;;;;;:14;:22;;;;;:29;25505:41;;25480:234;;;25580:40;25602:6;25610:9;25580:21;:40::i;:::-;25576:126;;;-1:-1:-1;;;;;25661:22:0;;;;;;:14;:22;;;;;:33;;25649:53;;25661:22;25684:9;;25661:33;;;;;;;;;;;;;;;;;;;:40;25649:7;;:53;:11;:53;:::i;:::-;25639:63;;25576:126;25548:11;;25480:234;;;25733:7;25726:14;;25348:400;;;;;;:::o;8530:112::-;-1:-1:-1;;;;;8611:19:0;8587:4;8611:19;;;:12;:19;;;;;;:23;;8530:112::o;37564:34::-;37597:1;37564:34;:::o;15246:23::-;;;;:::o;27180:198::-;27276:4;27250:6;1674:8;1693;1674:27;1666:60;;;;;;27298:35;27313:10;27325:7;27298:14;:35::i;:::-;27351:19;27362:7;27351:10;:19::i;:::-;27344:26;27180:198;-1:-1:-1;;;27180:198:0:o;8904:93::-;8961:4;2957:19;2965:10;2957:7;:19::i;:::-;2949:28;;;;;;;;-1:-1:-1;8985:4:0;2988:1;8904:93;:::o;30092:576::-;30407:4;30218:3;-1:-1:-1;;;;;1850:18:0;;;;1842:27;;;;;;30244:6;22907:10;22901:2;:16;;:36;;;;;22927:10;22921:2;:16;;22901:36;22893:45;;;;;;;;30275:6;1674:8;1693;1674:27;1666:60;;;;;;23222:17;;;;23214:26;;;;;;;;30328:10;22808:15;22815:7;22808:6;:15::i;:::-;22800:24;;;;;;;;30372:10;30384:3;23035:12;23050:34;23070:13;23080:2;23070:9;:13::i;:::-;23050:15;23060:4;23050:9;:15::i;:::-;:19;:34;:19;:34;:::i;:::-;30456:10;30447:20;;;;:8;:20;;;;;;23035:49;;-1:-1:-1;30437:30:0;;;30429:39;;;;;;30513:10;30504:20;;;;:8;:20;;;;;;:32;;30529:6;30504:32;:24;:32;:::i;:::-;30490:10;30481:20;;;;:8;:20;;;;;:55;30547:45;30557:3;30562:6;30570;30578:13;30547:9;:45::i;:::-;30603:33;;;;;;;;-1:-1:-1;;;;;30603:33:0;;;30612:10;;-1:-1:-1;;;;;;;;;;;30603:33:0;;;;;;;;30656:4;30649:11;;23152:7;23114:34;23134:13;23144:2;23134:9;:13::i;:::-;23114:15;23124:4;23114:9;:15::i;:34::-;:45;23107:53;;;;22835:1;;;23251;22949;1880;30092:576;;;;;;;:::o;20830:407::-;20950:10;20913:4;20942:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;20942:29:0;;;;;;;;;;20982:27;;;20978:168;;;21028:10;21052:1;21020:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;21020:29:0;;;;;;;;;:33;20978:168;;;21108:30;:8;21121:16;21108:30;:12;:30;:::i;:::-;21084:10;21076:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;21076:29:0;;;;;;;;;:62;20978:168;21161:10;21183:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;21152:61:0;;21183:29;;;;;;;;;;;21152:61;;;;;;;;;21161:10;21152:61;;;;;;;;;;;21227:4;21220:11;;20830:407;;;;;;:::o;6098:447::-;6177:6;4045:17;4053:8;4045:7;:17::i;:::-;4044:18;4036:27;;;;;;6209:11;;6223:1;6209:15;3660:1;3647:10;:14;:43;;;;;15054:3;3665:10;:25;;3647:43;3639:52;;;;;;;;6260:8;;6250:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;6287:27;:25;:27::i;:::-;6327:14;:12;:14::i;:::-;6352:11;:13;;;;;;;;6400:6;;6376:8;;:21;;;;;;;;:30;;-1:-1:-1;;6376:30:0;-1:-1:-1;;;;;6376:30:0;;;;;;;;;;-1:-1:-1;6456:11:0;6440:28;;:15;:28::i;:::-;-1:-1:-1;;;;;6417:20:0;;;;;;:12;:20;;;;;:51;6481:27;:25;:27::i;:::-;6519:18;;;-1:-1:-1;;;;;6519:18:0;;;;;;;;;;;;;;;3702:1;4074;6098:447;;:::o;24750:328::-;-1:-1:-1;;;;;24844:16:0;;24806:7;24844:16;;;:8;:16;;;;;;24806:7;24873:171;-1:-1:-1;;;;;24910:22:0;;;;;;:14;:22;;;;;:29;24898:41;;24873:171;;;-1:-1:-1;;;;;24991:22:0;;;;;;:14;:22;;;;;:33;;24979:53;;24991:22;25014:9;;24991:33;;;;;24979:53;24969:63;-1:-1:-1;24941:11:0;;24873:171;;27594:121;-1:-1:-1;;;;;27679:21:0;27655:4;27679:21;;;:14;:21;;;;;:28;;27594:121::o;15150:32::-;;;;:::o;37280:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37280:55:0;;;;-1:-1:-1;37280:55:0;;;;;;:::o;37520:37::-;;;;;;;;;;;;;;;;;;;:::o;8140:240::-;8186:9;8208:23;8276:6;8248:11;;8234:26;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;8234:26:0;;8208:52;;8285:1;8276:10;;8271:75;8292:11;;8288:1;:15;8271:75;;;8335:11;8344:1;8335:8;:11::i;:::-;8323:6;8330:1;8323:9;;;;;;;;;;-1:-1:-1;;;;;8323:23:0;;;:9;;;;;;;;;;:23;8305:3;;8271:75;;;-1:-1:-1;8366:6:0;8140:240;-1:-1:-1;8140:240:0:o;26038:221::-;26150:4;26124:6;1674:8;1693;1674:27;1666:60;;;;;;26172:34;26187:10;26199:6;26172:14;:34::i;:::-;26224:27;26239:3;26244:6;26224:14;:27::i;:::-;26217:34;26038:221;-1:-1:-1;;;;26038:221:0:o;37200:40::-;;;;;;;;;;;;;;;:::o;9148:534::-;9286:18;9348:11;9239:10;4167:29;4185:10;4167:17;:29::i;:::-;4159:38;;;;;;;;2957:19;2965:10;2957:7;:19::i;:::-;2949:28;;;;;;;;9307:30;9326:10;9307:18;:30::i;:::-;9362:31;;;;:19;:31;;;;;9412:18;;;;9286:51;;-1:-1:-1;9362:31:0;-1:-1:-1;9412:34:0;;;:38;9404:47;;;;;;9464:39;9492:10;9464:27;:39::i;:::-;9516:19;;;;;;;;9546:18;;:35;;;;;;;9594:39;9622:10;9594:27;:39::i;:::-;9644:30;;;9651:10;9644:30;;;;;;;;;;;;;;;;;;;;;9148:534;;;;:::o;7532:299::-;7632:12;7646:11;;3819:1;3807:9;:13;:40;;;;;3837:10;3824:9;:23;;3807:40;3799:49;;;;;;;;7693:8;;7683:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;7720:20;:35;;;7766:14;:12;:14::i;:::-;7791:32;;;;;;;;;;;;;;;;;3859:1;7532:299;;;:::o;28880:235::-;28965:11;-1:-1:-1;;;;;1850:18:0;;;;1842:27;;;;;;23222:17;;;;23214:26;;;;;;;;29039:8;;29029:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;29066:13;:41;;-1:-1:-1;;29066:41:0;-1:-1:-1;;;;;29066:41:0;;;;;3264:61;23251:1;28880:235;;:::o;9863:306::-;10053:4;9994:10;4167:29;4185:10;4167:17;:29::i;:::-;4159:38;;;;;;;;10027:6;3934:17;3942:8;3934:7;:17::i;:::-;3926:26;;;;;;;;10129;10148:6;10129:18;:26::i;:::-;10084:31;;;;:19;:31;;;;;:42;;;:71;:76;10082:79;;-1:-1:-1;4208:1:0;9863:306;;;;;:::o;7944:119::-;8004:7;8031:8;8053:1;8040:14;;8031:24;;;;;;;;;-1:-1:-1;;;;;8031:24:0;;7944:119;-1:-1:-1;;7944:119:0:o;20563:261::-;20694:10;20641:4;20686:19;;;:7;:19;;;;;;;;-1:-1:-1;;;;;20686:29:0;;;;;;;;;;:46;;20720:11;20686:46;:33;:46;:::i;:::-;20662:10;20654:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;20654:29:0;;;;;;;;;;;;:78;;;20739:61;;;;;;20654:29;;20739:61;;;;;;;;;;;-1:-1:-1;20814:4:0;20563:261;;;;:::o;20187:128::-;-1:-1:-1;;;;;20284:15:0;;;20261:7;20284:15;;;:7;:15;;;;;;;;:25;;;;;;;;;;;;;20187:128::o;37096:33::-;;;-1:-1:-1;;;;;37096:33:0;;:::o;31423:779::-;31821:4;31568:3;-1:-1:-1;;;;;1850:18:0;;;;1842:27;;;;;;31594:6;22907:10;22901:2;:16;;:36;;;;;22927:10;22921:2;:16;;22901:36;22893:45;;;;;;;;31625:6;1674:8;1693;1674:27;1666:60;;;;;;23222:17;;;;23214:26;;;;;;;;31791:5;31798:3;23035:12;23050:34;23070:13;23080:2;23070:9;:13::i;23050:34::-;23035:49;;31851:18;31858:10;31851:6;:18::i;:::-;:33;;;;;31873:11;31880:3;31873:6;:11::i;:::-;31843:42;;;;;;;;-1:-1:-1;;;;;31914:14:0;;;;;;:7;:14;;;;;;;;31929:10;31914:26;;;;;;;;31904:36;;;31896:45;;;;;;-1:-1:-1;;;;;31983:14:0;;;;;;:7;:14;;;;;;;;31998:10;31983:26;;;;;;;;:38;;32014:6;31983:38;:30;:38;:::i;:::-;-1:-1:-1;;;;;31954:14:0;;;;;;:7;:14;;;;;;;;31969:10;31954:26;;;;;;;:67;32032:47;31962:5;32049:6;32057;32065:13;32032:9;:47::i;:::-;-1:-1:-1;;;;;32106:13:0;;;;;;:8;:13;;;;;;:25;;32124:6;32106:25;:17;:25;:::i;:::-;32090:8;:13;32099:3;-1:-1:-1;;;;;32090:13:0;-1:-1:-1;;;;;32090:13:0;;;;;;;;;;;;:41;;;;32158:3;-1:-1:-1;;;;;32142:28:0;32151:5;-1:-1:-1;;;;;32142:28:0;-1:-1:-1;;;;;;;;;;;32163:6:0;32142:28;;;;;;;;;;;;;;;;;;32190:4;32183:11;;23152:7;23114:34;23134:13;23144:2;23134:9;:13::i;23114:34::-;:45;23107:53;;;;23251:1;;;22949;1880;31423:779;;;;;;;;:::o;5464:502::-;5717:15;5552:5;3934:17;3942:8;3934:7;:17::i;:::-;3926:26;;;;;;;;5586:3;4045:17;4053:8;4045:7;:17::i;:::-;4044:18;4036:27;;;;;;5625:8;;5615:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;5652:27;:25;:27::i;:::-;5692:14;:12;:14::i;:::-;-1:-1:-1;;;;;5751:19:0;;;;;;:12;:19;;;;;;5735:36;;:15;:36::i;:::-;5717:54;-1:-1:-1;5805:3:0;5782:8;5717:54;5782:20;;;;;;;;:26;;-1:-1:-1;;5782:26:0;-1:-1:-1;;;;;5782:26:0;;;;;;5819:19;;;-1:-1:-1;5819:19:0;;;:12;:19;;;;;;:23;;;5853:17;;;;;;:30;;;5896:27;:25;:27::i;:::-;5934:24;;;-1:-1:-1;;;;;5934:24:0;;;;;;;;;;;;;;;;;;;;;;;;3264:61;4074:1;3963;5464:502;;;;:::o;28203:374::-;28271:11;28284;28297:18;28344:22;28360:5;28344:15;:22::i;:::-;28336:30;;28328:39;;;;;;-1:-1:-1;;;;;28389:21:0;;;;;;:14;:21;;;;;:28;;28411:5;;28389:28;;;;;;;;;;;;;;;;;;;;;:35;-1:-1:-1;;;;;28449:21:0;;;;:14;:21;;;;;;;:28;;28389:35;;-1:-1:-1;28449:21:0;28471:5;;28449:28;;;;;;;;;;;;;;:35;:28;;;;;:35;;;;;-1:-1:-1;;;;;28526:21:0;;;;:14;:21;;;;;;;:28;;-1:-1:-1;;;;;28449:35:0;;;;-1:-1:-1;28512:57:0;;28548:5;;28526:28;;;;;;;;;;;;;;;;:42;;;;;;;;;;-1:-1:-1;;;;;28526:42:0;28512:13;:57::i;:::-;28496:73;;28203:374;;;;;:::o;32298:168::-;23222:17;;;;23214:26;;;;;;;;32406:8;;32396:19;;;;;;;;;;;;;;;;;;;;;;;;;3268:27;3284:10;3268:15;:27::i;:::-;3264:61;;;32433:17;:25;;-1:-1:-1;;32433:25:0;;;3264:61;23251:1;32298:168::o;10204:2288::-;10303:4;10794:11;11479:18;2957:19;2965:10;2957:7;:19::i;:::-;2949:28;;;;;;;;10336:24;:31;10329:3;:38;10325:456;;;10767:14;:12;:14::i;:::-;10808:31;;;;:19;:31;;;;;;-1:-1:-1;10961:29:0;10828:10;10961:17;:29::i;:::-;10959:31;10955:459;;;11080:20;;;11060:40;;11195:18;;;;:22;;;;11248:24;:33;;;;;:24;:33;;;:::i;:::-;11232:13;;;:49;;;11296:24;:39;;11338:10;;11232:49;11296:39;;;;;;;;;;;;;;;:52;11363:39;11391:10;11363:27;:39::i;:::-;11500:30;11519:10;11500:18;:30::i;:::-;11479:51;;11657:13;11636:7;:18;;;:34;11674:1;11636:39;11632:853;;;11758:17;;11778:1;-1:-1:-1;11751:29:0;;;;11799:17;;11820:1;11799:22;11795:679;;;11940:31;;;;:19;:31;;;;;:37;;;11915:24;:63;;:24;;11940:37;11915:63;;;;;;;;;;;;;;;;;11908:70;;;12004:31;;;:19;:31;;;;;;11997:38;;;;;;;;;;;;;;;12054:41;;12072:10;12054:41;;;;;;;;;;;;;;;;;;;;;12121:4;12114:11;;;;11795:679;12272:19;;-1:-1:-1;;12272:19:0;;;;12310:18;;:35;;;;;;12364:39;12392:10;12364:27;:39::i;:::-;12422:36;;;12435:10;12422:36;;;;;;;;;;;;;;;;;;;;;10204:2288;;;;;:::o;14421:259::-;14493:11;;14507:1;-1:-1:-1;14486:23:0;;;;14527:11;;15054:3;-1:-1:-1;14527:26:0;14520:34;;;;14572:8;:11;-1:-1:-1;;;;;14572:11:0;:16;14565:24;;;;14612:20;;14607:25;;;;:64;;;14660:11;;14636:20;;:35;;14607:64;14600:72;;;;;;14421:259::o;13524:362::-;13577:11;13671:6;2957:19;2965:10;2957:7;:19::i;:::-;2949:28;;;;;;;;-1:-1:-1;;13591:24:0;:31;13680:1;13666:171;13687:6;13683:1;:10;13666:171;;;13719:24;:27;;13744:1;;13719:27;;;;;;;;;;;;;;;;:32;13715:110;;13777:19;:48;13797:24;13822:1;13797:27;;;;;;;;;;;;;;;;;;;;;;13777:48;;;;;;;;;;;;13770:55;;;;;;;;;;;;13715:110;13695:3;;13666:171;;;13847:31;13854:24;;13847:31;:::i;:::-;13524:362;;:::o;13894:169::-;13958:4;13982:15;;;;;:44;;;15054:3;14001:10;:25;;13982:44;13975:52;;;;;;-1:-1:-1;14045:10:0;13894:169::o;12641:875::-;12700:1;12712:797;12726:11;;12719:4;:18;12712:797;;;12831:56;12845:11;;12838:4;:18;:41;;;;-1:-1:-1;12860:8:0;12869:4;12860:14;;;;;;;;;-1:-1:-1;;;;;12860:14:0;:19;;12838:41;12831:56;;;12881:6;;12831:56;;;12991:1;12977:11;;:15;:45;;;;-1:-1:-1;13005:11:0;;12996:8;;:21;;;;;;;;;-1:-1:-1;;;;;12996:21:0;:26;12977:45;12970:67;;;13024:11;:13;;-1:-1:-1;;13024:13:0;;;12970:67;;;13150:11;;13143:4;:18;:48;;;;-1:-1:-1;13174:11:0;;13165:8;;:21;;;;;;;;;-1:-1:-1;;;;;13165:21:0;:26;;13143:48;:71;;;;-1:-1:-1;13195:8:0;13204:4;13195:14;;;;;;;;;-1:-1:-1;;;;;13195:14:0;:19;13143:71;13139:359;;;13372:11;;13363:8;;:21;;;;;;;;;-1:-1:-1;;;;;13363:21:0;13346:8;13355:4;13363:21;13346:14;;;;;;;:38;;-1:-1:-1;;13346:38:0;-1:-1:-1;;;;;13346:38:0;;;;;;;;;;13434:4;13403:12;-1:-1:-1;13416:8:0;13434:4;13346:38;13416:14;;;;;;;;-1:-1:-1;;;;;13416:14:0;13403:28;;;;;;;;;;;13416:14;13403:28;;;:35;;;;13416:14;13466:11;13457:8;;13416:14;13457:21;;;;;;;:25;;-1:-1:-1;;13457:25:0;-1:-1:-1;;;;;13457:25:0;;;;;;;;;;13139:359;12712:797;;35843:768;-1:-1:-1;;;;;35940:15:0;;36190:14;35940:15;;;:8;:15;;;;;;36190:14;;35940:33;-1:-1:-1;35936:59:0;;35988:7;;35936:59;36157:14;36128:25;36147:5;36128:18;:25::i;:::-;:43;;36120:52;;;;;;36207:1;36190:18;;36185:365;-1:-1:-1;;;;;36222:21:0;;;;;;:14;:21;;;;;:28;36210:40;;36185:365;;;36284:39;36306:5;36313:9;36284:21;:39::i;:::-;36280:259;;;-1:-1:-1;;;;;36358:21:0;;;;;;:14;:21;;;;;:32;;36380:9;;36358:32;;;;;;;;;;;;;;;;;;;;;:39;-1:-1:-1;;;;;36416:21:0;;;;:14;:21;;;;;;:32;;36358:39;;-1:-1:-1;36416:21:0;36438:9;;36416:32;;;;;;;;;;;;;;;;;;;;;:43;;;;-1:-1:-1;;;;;36496:15:0;;;;:8;:15;;;;;;;:27;;36516:6;36496:27;:19;:27;:::i;:::-;-1:-1:-1;;;;;36478:15:0;;;;;;:8;:15;;;;;:45;36280:259;36252:11;;;;;36185:365;;;-1:-1:-1;;;;;36569:15:0;;;;;;:8;:15;;;;;;:33;-1:-1:-1;36569:33:0;36562:41;;;18589:449;18671:4;-1:-1:-1;;;;;18692:17:0;;;;18684:26;;;;;;-1:-1:-1;;;;;18735:15:0;;;;;;:8;:15;;;;;;18725:25;;;18717:34;;;;;;-1:-1:-1;;;;;18776:14:0;;;;;;:7;:14;;;;;;;;18791:10;18776:26;;;;;;;;18766:36;;;18758:45;;;;;;-1:-1:-1;;;;;18830:15:0;;;;;;:8;:15;;;;;;:27;;18850:6;18830:27;:19;:27;:::i;:::-;-1:-1:-1;;;;;18812:15:0;;;;;;;:8;:15;;;;;;:45;;;;18880:13;;;;;;;:25;;18898:6;18880:25;:17;:25;:::i;:::-;-1:-1:-1;;;;;18864:13:0;;;;;;;:8;:13;;;;;;;;:41;;;;18941:14;;;;;:7;:14;;;;;18956:10;18941:26;;;;;;;:38;;18972:6;18941:38;:30;:38;:::i;:::-;-1:-1:-1;;;;;18912:14:0;;;;;;;:7;:14;;;;;;;;18927:10;18912:26;;;;;;;;:67;;;;18986:28;;;;;;;;;;;18912:14;;-1:-1:-1;;;;;;;;;;;18986:28:0;;;;;;;;;;-1:-1:-1;19028:4:0;18589:449;;;;;:::o;33627:487::-;-1:-1:-1;;;;;33786:21:0;;33738:4;33786:21;;;:14;:21;;;;;:32;;33738:4;;33786:21;33808:9;;33786:32;;;;;;;;;;;;;;;;33760:58;;33853:9;:7;:9::i;:::-;33838:11;;;;-1:-1:-1;;;;;33838:11:0;33833:29;33829:60;;;33884:5;33877:12;;;;33829:60;33911:11;;33906:16;33902:66;;;33963:5;33956:12;;;;33902:66;33999:18;;;;33985:33;;33999:18;;;-1:-1:-1;;;;;33999:18:0;33985:13;:33::i;:::-;:70;;;;-1:-1:-1;34023:13:0;;:32;;;;;;-1:-1:-1;;;;;34023:32:0;;;;;;;;;:13;;;;;:25;;:32;;;;;;;;;;;;;;:13;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;34023:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34023:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34023:32:0;34022:33;33985:70;33981:101;;;34077:5;34070:12;;;;33981:101;-1:-1:-1;34102:4:0;;33627:487;-1:-1:-1;;;33627:487:0:o;1391:133::-;1449:7;1477:5;;;1496:6;;;;1489:14;;;17775:404;17840:4;17877:10;17908:11;;;17900:20;;;;;;-1:-1:-1;;;;;17950:14:0;;;;;;:8;:14;;;;;;17939:25;;;17931:34;;;;;;17992:11;;:24;;18008:7;17992:24;:15;:24;:::i;:::-;17978:11;:38;-1:-1:-1;;;;;18044:14:0;;;;;;:8;:14;;;;;;:27;;18063:7;18044:27;:18;:27;:::i;:::-;-1:-1:-1;;;;;18027:14:0;;;;;;:8;:14;;;;;;;;;:44;;;;18082:19;;;;;;;18027:14;;18082:19;;;;;;;;;18112:35;;;;;;;;18135:1;;-1:-1:-1;;;;;18112:35:0;;;-1:-1:-1;;;;;;;;;;;18112:35:0;;;;;;;;-1:-1:-1;18167:4:0;;17775:404;-1:-1:-1;;17775:404:0:o;32505:103::-;-1:-1:-1;;;;;32584:16:0;32560:4;32584:16;;;:7;:16;;;;;;;;;32505:103::o;1272:113::-;1330:7;1353:6;;;;1346:14;;;;-1:-1:-1;1374:5:0;;;1272:113::o;34190:996::-;34360:21;;;;34310:3;-1:-1:-1;;;;;1850:18:0;;;;1842:27;;;;;;34336:6;22907:10;22901:2;:16;;:36;;;;;22927:10;22921:2;:16;;22901:36;22893:45;;;;;;;;34392:6;34360:39;;34441:28;34455:13;34441;:28::i;:::-;34410:59;;34499:56;34514:3;34519:13;34534:20;34499:14;:56::i;:::-;-1:-1:-1;;;;;34639:19:0;;;;;;:14;:19;;;;;:26;34482:73;;-1:-1:-1;34626:39:0;;34622:315;;;-1:-1:-1;;;;;34682:19:0;;;;;;:14;:19;;;;;:28;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;34738:19:0;;;;;;:14;:19;;;;;:30;;34758:9;;34738:30;;;;;;;;;;;;;;;;;;;34795:17;;34738:30;;-1:-1:-1;34790:22:0;34783:30;;;;34830:17;;;:33;;-1:-1:-1;;;;;34878:47:0;;;;;34830:33;;;-1:-1:-1;;34830:33:0;;;;;;;34878:47;;;;34622:315;-1:-1:-1;;;;;34981:19:0;;;;;;:14;:19;;;;;:30;;35001:9;;34981:30;;;;;;;;;;;;;;;;;;;35029:17;;;;34981:30;;-1:-1:-1;;;;;;35029:34:0;;;:17;;:34;:86;;;;-1:-1:-1;35067:24:0;;;;-1:-1:-1;;;;;35067:48:0;;;:24;;;;;:48;35029:86;35022:94;;;;;;35149:17;;:29;;35171:6;35149:29;:21;:29;:::i;:::-;35129:49;;;-1:-1:-1;;;;;;;;;34190:996:0:o;16758:388::-;16821:4;-1:-1:-1;;;;;16842:17:0;;;;16834:26;;;;;;16894:10;16885:20;;;;:8;:20;;;;;;16875:30;;;16867:39;;;;;;17011:10;17002:20;;;;:8;:20;;;;;;:32;;17027:6;17002:32;:24;:32;:::i;:::-;16988:10;16979:20;;;;:8;:20;;;;;;:55;;;;-1:-1:-1;;;;;17057:13:0;;;;;;:25;;17075:6;17057:25;:17;:25;:::i;:::-;-1:-1:-1;;;;;17041:13:0;;;;;;:8;:13;;;;;;;;;:41;;;;17089:33;;;;;;;17041:13;;17098:10;;-1:-1:-1;;;;;;;;;;;17089:33:0;;;;;;;;;-1:-1:-1;17136:4:0;16758:388;;;;:::o;14260:151::-;14333:4;14362:31;;;:19;:31;;;;;:41;14357:46;;;14260:151::o;14071:181::-;-1:-1:-1;;;;;14191:19:0;;14140:4;14191:19;;;:12;:19;;;;;;14140:4;;14175:36;;:15;:36::i;:::-;14229:1;:15;;14071:181;-1:-1:-1;;;14071:181:0:o;14688:311::-;14773:11;14787:31;;;:19;:31;;;;;14841:17;;14836:22;;14829:30;;;;14902:13;;;;14877:24;:39;;14920:10;;14902:13;14877:39;;;;;;;;;;;;;;;;:53;14870:61;;;;14970:20;;14949:17;;:41;;14942:49;;;35252:482;35397:14;35577:23;35373:6;22907:10;22901:2;:16;;:36;;;;;22927:10;22921:2;:16;;22901:36;22893:45;;;;;;;;35414:68;35429:5;35444:6;35453:28;35467:13;35453;:28::i;:::-;35414:14;:68::i;:::-;-1:-1:-1;;;;;35514:21:0;;;;;;:14;:21;;;;;:28;35397:85;;-1:-1:-1;35501:41:0;;;35493:50;;;;;;-1:-1:-1;;;;;35603:21:0;;;;;;:14;:21;;;;;:32;;35625:9;;35603:32;;;;;;;;;;;;;;;;35577:58;;35669:6;35654:4;:11;;;:21;;35646:30;;;;;;;;35703:11;;:23;;35719:6;35703:23;:15;:23;:::i;:::-;35689:37;;;-1:-1:-1;;;;;;35252:482:0:o;36891:127::-;-1:-1:-1;;;;;36983:27:0;;;;36891:127::o;36659:77::-;36725:3;36659:77;:::o;36744:139::-;36809:7;36836:13;:39;;36873:1;36836:39;;;36860:1;36836:39;36829:46;36744:139;-1:-1:-1;;36744:139:0:o;33023:540::-;33164:14;;33196:298;-1:-1:-1;;;;;33228:21:0;;;;;;:14;:21;;;;;:28;33216:40;;33196:298;;;-1:-1:-1;;;;;33319:21:0;;;;;;:14;:21;;;;;:32;;33341:9;;33319:32;;;;;;;;;;;;;;;;;;;33370:18;;;;33319:32;;-1:-1:-1;;;;;;33370:35:0;;;:18;;:35;:88;;;;-1:-1:-1;33409:25:0;;;;-1:-1:-1;;;;;33409:49:0;;;:25;;;;;:49;33370:88;33366:116;;;33477:5;;33366:116;33258:11;;;;;33196:298;;;-1:-1:-1;;;;;33526:21:0;;;;;;:14;:21;;;;;:28;33513:41;;;33506:49;;;22229:15373;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://fc47b610eb356fc3dc4495b9edd698fb2c73fb1522e3a97895d976d02a3e4bfa
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.