// Path: src/main/java/org/laborra/beantrace/BeanTraceException.java
// public class BeanTraceException extends RuntimeException {
//     public BeanTraceException(Throwable cause) {
//         super(cause);
//     }
// }
// 
// Path: src/main/java/org/laborra/beantrace/model/Attribute.java
// public class Attribute<T> {
//     private String name;
//     private T value;
// 
//     public Attribute(String name, T value) {
//         this.name = name;
//         this.value = value;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public T getValue() {
//         return value;
//     }
// }
// 
// Path: src/main/java/org/laborra/beantrace/model/Edge.java
// public class Edge {
//     private String name;
//     private Vertex to;
// 
//     public Edge(String name, Vertex to) {
//         this.name = name;
//         this.to = to;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public Vertex getTo() {
//         return to;
//     }
// }
// 
// Path: src/main/java/org/laborra/beantrace/model/Vertex.java
// public class Vertex {
//     private Class<?> clazz;
//     private String id;
//     private Set<Edge> references = new HashSet<>();
//     private Set<Attribute> attributes = new HashSet<>();
// 
//     public Vertex(Class<?> clazz, String id) {
//         this(clazz, id, new HashSet<Edge>(), new HashSet<Attribute>());
//     }
// 
//     public Vertex(Class<?> clazz, String id, Set<Edge> references, Set<Attribute> attributes) {
//         this.id = id;
//         this.clazz = clazz;
//         this.references = references;
//         this.attributes = attributes;
//     }
// 
//     public Set<Edge> getReferences() {
//         return references;
//     }
// 
//     public Set<Attribute> getAttributes() {
//         return attributes;
//     }
// 
//     public Class<?> getClazz() {
//         return clazz;
//     }
// 
//     public String getId() {
//         return id;
//     }
// }


import org.laborra.beantrace.BeanTraceException;
import org.laborra.beantrace.model.Attribute;
import org.laborra.beantrace.model.Edge;
import org.laborra.beantrace.model.Vertex;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.HashSet;
import java.util.Set;
                    depth + 1,
                    (k == references.size() + attributes.size() ? "`-- " : "|-- ") + reference.getName() + " : "
            );
            k++;
        }

        output.flush();
    }

    private void indent(int depth, Appendable appendable) throws IOException {
        for (int i=0; i<depth; i++) {
            appendable.append("   ");
        }
    }

    /**
     * Appendable configuration
     */
    public static class Config {

        /**
         * Where the renderer should write the ASCII graph. Default to {@link System#out}.
         */
        private Writer writer = new PrintWriter(System.out);

        /**
         * Whether or not to print the object identifier.
         */
        private boolean printId = false;

// Path: src/main/java/org/laborra/beantrace/BeanTraceException.java
// public class BeanTraceException extends RuntimeException {
//     public BeanTraceException(Throwable cause) {
//         super(cause);
//     }
// }
// 
// Path: src/main/java/org/laborra/beantrace/model/Attribute.java
// public class Attribute<T> {
//     private String name;
//     private T value;
// 
//     public Attribute(String name, T value) {
//         this.name = name;
//         this.value = value;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public T getValue() {
//         return value;
//     }
// }
// 
// Path: src/main/java/org/laborra/beantrace/model/Edge.java
// public class Edge {
//     private String name;
//     private Vertex to;
// 
//     public Edge(String name, Vertex to) {
//         this.name = name;
//         this.to = to;
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public Vertex getTo() {
//         return to;
//     }
// }
// 
// Path: src/main/java/org/laborra/beantrace/model/Vertex.java
// public class Vertex {
//     private Class<?> clazz;
//     private String id;
//     private Set<Edge> references = new HashSet<>();
//     private Set<Attribute> attributes = new HashSet<>();
// 
//     public Vertex(Class<?> clazz, String id) {
//         this(clazz, id, new HashSet<Edge>(), new HashSet<Attribute>());
//     }
// 
//     public Vertex(Class<?> clazz, String id, Set<Edge> references, Set<Attribute> attributes) {
//         this.id = id;
//         this.clazz = clazz;
//         this.references = references;
//         this.attributes = attributes;
//     }
// 
//     public Set<Edge> getReferences() {
//         return references;
//     }
// 
//     public Set<Attribute> getAttributes() {
//         return attributes;
//     }
// 
//     public Class<?> getClazz() {
//         return clazz;
//     }
// 
//     public String getId() {
//         return id;
//     }
// }


// Path: src/main/java/org/laborra/beantrace/renderers/AsciiRenderer.java
import org.laborra.beantrace.BeanTraceException;
import org.laborra.beantrace.model.Attribute;
import org.laborra.beantrace.model.Edge;
import org.laborra.beantrace.model.Vertex;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.util.HashSet;
import java.util.Set;

                    depth + 1,
                    (k == references.size() + attributes.size() ? "`-- " : "|-- ") + reference.getName() + " : "
            );
            k++;
        }

        output.flush();
    }

    private void indent(int depth, Appendable appendable) throws IOException {
        for (int i=0; i<depth; i++) {
            appendable.append("   ");
        }
    }

    /**
     * Appendable configuration
     */
    public static class Config {

        /**
         * Where the renderer should write the ASCII graph. Default to {@link System#out}.
         */
        private Writer writer = new PrintWriter(System.out);

        /**
         * Whether or not to print the object identifier.
         */
        private boolean printId = false;

        public boolean isPrintId() {