docs: def parse_auth(cls, entries, raise_on_error=False):
          """
          Parses authentication entries
  
          Args:
            entries:        Dict of authentication entries.
            raise_on_error: If set to true, an invalid format will raise
                            InvalidConfigFile
  
          Returns:
            Authentication registry.
          """
  
          conf = {}
          for registry, entry in six.iteritems(entries):
              if not isinstance(entry, dict):
                  log.debug(
                      'Config entry for key {0} is not auth config'.format(
                          registry
                      )
                  )
                  # We sometimes fall back to parsing the whole config as if it
                  # was the auth config by itself, for legacy purposes. In that
                  # case, we fail silently and return an empty conf if any of the
                  # keys is not formatted properly.
                  if raise_on_error:
                      raise errors.InvalidConfigFile(
                          'Invalid configuration for registry {0}'.format(
                              registry
                          )
                      )
                  return {}
              if 'identitytoken' in entry:
                  log.debug(
                      'Found an IdentityToken entry for registry {0}'.format(
                          registry
                      )
                  )
                  conf[registry] = {
                      'IdentityToken': entry['identitytoken']
                  }
                  continue  # Other values are irrelevant if we have a token
  
              if 'auth' not in entry:
                  # Starting with engine v1.11 (API 1.23), an empty dictionary is
                  # a valid value in the auths config.
                  # https://github.com/docker/compose/issues/3265
                  log.debug(
                      'Auth data for {0} is absent. Client might be using a '
                      'credentials store instead.'.format(registry)
                  )
                  conf[registry] = {}
                  continue
  
              username, password = decode_auth(entry['auth'])
              log.debug(
                  'Found entry (registry={0}, username={1})'
                  .format(repr(registry), repr(username))
              )
  
              conf[registry] = {
                  'username': username,
                  'password': password,
                  'email': entry.get('email'),
                  'serveraddress': registry,
              }
          return conf