# Path: azmq/errors.py
# class ProtocolError(AZMQError):
#     def __init__(self, msg, fatal=False):
#         super().__init__(msg)
#         self.fatal = fatal


import struct
from .errors import ProtocolError

def buffer_to_metadata(buffer):
    """
    Transform a buffer to a metadata dictionary.

    :param buffer: The buffer, as received in a READY command.
    :returns: A metadata dictionary, with its keys normalized (in
        lowercase).
    """
    offset = 0
    size = len(buffer)
    metadata = {}

    while offset < size:
        name_size = struct.unpack_from('B', buffer, offset)[0]
        offset += 1

        if name_size > size - 4:
            raise ProtocolError(
                "Invalid name size in metadata",
                fatal=True,
            )

        name = buffer[offset:offset + name_size]
        offset += name_size

        value_size = struct.unpack_from('!I', buffer, offset)[0]
        offset += 4

        if value_size > size - name_size - 5:

# Path: azmq/errors.py
# class ProtocolError(AZMQError):
#     def __init__(self, msg, fatal=False):
#         super().__init__(msg)
#         self.fatal = fatal


# Path: azmq/metadata.py
import struct
from .errors import ProtocolError


def buffer_to_metadata(buffer):
    """
    Transform a buffer to a metadata dictionary.

    :param buffer: The buffer, as received in a READY command.
    :returns: A metadata dictionary, with its keys normalized (in
        lowercase).
    """
    offset = 0
    size = len(buffer)
    metadata = {}

    while offset < size:
        name_size = struct.unpack_from('B', buffer, offset)[0]
        offset += 1

        if name_size > size - 4:
            raise ProtocolError(
                "Invalid name size in metadata",
                fatal=True,
            )

        name = buffer[offset:offset + name_size]
        offset += name_size

        value_size = struct.unpack_from('!I', buffer, offset)[0]
        offset += 4

        if value_size > size - name_size - 5:

            raise ProtocolError(