// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/Authority.java
// public interface Authority
// {
//     /**
//      * Returns the {@link Optional} user info part of the authority in encoded form.
//      *
//      * @return The {@link UriEncoded} user info.
//      */
//     Optional<? extends UriEncoded> userInfo();
// 
//     /**
//      * Returns the host of this authority.
//      *
//      * @return The {@link UriEncoded} host.
//      */
//     UriEncoded host();
// 
//     /**
//      * The {@link Optional} port number.
//      *
//      * @return An {@link Optional} port number (as an {@link Integer}).
//      */
//     Optional<Integer> port();
// }
// 
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/Fragment.java
// public interface Fragment extends UriEncoded
// {
// 
//     /**
//      * Returns the encoded String representation of the fragment.
//      *
//      * @return A {@link String} representing the encoded fragment.
//      */
//     @Override
//     String toString();
// }
// 
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/Path.java
// public interface Path extends Iterable<UriEncoded>
// {
//     /**
//      * Returns whether this path is empty, i.e. contains no path segments.
//      *
//      * @return {@code true} if this path is empty, {@code false} otherwise.
//      */
//     boolean isEmpty();
// 
//     /**
//      * Returns whether this path is absolute, i.e. starts with a "/".
//      *
//      * @return {@code true} if this path is absolute, {@code false} otherwise.
//      */
//     boolean isAbsolute();
// }
// 
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/Query.java
// public interface Query extends UriEncoded
// {
// 
//     /**
//      * Returns the encoded String representation of the query.
//      *
//      * @return A {@link String} representing the encoded query.
//      */
//     @Override
//     String toString();
// }
// 
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/Scheme.java
// public interface Scheme extends CharSequence
// {
//     @Override
//     String toString();
// }
// 
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/Uri.java
// public interface Uri
// {
//     /**
//      * Returns the {@link Optional} {@link Scheme} of the URI reference.
//      *
//      * @return An {@link Optional} {@link Scheme}.
//      */
//     Optional<? extends Scheme> scheme();
// 
//     /**
//      * Returns the {@link Optional} {@link Authority} of the URI reference.
//      *
//      * @return An {@link Optional} {@link Authority}.
//      */
//     Optional<? extends Authority> authority();
// 
//     /**
//      * Returns the {@link Path} of this URI reference.
//      *
//      * @return A {@link Path}. The path is always present, but may be empty.
//      */
//     Path path();
// 
//     /**
//      * Returns the {@link Optional} {@link Query} of the URI reference.
//      *
//      * @return An {@link Optional} {@link Query}.
//      */
//     Optional<? extends Query> query();
// 
//     /**
//      * Returns the {@link Optional} {@link Fragment} of the URI reference.
//      *
//      * @return An {@link Optional} {@link Fragment}.
//      */
//     Optional<? extends Fragment> fragment();
// 
//     /**
//      * Returns whether this URI reference is hierarchical.
//      *
//      * @return {@code true} if the URI is hierarchical, {@code false} otherwise.
//      */
//     boolean isHierarchical();
// 
//     /**
//      * Returns whether this URI reference is absolute, i.e. a URI. A URI reference is absolute if it has a scheme, otherwise it's a relative reference as per <a
//      * href="https://tools.ietf.org/html/rfc3986#section-4.2">RFC 3986, Section 4.2</a>
//      *
//      * @return {@code true} if the URI is absolute, {@code false} otherwise.
//      */
//     boolean isAbsolute();
// }
// 
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/paths/EmptyPath.java
// public final class EmptyPath implements Path
// {
//     public final static EmptyPath INSTANCE = new EmptyPath();
// 
// 
//     @Override
//     public boolean isEmpty()
//     {
//         return true;
//     }
// 
// 
//     @Override
//     public boolean isAbsolute()
//     {
//         return false;
//     }
// 
// 
//     @Override
//     public Iterator<UriEncoded> iterator()
//     {
//         return EmptyIterator.instance();
//     }
// 
// 
//     @Override
//     public int hashCode()
//     {
//         return 0;
//     }
// 
// 
//     @Override
//     public boolean equals(Object obj)
//     {
//         return obj instanceof Path && ((Path) obj).isEmpty();
//     }
// }


import org.dmfs.optional.Absent;
import org.dmfs.optional.Optional;
import org.dmfs.optional.Present;
import org.dmfs.rfc3986.Authority;
import org.dmfs.rfc3986.Fragment;
import org.dmfs.rfc3986.Path;
import org.dmfs.rfc3986.Query;
import org.dmfs.rfc3986.Scheme;
import org.dmfs.rfc3986.Uri;
import org.dmfs.rfc3986.paths.EmptyPath;
import static org.dmfs.optional.Absent.absent;
    public Path path()
    {
        return mPath;
    }


    @Override
    public Optional<? extends Query> query()
    {
        return mQuery;
    }


    @Override
    public Optional<? extends Fragment> fragment()
    {
        return mFragment;
    }


    @Override
    public boolean isHierarchical()
    {
        return true;
    }


    @Override
    public boolean isAbsolute()
    {
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/Authority.java
// public interface Authority
// {
//     /**
//      * Returns the {@link Optional} user info part of the authority in encoded form.
//      *
//      * @return The {@link UriEncoded} user info.
//      */
//     Optional<? extends UriEncoded> userInfo();
// 
//     /**
//      * Returns the host of this authority.
//      *
//      * @return The {@link UriEncoded} host.
//      */
//     UriEncoded host();
// 
//     /**
//      * The {@link Optional} port number.
//      *
//      * @return An {@link Optional} port number (as an {@link Integer}).
//      */
//     Optional<Integer> port();
// }
// 
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/Fragment.java
// public interface Fragment extends UriEncoded
// {
// 
//     /**
//      * Returns the encoded String representation of the fragment.
//      *
//      * @return A {@link String} representing the encoded fragment.
//      */
//     @Override
//     String toString();
// }
// 
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/Path.java
// public interface Path extends Iterable<UriEncoded>
// {
//     /**
//      * Returns whether this path is empty, i.e. contains no path segments.
//      *
//      * @return {@code true} if this path is empty, {@code false} otherwise.
//      */
//     boolean isEmpty();
// 
//     /**
//      * Returns whether this path is absolute, i.e. starts with a "/".
//      *
//      * @return {@code true} if this path is absolute, {@code false} otherwise.
//      */
//     boolean isAbsolute();
// }
// 
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/Query.java
// public interface Query extends UriEncoded
// {
// 
//     /**
//      * Returns the encoded String representation of the query.
//      *
//      * @return A {@link String} representing the encoded query.
//      */
//     @Override
//     String toString();
// }
// 
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/Scheme.java
// public interface Scheme extends CharSequence
// {
//     @Override
//     String toString();
// }
// 
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/Uri.java
// public interface Uri
// {
//     /**
//      * Returns the {@link Optional} {@link Scheme} of the URI reference.
//      *
//      * @return An {@link Optional} {@link Scheme}.
//      */
//     Optional<? extends Scheme> scheme();
// 
//     /**
//      * Returns the {@link Optional} {@link Authority} of the URI reference.
//      *
//      * @return An {@link Optional} {@link Authority}.
//      */
//     Optional<? extends Authority> authority();
// 
//     /**
//      * Returns the {@link Path} of this URI reference.
//      *
//      * @return A {@link Path}. The path is always present, but may be empty.
//      */
//     Path path();
// 
//     /**
//      * Returns the {@link Optional} {@link Query} of the URI reference.
//      *
//      * @return An {@link Optional} {@link Query}.
//      */
//     Optional<? extends Query> query();
// 
//     /**
//      * Returns the {@link Optional} {@link Fragment} of the URI reference.
//      *
//      * @return An {@link Optional} {@link Fragment}.
//      */
//     Optional<? extends Fragment> fragment();
// 
//     /**
//      * Returns whether this URI reference is hierarchical.
//      *
//      * @return {@code true} if the URI is hierarchical, {@code false} otherwise.
//      */
//     boolean isHierarchical();
// 
//     /**
//      * Returns whether this URI reference is absolute, i.e. a URI. A URI reference is absolute if it has a scheme, otherwise it's a relative reference as per <a
//      * href="https://tools.ietf.org/html/rfc3986#section-4.2">RFC 3986, Section 4.2</a>
//      *
//      * @return {@code true} if the URI is absolute, {@code false} otherwise.
//      */
//     boolean isAbsolute();
// }
// 
// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/paths/EmptyPath.java
// public final class EmptyPath implements Path
// {
//     public final static EmptyPath INSTANCE = new EmptyPath();
// 
// 
//     @Override
//     public boolean isEmpty()
//     {
//         return true;
//     }
// 
// 
//     @Override
//     public boolean isAbsolute()
//     {
//         return false;
//     }
// 
// 
//     @Override
//     public Iterator<UriEncoded> iterator()
//     {
//         return EmptyIterator.instance();
//     }
// 
// 
//     @Override
//     public int hashCode()
//     {
//         return 0;
//     }
// 
// 
//     @Override
//     public boolean equals(Object obj)
//     {
//         return obj instanceof Path && ((Path) obj).isEmpty();
//     }
// }


// Path: rfc3986-uri/src/main/java/org/dmfs/rfc3986/uris/RelativeUri.java
import org.dmfs.optional.Absent;
import org.dmfs.optional.Optional;
import org.dmfs.optional.Present;
import org.dmfs.rfc3986.Authority;
import org.dmfs.rfc3986.Fragment;
import org.dmfs.rfc3986.Path;
import org.dmfs.rfc3986.Query;
import org.dmfs.rfc3986.Scheme;
import org.dmfs.rfc3986.Uri;
import org.dmfs.rfc3986.paths.EmptyPath;
import static org.dmfs.optional.Absent.absent;

    public Path path()
    {
        return mPath;
    }


    @Override
    public Optional<? extends Query> query()
    {
        return mQuery;
    }


    @Override
    public Optional<? extends Fragment> fragment()
    {
        return mFragment;
    }


    @Override
    public boolean isHierarchical()
    {
        return true;
    }


    @Override
    public boolean isAbsolute()
    {
        return false;