contract Lockable {
    bool public    m_bIsLock;
    
    // Admin Address
    address public m_aOwner;
    mapping( address => bool ) public m_mLockAddress;

    event Locked(address a_aLockAddress, bool a_bStatus);

    modifier IsOwner {
        require(m_aOwner == msg.sender);
        _;
    }

    modifier CheckAllLock {
        require(!m_bIsLock);
        _;
    }

    modifier CheckLockAddress {
        if (m_mLockAddress[msg.sender]) {
            revert();
        }
        _;
    }

    constructor() public {
        m_bIsLock   = true;
        m_aOwner    = msg.sender;
    }

    function SetAllLock(bool a_bStatus)
    public
    IsOwner
    {
        m_bIsLock = a_bStatus;
    }

    // Lock Address
    function SetLockAddress(address a_aLockAddress, bool a_bStatus)
    external
    IsOwner
    {
        require(m_aOwner != a_aLockAddress);

        m_mLockAddress[a_aLockAddress] = a_bStatus;
        
        emit Locked(a_aLockAddress, a_bStatus);
    }
}
// ----------------------------------------------------------------------------
// @Name Lockable
// @Desc Admin Lock
// ----------------------------------------------------------------------------
function SetLockAddress(address a_aLockAddress, bool a_bStatus)
external
IsOwner
{
    require(m_aOwner != a_aLockAddress);

    m_mLockAddress[a_aLockAddress] = a_bStatus;
        
    emit Locked(a_aLockAddress, a_bStatus);
}

// Lock Address