// Path: src/main/java/uk/org/okapibarcode/backend/Ean.java
// protected static char calcDigit(String s) {
// 
//     int count = 0;
//     int p = 0;
// 
//     for (int i = s.length() - 1; i >= 0; i--) {
//         int c = Character.getNumericValue(s.charAt(i));
//         if (p % 2 == 0) {
//             c = c * 3;
//         }
//         count += c;
//         p++;
//     }
// 
//     int cdigit = 10 - (count % 10);
//     if (cdigit == 10) {
//         cdigit = 0;
//     }
// 
//     return (char) (cdigit + '0');
// }
// 
// Path: src/main/java/uk/org/okapibarcode/backend/Ean.java
// protected static String validateAndPad(String s, int targetLength) {
// 
//     if (!s.matches("[0-9]+")) {
//         throw new OkapiException("Invalid characters in input");
//     }
// 
//     if (s.length() > targetLength) {
//         throw new OkapiException("Input data too long");
//     }
// 
//     if (s.length() < targetLength) {
//         for (int i = s.length(); i < targetLength; i++) {
//             s = '0' + s;
//         }
//     }
// 
//     return s;
// }


import static uk.org.okapibarcode.backend.Ean.calcDigit;
import static uk.org.okapibarcode.backend.Ean.validateAndPad;
import static uk.org.okapibarcode.backend.HumanReadableLocation.BOTTOM;
import static uk.org.okapibarcode.backend.HumanReadableLocation.NONE;
import static uk.org.okapibarcode.backend.HumanReadableLocation.TOP;
import java.awt.geom.Rectangle2D;
import java.util.Arrays;
            upca();
        } else {
            upce();
        }
    }

    private void separateContent() {
        int splitPoint = content.indexOf('+');
        if (splitPoint == -1) {
            // there is no add-on data
            addOn = null;
        } else if (splitPoint == content.length() - 1) {
            // we found the add-on separator, but no add-on data
            throw new OkapiException("Invalid add-on data");
        } else {
            // there is a '+' in the input data, use an add-on EAN2 or EAN5
            addOn = new EanUpcAddOn();
            addOn.font = this.font;
            addOn.fontName = this.fontName;
            addOn.fontSize = this.fontSize;
            addOn.humanReadableLocation = (this.humanReadableLocation == NONE ? NONE : TOP);
            addOn.moduleWidth = this.moduleWidth;
            addOn.default_height = this.default_height + this.guardPatternExtraHeight - 8;
            addOn.setContent(content.substring(splitPoint + 1));
            content = content.substring(0, splitPoint);
        }
    }

    private void upca() {

// Path: src/main/java/uk/org/okapibarcode/backend/Ean.java
// protected static char calcDigit(String s) {
// 
//     int count = 0;
//     int p = 0;
// 
//     for (int i = s.length() - 1; i >= 0; i--) {
//         int c = Character.getNumericValue(s.charAt(i));
//         if (p % 2 == 0) {
//             c = c * 3;
//         }
//         count += c;
//         p++;
//     }
// 
//     int cdigit = 10 - (count % 10);
//     if (cdigit == 10) {
//         cdigit = 0;
//     }
// 
//     return (char) (cdigit + '0');
// }
// 
// Path: src/main/java/uk/org/okapibarcode/backend/Ean.java
// protected static String validateAndPad(String s, int targetLength) {
// 
//     if (!s.matches("[0-9]+")) {
//         throw new OkapiException("Invalid characters in input");
//     }
// 
//     if (s.length() > targetLength) {
//         throw new OkapiException("Input data too long");
//     }
// 
//     if (s.length() < targetLength) {
//         for (int i = s.length(); i < targetLength; i++) {
//             s = '0' + s;
//         }
//     }
// 
//     return s;
// }


// Path: src/main/java/uk/org/okapibarcode/backend/Upc.java
import static uk.org.okapibarcode.backend.Ean.calcDigit;
import static uk.org.okapibarcode.backend.Ean.validateAndPad;
import static uk.org.okapibarcode.backend.HumanReadableLocation.BOTTOM;
import static uk.org.okapibarcode.backend.HumanReadableLocation.NONE;
import static uk.org.okapibarcode.backend.HumanReadableLocation.TOP;
import java.awt.geom.Rectangle2D;
import java.util.Arrays;

            upca();
        } else {
            upce();
        }
    }

    private void separateContent() {
        int splitPoint = content.indexOf('+');
        if (splitPoint == -1) {
            // there is no add-on data
            addOn = null;
        } else if (splitPoint == content.length() - 1) {
            // we found the add-on separator, but no add-on data
            throw new OkapiException("Invalid add-on data");
        } else {
            // there is a '+' in the input data, use an add-on EAN2 or EAN5
            addOn = new EanUpcAddOn();
            addOn.font = this.font;
            addOn.fontName = this.fontName;
            addOn.fontSize = this.fontSize;
            addOn.humanReadableLocation = (this.humanReadableLocation == NONE ? NONE : TOP);
            addOn.moduleWidth = this.moduleWidth;
            addOn.default_height = this.default_height + this.guardPatternExtraHeight - 8;
            addOn.setContent(content.substring(splitPoint + 1));
            content = content.substring(0, splitPoint);
        }
    }

    private void upca() {

        content = validateAndPad(content, 11);