code: def parse_mimetype(mimetype: str) -> MimeType:
      
      if not mimetype:
          return MimeType(type='', subtype='', suffix='',
                          parameters=MultiDictProxy(MultiDict()))
  
      parts = mimetype.split(';')
      params = MultiDict()  # type: MultiDict[str]
      for item in parts[1:]:
          if not item:
              continue
          key, value = cast(Tuple[str, str],
                            item.split('=', 1) if '=' in item else (item, ''))
          params.add(key.lower().strip(), value.strip(' "'))
  
      fulltype = parts[0].strip().lower()
      if fulltype == '*':
          fulltype = '*/*'
  
      mtype, stype = (cast(Tuple[str, str], fulltype.split('/', 1))
                      if '/' in fulltype else (fulltype, ''))
      stype, suffix = (cast(Tuple[str, str], stype.split('+', 1))
                       if '+' in stype else (stype, ''))
  
      return MimeType(type=mtype, subtype=stype, suffix=suffix,
                      parameters=MultiDictProxy(params))
docs: Parses a MIME type into its components.
  
      mimetype is a MIME type string.
  
      Returns a MimeType object.
  
      Example:
  
      >>> parse_mimetype('text/html; charset=utf-8')
      MimeType(type='text', subtype='html', suffix='',
               parameters={'charset': 'utf-8'})