<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def parse_fs_url(fs_url):
 # type: (Text) -> ParseResult """Parse a Filesystem URL and return a `ParseResult`. Arguments: fs_url (str):
 A filesystem URL. Returns: ~fs.opener.parse.ParseResult: a parse result instance. Raises: ~fs.errors.ParseError: if the FS URL is not valid. """

    match = _RE_FS_URL.match(fs_url)
    if match is None:
        raise ParseError("{!r} is not a fs2 url".format(fs_url))

    fs_name, credentials, url1, url2, path = match.groups()
    if not credentials:
        username = None  # type: Optional[Text]
        password = None  # type: Optional[Text]
        url = url2
    else:
        username, _, password = credentials.partition(":")
        username = unquote(username)
        password = unquote(password)
        url = url1
    url, has_qs, qs = url.partition("?")
    resource = unquote(url)
    if has_qs:
        _params = parse_qs(qs, keep_blank_values=True)
        params = {k: unquote(v[0]) for k, v in six.iteritems(_params)}
    else:
        params = {}
    return ParseResult(fs_name, username, password, resource, params, path)