// Path: copybook4java/src/main/java/com/nordea/oss/ByteUtils.java
// public class ByteUtils {
// 
//     public static boolean allEquals(byte[] array, byte value, int offset, int maxLength) {
//         maxLength = Math.min(offset + maxLength, array.length);
//         for(int i = offset; i < maxLength; i++) {
//             if(array[i] != value) {
//                 return false;
//             }
//         }
//         return true;
//     }
// 
//     public static int indexOf(byte[] array, byte needle, int offset, int maxLength) {
//         int result = -1;
//         maxLength = Math.min(offset + maxLength, array.length);
//         for(int i = offset; i < maxLength; i++) {
//             if(array[i] == needle) {
//                 result = i;
//                 break;
//             }
//         }
//         return result;
//     }
// 
//     public static byte[] trim(byte[] src, byte padding, boolean right, int minLength) {
//         if(src.length < minLength) {
//             throw new RuntimeException("src array is smaller than minLength: " + src.length + " < " + minLength);
//         }
//         if(right) {
//             int offset;
//             for (offset = src.length - 1; offset > minLength - 1; offset--) {  // [44, 32]
//                 if(padding != src[offset]) {
//                     break;
//                 }
//             }
//             if(offset < 0) {
//                 return new byte[0];
//             } else if (offset < src.length - 1){
//                 return Arrays.copyOfRange(src, 0, offset + 1);
//             }
// 
//         } else {
//             int offset;
//             for (offset = 0; offset < src.length - minLength; offset++) {
//                 if(padding != src[offset]) {
//                     break;
//                 }
//             }
//             if(offset == src.length) {
//                 return new byte[0];
//             } else if(offset > 0) {
//                 return Arrays.copyOfRange(src, offset, src.length);
//             }
//         }
// 
//         return src;
//     }
// 
//     public static byte[] toByteArray(InputStream inputStream) throws IOException {
//         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 
//         byte[] buf = new byte[8192];
//         while(true) {
//             int r = inputStream.read(buf);
//             if(r == -1) {
//                 break;
//             }
//             outputStream.write(buf, 0, r);
//         }
// 
//         return outputStream.toByteArray();
//     }
// }
// 
// Path: copybook4java/src/main/java/com/nordea/oss/copybook/exceptions/CopyBookException.java
// public class CopyBookException extends RuntimeException {
//     private static final long serialVersionUID = 28118369047109260L;
//     public CopyBookException(String message) {
//         super(message);
//     }
// 
//     public CopyBookException(String message, TypeConverterException ex) {
//         super(message + ": " + ex.getClass().getSimpleName() + " :" + ex.getMessage());
//     }
// 
//     public CopyBookException(String message, Exception ex) {
//         super(message + ": " + ex.getClass().getSimpleName() + " :" + ex.getMessage());
//     }
// }


import com.nordea.oss.ByteUtils;
import com.nordea.oss.copybook.exceptions.CopyBookException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.List;
            /* TODO: Calculate the number of set bits with bit masking and Long.numberOfTrailingZeros as this should be quicker
            String befor = debugBitmap(this.bitmapBytes, 0, 8);

            ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
            buffer.put(this.bitmapBytes);
            buffer.flip();//need flip
            long stuff = buffer.getLong();

            long mask = (Long.MAX_VALUE >> bitmapIndex - 1) & (Long.MAX_VALUE << (bitmapSize * 8 - bitmapIndex - maxOccurs));
            long num2 =  stuff & mask;
            long size2 = num2 > 0 ? 8 * 8 - Long.numberOfTrailingZeros(num2) - bitmapIndex : 0;

            long num3 = (stuff >> (8*8 - (bitmapIndex + maxOccurs))) & (Long.MAX_VALUE >> (8*8 - (bitmapIndex + maxOccurs)));
            long size3 = maxOccurs - Long.numberOfTrailingZeros(num3);


            ByteBuffer buffer2 = ByteBuffer.allocate(Long.BYTES);
            buffer2.putLong(num3);
            byte[] testbytes = buffer2.array();
            String after = debugBitmap(testbytes, 0, 8);
            */

            return size;
        }

        public byte[] get(int maxLength, boolean separator) {
            byte[] byteValue = null;
            if (getBitInBitmap(this.bitmapBytes, this.bitmapIndex, this.bitmapSize)) {
                if (separator) {

// Path: copybook4java/src/main/java/com/nordea/oss/ByteUtils.java
// public class ByteUtils {
// 
//     public static boolean allEquals(byte[] array, byte value, int offset, int maxLength) {
//         maxLength = Math.min(offset + maxLength, array.length);
//         for(int i = offset; i < maxLength; i++) {
//             if(array[i] != value) {
//                 return false;
//             }
//         }
//         return true;
//     }
// 
//     public static int indexOf(byte[] array, byte needle, int offset, int maxLength) {
//         int result = -1;
//         maxLength = Math.min(offset + maxLength, array.length);
//         for(int i = offset; i < maxLength; i++) {
//             if(array[i] == needle) {
//                 result = i;
//                 break;
//             }
//         }
//         return result;
//     }
// 
//     public static byte[] trim(byte[] src, byte padding, boolean right, int minLength) {
//         if(src.length < minLength) {
//             throw new RuntimeException("src array is smaller than minLength: " + src.length + " < " + minLength);
//         }
//         if(right) {
//             int offset;
//             for (offset = src.length - 1; offset > minLength - 1; offset--) {  // [44, 32]
//                 if(padding != src[offset]) {
//                     break;
//                 }
//             }
//             if(offset < 0) {
//                 return new byte[0];
//             } else if (offset < src.length - 1){
//                 return Arrays.copyOfRange(src, 0, offset + 1);
//             }
// 
//         } else {
//             int offset;
//             for (offset = 0; offset < src.length - minLength; offset++) {
//                 if(padding != src[offset]) {
//                     break;
//                 }
//             }
//             if(offset == src.length) {
//                 return new byte[0];
//             } else if(offset > 0) {
//                 return Arrays.copyOfRange(src, offset, src.length);
//             }
//         }
// 
//         return src;
//     }
// 
//     public static byte[] toByteArray(InputStream inputStream) throws IOException {
//         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 
//         byte[] buf = new byte[8192];
//         while(true) {
//             int r = inputStream.read(buf);
//             if(r == -1) {
//                 break;
//             }
//             outputStream.write(buf, 0, r);
//         }
// 
//         return outputStream.toByteArray();
//     }
// }
// 
// Path: copybook4java/src/main/java/com/nordea/oss/copybook/exceptions/CopyBookException.java
// public class CopyBookException extends RuntimeException {
//     private static final long serialVersionUID = 28118369047109260L;
//     public CopyBookException(String message) {
//         super(message);
//     }
// 
//     public CopyBookException(String message, TypeConverterException ex) {
//         super(message + ": " + ex.getClass().getSimpleName() + " :" + ex.getMessage());
//     }
// 
//     public CopyBookException(String message, Exception ex) {
//         super(message + ": " + ex.getClass().getSimpleName() + " :" + ex.getMessage());
//     }
// }


// Path: copybook4java/src/main/java/com/nordea/oss/copybook/serializers/PackedFirstLevelMapper.java
import com.nordea.oss.ByteUtils;
import com.nordea.oss.copybook.exceptions.CopyBookException;
import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.List;

            /* TODO: Calculate the number of set bits with bit masking and Long.numberOfTrailingZeros as this should be quicker
            String befor = debugBitmap(this.bitmapBytes, 0, 8);

            ByteBuffer buffer = ByteBuffer.allocate(Long.BYTES);
            buffer.put(this.bitmapBytes);
            buffer.flip();//need flip
            long stuff = buffer.getLong();

            long mask = (Long.MAX_VALUE >> bitmapIndex - 1) & (Long.MAX_VALUE << (bitmapSize * 8 - bitmapIndex - maxOccurs));
            long num2 =  stuff & mask;
            long size2 = num2 > 0 ? 8 * 8 - Long.numberOfTrailingZeros(num2) - bitmapIndex : 0;

            long num3 = (stuff >> (8*8 - (bitmapIndex + maxOccurs))) & (Long.MAX_VALUE >> (8*8 - (bitmapIndex + maxOccurs)));
            long size3 = maxOccurs - Long.numberOfTrailingZeros(num3);


            ByteBuffer buffer2 = ByteBuffer.allocate(Long.BYTES);
            buffer2.putLong(num3);
            byte[] testbytes = buffer2.array();
            String after = debugBitmap(testbytes, 0, 8);
            */

            return size;
        }

        public byte[] get(int maxLength, boolean separator) {
            byte[] byteValue = null;
            if (getBitInBitmap(this.bitmapBytes, this.bitmapIndex, this.bitmapSize)) {
                if (separator) {

                    int index = ByteUtils.indexOf(this.buffer.array(), this.separatorByte, this.buffer.position() + 1, maxLength);