// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/MarkdownElement.java
// public abstract class MarkdownElement implements MarkdownSerializable {
// 
//     private String serialized;
// 
//     /**
//      * Attempts to generate a String representing this markdown element.
//      *
//      * @return Markdown as String
//      * @throws MarkdownSerializationException If unable to generate a markdown String
//      */
//     public abstract String serialize() throws MarkdownSerializationException;
// 
//     /**
//      * Returns the result of {@link MarkdownElement#getSerialized()} or the specified fallback if a
//      * {@link MarkdownSerializationException} occurred.
//      *
//      * @param fallback String to return if serialization fails
//      * @return Markdown as String or specified fallback
//      */
//     public String getSerialized(String fallback) {
//         try {
//             return getSerialized();
//         } catch (MarkdownSerializationException e) {
//             return fallback;
//         }
//     }
// 
//     /**
//      * Calls {@link MarkdownElement#serialize()} or directly returns its last result from {@link
//      * MarkdownElement#serialized}.
//      *
//      * @return Markdown as String
//      * @throws MarkdownSerializationException If unable to generate a markdown String
//      */
//     public String getSerialized() throws MarkdownSerializationException {
//         if (serialized == null) {
//             serialized = serialize();
//         }
//         return serialized;
//     }
// 
//     public void setSerialized(String serialized) {
//         this.serialized = serialized;
//     }
// 
//     /**
//      * Sets {@link MarkdownElement#serialized} to null. The next call to {@link
//      * MarkdownElement#getSerialized()} fill invoke a fresh serialization.
//      */
//     public void invalidateSerialized() {
//         setSerialized(null);
//     }
// 
//     @Override
//     public MarkdownElement toMarkdownElement() throws MarkdownSerializationException {
//         return this;
//     }
// 
//     @Override
//     public String toString() {
//         return getSerialized(this.getClass().getSimpleName());
//     }
// 
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/util/StringUtil.java
// public abstract class StringUtil {
// 
//     public static String fillUpAligned(String value, String fill, int length, int alignment) {
//         switch (alignment) {
//             case Table.ALIGN_RIGHT: {
//                 return fillUpRightAligned(value, fill, length);
//             }
//             case Table.ALIGN_CENTER: {
//                 return fillUpCenterAligned(value, fill, length);
//             }
//             default: {
//                 return fillUpLeftAligned(value, fill, length);
//             }
//         }
//     }
// 
//     public static String fillUpLeftAligned(String value, String fill, int length) {
//         if (value.length() >= length) {
//             return value;
//         }
//         while (value.length() < length) {
//             value += fill;
//         }
//         return value;
//     }
// 
//     public static String fillUpRightAligned(String value, String fill, int length) {
//         if (value.length() >= length) {
//             return value;
//         }
//         while (value.length() < length) {
//             value = fill + value;
//         }
//         return value;
//     }
// 
//     public static String fillUpCenterAligned(String value, String fill, int length) {
//         if (value.length() >= length) {
//             return value;
//         }
//         boolean left = true;
//         while (value.length() < length) {
//             if (left) {
//                 value = fillUpLeftAligned(value, fill, value.length() + 1);
//             } else {
//                 value = fillUpRightAligned(value, fill, value.length() + 1);
//             }
//             left = !left;
//         }
//         return value;
//     }
// 
//     public static String surroundValueWith(String value, String surrounding) {
//         return surrounding + value + surrounding;
//     }
// 
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/util/StringUtil.java
// public static String surroundValueWith(String value, String surrounding) {
//     return surrounding + value + surrounding;
// }


import net.steppschuh.markdowngenerator.MarkdownElement;
import net.steppschuh.markdowngenerator.util.StringUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static net.steppschuh.markdowngenerator.util.StringUtil.surroundValueWith;
        this(rows);
        this.alignments = alignments;
    }

    @Override
    public String serialize() {
        Map<Integer, Integer> columnWidths = getColumnWidths(rows, minimumColumnWidth);

        StringBuilder sb = new StringBuilder();

        String headerSeparator = generateHeaderSeparator(columnWidths, alignments);
        boolean headerSeperatorAdded = !firstRowIsHeader;
        if (!firstRowIsHeader) {
            sb.append(headerSeparator).append(System.lineSeparator());
        }

        for (TableRow row : rows) {
            for (int columnIndex = 0; columnIndex < columnWidths.size(); columnIndex++) {
                sb.append(SEPARATOR);

                String value = "";
                if (row.getColumns().size() > columnIndex) {
                    Object valueObject = row.getColumns().get(columnIndex);
                    if (valueObject != null) {
                        value = valueObject.toString();
                    }
                }

                if (value.equals(trimmingIndicator)) {
                    value = StringUtil.fillUpLeftAligned(value, trimmingIndicator, columnWidths.get(columnIndex));
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/MarkdownElement.java
// public abstract class MarkdownElement implements MarkdownSerializable {
// 
//     private String serialized;
// 
//     /**
//      * Attempts to generate a String representing this markdown element.
//      *
//      * @return Markdown as String
//      * @throws MarkdownSerializationException If unable to generate a markdown String
//      */
//     public abstract String serialize() throws MarkdownSerializationException;
// 
//     /**
//      * Returns the result of {@link MarkdownElement#getSerialized()} or the specified fallback if a
//      * {@link MarkdownSerializationException} occurred.
//      *
//      * @param fallback String to return if serialization fails
//      * @return Markdown as String or specified fallback
//      */
//     public String getSerialized(String fallback) {
//         try {
//             return getSerialized();
//         } catch (MarkdownSerializationException e) {
//             return fallback;
//         }
//     }
// 
//     /**
//      * Calls {@link MarkdownElement#serialize()} or directly returns its last result from {@link
//      * MarkdownElement#serialized}.
//      *
//      * @return Markdown as String
//      * @throws MarkdownSerializationException If unable to generate a markdown String
//      */
//     public String getSerialized() throws MarkdownSerializationException {
//         if (serialized == null) {
//             serialized = serialize();
//         }
//         return serialized;
//     }
// 
//     public void setSerialized(String serialized) {
//         this.serialized = serialized;
//     }
// 
//     /**
//      * Sets {@link MarkdownElement#serialized} to null. The next call to {@link
//      * MarkdownElement#getSerialized()} fill invoke a fresh serialization.
//      */
//     public void invalidateSerialized() {
//         setSerialized(null);
//     }
// 
//     @Override
//     public MarkdownElement toMarkdownElement() throws MarkdownSerializationException {
//         return this;
//     }
// 
//     @Override
//     public String toString() {
//         return getSerialized(this.getClass().getSimpleName());
//     }
// 
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/util/StringUtil.java
// public abstract class StringUtil {
// 
//     public static String fillUpAligned(String value, String fill, int length, int alignment) {
//         switch (alignment) {
//             case Table.ALIGN_RIGHT: {
//                 return fillUpRightAligned(value, fill, length);
//             }
//             case Table.ALIGN_CENTER: {
//                 return fillUpCenterAligned(value, fill, length);
//             }
//             default: {
//                 return fillUpLeftAligned(value, fill, length);
//             }
//         }
//     }
// 
//     public static String fillUpLeftAligned(String value, String fill, int length) {
//         if (value.length() >= length) {
//             return value;
//         }
//         while (value.length() < length) {
//             value += fill;
//         }
//         return value;
//     }
// 
//     public static String fillUpRightAligned(String value, String fill, int length) {
//         if (value.length() >= length) {
//             return value;
//         }
//         while (value.length() < length) {
//             value = fill + value;
//         }
//         return value;
//     }
// 
//     public static String fillUpCenterAligned(String value, String fill, int length) {
//         if (value.length() >= length) {
//             return value;
//         }
//         boolean left = true;
//         while (value.length() < length) {
//             if (left) {
//                 value = fillUpLeftAligned(value, fill, value.length() + 1);
//             } else {
//                 value = fillUpRightAligned(value, fill, value.length() + 1);
//             }
//             left = !left;
//         }
//         return value;
//     }
// 
//     public static String surroundValueWith(String value, String surrounding) {
//         return surrounding + value + surrounding;
//     }
// 
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/util/StringUtil.java
// public static String surroundValueWith(String value, String surrounding) {
//     return surrounding + value + surrounding;
// }


// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/table/Table.java
import net.steppschuh.markdowngenerator.MarkdownElement;
import net.steppschuh.markdowngenerator.util.StringUtil;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static net.steppschuh.markdowngenerator.util.StringUtil.surroundValueWith;

        this(rows);
        this.alignments = alignments;
    }

    @Override
    public String serialize() {
        Map<Integer, Integer> columnWidths = getColumnWidths(rows, minimumColumnWidth);

        StringBuilder sb = new StringBuilder();

        String headerSeparator = generateHeaderSeparator(columnWidths, alignments);
        boolean headerSeperatorAdded = !firstRowIsHeader;
        if (!firstRowIsHeader) {
            sb.append(headerSeparator).append(System.lineSeparator());
        }

        for (TableRow row : rows) {
            for (int columnIndex = 0; columnIndex < columnWidths.size(); columnIndex++) {
                sb.append(SEPARATOR);

                String value = "";
                if (row.getColumns().size() > columnIndex) {
                    Object valueObject = row.getColumns().get(columnIndex);
                    if (valueObject != null) {
                        value = valueObject.toString();
                    }
                }

                if (value.equals(trimmingIndicator)) {
                    value = StringUtil.fillUpLeftAligned(value, trimmingIndicator, columnWidths.get(columnIndex));
                    value = surroundValueWith(value, WHITESPACE);