ETH Price: $3,121.41 (-0.54%)

Token

CRPT Classic (CRPTC)
 

Overview

Max Total Supply

88,455,468.881611658843793907 CRPTC

Holders

53,754

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
190.06022 CRPTC

Value
$0.00
0xc7cc3c0d5f728fc6b065094f0f1391d4f152647b
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

CRPT Classic (CRPTC) is the legendary collectible digital asset launched in 2017. It’s a true cryptocurrency with no restrictions on areas of its use, “old school”, really anonymous and decentralized. More than 50,000 people use CRPTC these days.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CrypteriumToken

Compiler Version
v0.4.16+commit.d7661dd9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2017-11-07
*/

pragma solidity ^0.4.16;

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

    /**
    * @dev The Ownable constructor sets the original `owner` of the contract to the sender
    * account.
    */
    function Ownable() public {
        owner = msg.sender;
    }
    
    /**
    * @dev Throws if called by any account other than the owner.
    */
    modifier onlyOwner() {
        require(msg.sender == owner);
        _;
    }
    
    /**
    * @dev Allows the current owner to transfer control of the contract to a newOwner.
    * @param newOwner The address to transfer ownership to.
    */
    function transferOwnership(address newOwner) onlyOwner public {
        require(newOwner != address(0));      
        owner = newOwner;
    }

}

contract CrypteriumToken is Ownable {
    
    uint256 public totalSupply;
    mapping(address => uint256) balances;
    mapping(address => mapping(address => uint256)) allowed;
    
    string public constant name = "CrypteriumToken";
    string public constant symbol = "CRPT";
    uint32 public constant decimals = 18;

    uint constant restrictedPercent = 30; //should never be set above 100
    address constant restricted = 0x1d907C982B0B093b5173574FAbe7965181522c7B;
    uint constant start = 1509458400;
    uint constant period = 87;
    uint256 public constant hardcap = 300000000 * 1 ether;
    
    bool public transferAllowed = false;
    bool public mintingFinished = false;
    
    modifier whenTransferAllowed() {
        if(msg.sender != owner){
            require(transferAllowed);
        }
        _;
    }

    modifier saleIsOn() {
        require(now > start && now < start + period * 1 days);
        _;
    }
    
    modifier canMint() {
        require(!mintingFinished);
        _;
    }
  
    function transfer(address _to, uint256 _value) whenTransferAllowed public returns (bool) {
        require(_to != address(0));
        require(_value <= balances[msg.sender]);
        
        balances[msg.sender] = balances[msg.sender] - _value;
        balances[_to] = balances[_to] + _value;
        //assert(balances[_to] >= _value); no need to check, since mint has limited hardcap
        Transfer(msg.sender, _to, _value);
        return true;
    }

    function balanceOf(address _owner) constant public returns (uint256 balance) {
        return balances[_owner];
    }
    
    function transferFrom(address _from, address _to, uint256 _value) whenTransferAllowed public returns (bool) {
        require(_to != address(0));
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);
        
        balances[_from] = balances[_from] - _value;
        balances[_to] = balances[_to] + _value;
        //assert(balances[_to] >= _value); no need to check, since mint has limited hardcap
        allowed[_from][msg.sender] = allowed[_from][msg.sender] - _value;
        Transfer(_from, _to, _value);
        return true;
    }

    function approve(address _spender, uint256 _value) public returns (bool) {
        //NOTE: To prevent attack vectors like the one discussed here: 
        //https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729,
        //clients SHOULD make sure to create user interfaces in such a way 
        //that they set the allowance first to 0 before setting it to another value for the same spender. 
    
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }

    function allowance(address _owner, address _spender) public constant returns (uint256 remaining) {
        return allowed[_owner][_spender];
    }
   
    function allowTransfer() onlyOwner public {
        transferAllowed = true;
    }
    
    function mint(address _to, uint256 _value) onlyOwner saleIsOn canMint public returns (bool) {
        require(_to != address(0));
        
        uint restrictedTokens = _value * restrictedPercent / (100 - restrictedPercent);
        uint _amount = _value + restrictedTokens;
        assert(_amount >= _value);
        
        if(_amount + totalSupply <= hardcap){
        
            totalSupply = totalSupply + _amount;
            
            assert(totalSupply >= _amount);
            
            balances[msg.sender] = balances[msg.sender] + _amount;
            assert(balances[msg.sender] >= _amount);
            Mint(msg.sender, _amount);
        
            transfer(_to, _value);
            transfer(restricted, restrictedTokens);
        }
        return true;
    }

    function finishMinting() onlyOwner public returns (bool) {
        mintingFinished = true;
        MintFinished();
        return true;
    }
    
    /**
     * @dev Burns a specific amount of tokens.
     * @param _value The amount of token to be burned.
     */
    function burn(uint256 _value) public returns (bool) {
        require(_value <= balances[msg.sender]);
        // no need to require value <= totalSupply, since that would imply the
        // sender's balance is greater than the totalSupply, which *should* be an assertion failure
        balances[msg.sender] = balances[msg.sender] - _value;
        totalSupply = totalSupply - _value;
        Burn(msg.sender, _value);
        return true;
    }
    
    function burnFrom(address _from, uint256 _value) public returns (bool success) {
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);
        balances[_from] = balances[_from] - _value;
        allowed[_from][msg.sender] = allowed[_from][msg.sender] - _value;
        totalSupply = totalSupply - _value;
        Burn(_from, _value);
        return true;
    }

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);

    event Mint(address indexed to, uint256 amount);

    event MintFinished();

    event Burn(address indexed burner, uint256 value);

}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"transferAllowed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"}],"name":"burnFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"allowTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"hardcap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"}]

60606040526004805461ffff191690555b60008054600160a060020a03191633600160a060020a03161790555b5b610c408061003c6000396000f300606060405236156101045763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305d2035b811461010957806306fdde0314610130578063095ea7b3146101bb57806318160ddd146101f157806323b872dd14610216578063313ce5671461025257806334fec4671461027e57806340c10f19146102a557806342966c68146102db57806370a082311461030557806379cc6790146103365780637d64bcb41461036c5780638da5cb5b1461039357806395d89b41146103c25780639b08a22f1461044d578063a9059cbb14610462578063b071cbe614610498578063dd62ed3e146104bd578063f2fde38b146104f4575b600080fd5b341561011457600080fd5b61011c610515565b604051901515815260200160405180910390f35b341561013b57600080fd5b610143610523565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101805780820151818401525b602001610167565b50505050905090810190601f1680156101ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101c657600080fd5b61011c600160a060020a036004351660243561055a565b604051901515815260200160405180910390f35b34156101fc57600080fd5b6102046105c7565b60405190815260200160405180910390f35b341561022157600080fd5b61011c600160a060020a03600435811690602435166044356105cd565b604051901515815260200160405180910390f35b341561025d57600080fd5b6102656106f3565b60405163ffffffff909116815260200160405180910390f35b341561028957600080fd5b61011c6106f8565b604051901515815260200160405180910390f35b34156102b057600080fd5b61011c600160a060020a0360043516602435610701565b604051901515815260200160405180910390f35b34156102e657600080fd5b61011c600435610851565b604051901515815260200160405180910390f35b341561031057600080fd5b610204600160a060020a03600435166108dc565b60405190815260200160405180910390f35b341561034157600080fd5b61011c600160a060020a03600435166024356108fb565b604051901515815260200160405180910390f35b341561037757600080fd5b61011c6109d7565b604051901515815260200160405180910390f35b341561039e57600080fd5b6103a6610a36565b604051600160a060020a03909116815260200160405180910390f35b34156103cd57600080fd5b610143610a45565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101805780820151818401525b602001610167565b50505050905090810190601f1680156101ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561045857600080fd5b610460610a7c565b005b341561046d57600080fd5b61011c600160a060020a0360043516602435610aa8565b604051901515815260200160405180910390f35b34156104a357600080fd5b610204610b7b565b60405190815260200160405180910390f35b34156104c857600080fd5b610204600160a060020a0360043581169060243516610b8a565b60405190815260200160405180910390f35b34156104ff57600080fd5b610460600160a060020a0360043516610bb7565b005b600454610100900460ff1681565b60408051908101604052600f81527f4372797074657269756d546f6b656e0000000000000000000000000000000000602082015281565b600160a060020a03338116600081815260036020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60015481565b6000805433600160a060020a039081169116146105f55760045460ff1615156105f557600080fd5b5b600160a060020a038316151561060b57600080fd5b600160a060020a03841660009081526002602052604090205482111561063057600080fd5b600160a060020a038085166000908152600360209081526040808320339094168352929052205482111561066357600080fd5b600160a060020a03848116600081815260026020908152604080832080548890039055878516808452818420805489019055848452600383528184203390961684529490915290819020805486900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060015b5b9392505050565b601281565b60045460ff1681565b600080548190819033600160a060020a0390811691161461072157600080fd5b6359f881e0421180156107375750635a6b346042105b151561074257600080fd5b600454610100900460ff161561075757600080fd5b600160a060020a038516151561076c57600080fd5b6046601e85025b049150508281018381101561078457fe5b6001546af8277896582678ac000000908201116108415760018054820190819055819010156107af57fe5b600160a060020a03331660009081526002602052604090208054820190819055819010156107d957fe5b33600160a060020a03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405190815260200160405180910390a26108208585610aa8565b5061083f731d907c982b0b093b5173574fabe7965181522c7b83610aa8565b505b600192505b5b5b5b505092915050565b600160a060020a03331660009081526002602052604081205482111561087657600080fd5b600160a060020a03331660008181526002602052604090819020805485900390556001805485900390557fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59084905190815260200160405180910390a25060015b919050565b600160a060020a0381166000908152600260205260409020545b919050565b600160a060020a03821660009081526002602052604081205482111561092057600080fd5b600160a060020a038084166000908152600360209081526040808320339094168352929052205482111561095357600080fd5b600160a060020a038381166000818152600260209081526040808320805488900390556003825280832033909516835293905282902080548590039055600180548590039055907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59084905190815260200160405180910390a25060015b92915050565b6000805433600160a060020a039081169116146109f357600080fd5b6004805461ff0019166101001790557fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a15060015b5b90565b600054600160a060020a031681565b60408051908101604052600481527f4352505400000000000000000000000000000000000000000000000000000000602082015281565b60005433600160a060020a03908116911614610a9757600080fd5b6004805460ff191660011790555b5b565b6000805433600160a060020a03908116911614610ad05760045460ff161515610ad057600080fd5b5b600160a060020a0383161515610ae657600080fd5b600160a060020a033316600090815260026020526040902054821115610b0b57600080fd5b600160a060020a033381166000818152600260205260408082208054879003905592861680825290839020805486019055917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060015b5b92915050565b6af8277896582678ac00000081565b600160a060020a038083166000908152600360209081526040808320938516835292905220545b92915050565b60005433600160a060020a03908116911614610bd257600080fd5b600160a060020a0381161515610be757600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b505600a165627a7a7230582041befea66ffbce368eaa6c9b4ab009f4283760c7b9834a9b842201db999e47200029

Deployed Bytecode

0x606060405236156101045763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305d2035b811461010957806306fdde0314610130578063095ea7b3146101bb57806318160ddd146101f157806323b872dd14610216578063313ce5671461025257806334fec4671461027e57806340c10f19146102a557806342966c68146102db57806370a082311461030557806379cc6790146103365780637d64bcb41461036c5780638da5cb5b1461039357806395d89b41146103c25780639b08a22f1461044d578063a9059cbb14610462578063b071cbe614610498578063dd62ed3e146104bd578063f2fde38b146104f4575b600080fd5b341561011457600080fd5b61011c610515565b604051901515815260200160405180910390f35b341561013b57600080fd5b610143610523565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101805780820151818401525b602001610167565b50505050905090810190601f1680156101ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101c657600080fd5b61011c600160a060020a036004351660243561055a565b604051901515815260200160405180910390f35b34156101fc57600080fd5b6102046105c7565b60405190815260200160405180910390f35b341561022157600080fd5b61011c600160a060020a03600435811690602435166044356105cd565b604051901515815260200160405180910390f35b341561025d57600080fd5b6102656106f3565b60405163ffffffff909116815260200160405180910390f35b341561028957600080fd5b61011c6106f8565b604051901515815260200160405180910390f35b34156102b057600080fd5b61011c600160a060020a0360043516602435610701565b604051901515815260200160405180910390f35b34156102e657600080fd5b61011c600435610851565b604051901515815260200160405180910390f35b341561031057600080fd5b610204600160a060020a03600435166108dc565b60405190815260200160405180910390f35b341561034157600080fd5b61011c600160a060020a03600435166024356108fb565b604051901515815260200160405180910390f35b341561037757600080fd5b61011c6109d7565b604051901515815260200160405180910390f35b341561039e57600080fd5b6103a6610a36565b604051600160a060020a03909116815260200160405180910390f35b34156103cd57600080fd5b610143610a45565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101805780820151818401525b602001610167565b50505050905090810190601f1680156101ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561045857600080fd5b610460610a7c565b005b341561046d57600080fd5b61011c600160a060020a0360043516602435610aa8565b604051901515815260200160405180910390f35b34156104a357600080fd5b610204610b7b565b60405190815260200160405180910390f35b34156104c857600080fd5b610204600160a060020a0360043581169060243516610b8a565b60405190815260200160405180910390f35b34156104ff57600080fd5b610460600160a060020a0360043516610bb7565b005b600454610100900460ff1681565b60408051908101604052600f81527f4372797074657269756d546f6b656e0000000000000000000000000000000000602082015281565b600160a060020a03338116600081815260036020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a35060015b92915050565b60015481565b6000805433600160a060020a039081169116146105f55760045460ff1615156105f557600080fd5b5b600160a060020a038316151561060b57600080fd5b600160a060020a03841660009081526002602052604090205482111561063057600080fd5b600160a060020a038085166000908152600360209081526040808320339094168352929052205482111561066357600080fd5b600160a060020a03848116600081815260026020908152604080832080548890039055878516808452818420805489019055848452600383528184203390961684529490915290819020805486900390557fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060015b5b9392505050565b601281565b60045460ff1681565b600080548190819033600160a060020a0390811691161461072157600080fd5b6359f881e0421180156107375750635a6b346042105b151561074257600080fd5b600454610100900460ff161561075757600080fd5b600160a060020a038516151561076c57600080fd5b6046601e85025b049150508281018381101561078457fe5b6001546af8277896582678ac000000908201116108415760018054820190819055819010156107af57fe5b600160a060020a03331660009081526002602052604090208054820190819055819010156107d957fe5b33600160a060020a03167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858260405190815260200160405180910390a26108208585610aa8565b5061083f731d907c982b0b093b5173574fabe7965181522c7b83610aa8565b505b600192505b5b5b5b505092915050565b600160a060020a03331660009081526002602052604081205482111561087657600080fd5b600160a060020a03331660008181526002602052604090819020805485900390556001805485900390557fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59084905190815260200160405180910390a25060015b919050565b600160a060020a0381166000908152600260205260409020545b919050565b600160a060020a03821660009081526002602052604081205482111561092057600080fd5b600160a060020a038084166000908152600360209081526040808320339094168352929052205482111561095357600080fd5b600160a060020a038381166000818152600260209081526040808320805488900390556003825280832033909516835293905282902080548590039055600180548590039055907fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca59084905190815260200160405180910390a25060015b92915050565b6000805433600160a060020a039081169116146109f357600080fd5b6004805461ff0019166101001790557fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a15060015b5b90565b600054600160a060020a031681565b60408051908101604052600481527f4352505400000000000000000000000000000000000000000000000000000000602082015281565b60005433600160a060020a03908116911614610a9757600080fd5b6004805460ff191660011790555b5b565b6000805433600160a060020a03908116911614610ad05760045460ff161515610ad057600080fd5b5b600160a060020a0383161515610ae657600080fd5b600160a060020a033316600090815260026020526040902054821115610b0b57600080fd5b600160a060020a033381166000818152600260205260408082208054879003905592861680825290839020805486019055917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9085905190815260200160405180910390a35060015b5b92915050565b6af8277896582678ac00000081565b600160a060020a038083166000908152600360209081526040808320938516835292905220545b92915050565b60005433600160a060020a03908116911614610bd257600080fd5b600160a060020a0381161515610be757600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b505600a165627a7a7230582041befea66ffbce368eaa6c9b4ab009f4283760c7b9834a9b842201db999e47200029

Swarm Source

bzzr://41befea66ffbce368eaa6c9b4ab009f4283760c7b9834a9b842201db999e4720
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.