// Path: src/main/java/com/github/mreutegg/laszip4j/clib/Cstdio.java
// public static void fprintf(PrintStream ps, String msg, Object... args) {
//     ps.printf(msg, args);
// }
// 
// Path: src/main/java/com/github/mreutegg/laszip4j/clib/Cstring.java
// public static int strncmp(String s1, String s2, int num) {
//     s1 = trim(s1);
//     s2 = trim(s2);
//     if (s1.length() > num) {
//         s1 = s1.substring(0, num);
//     }
//     if (s2.length() > num) {
//         s2 = s2.substring(0, num);
//     }
//     return s1.compareTo(s2);
// }
// 
// Path: src/main/java/com/github/mreutegg/laszip4j/laszip/MyDefs.java
// static int U32_QUANTIZE(double n) {
//     return ((n) >= 0) ? (int)((n)+0.5f) : 0;
// }
// 
// Path: src/main/java/com/github/mreutegg/laszip4j/laszip/MyDefs.java
// static byte[] asByteArray(char[] chars) {
//     return asByteArray(new String(chars));
// }
// 
// Path: src/main/java/com/github/mreutegg/laszip4j/laszip/MyDefs.java
// static int[] realloc(int[] data, int size) {
//     if (data.length >= size) {
//         return data;
//     }
//     int[] tmp = new int[size];
//     System.arraycopy(data, 0, tmp, 0, data.length);
//     return tmp;
// }
// 
// Path: src/main/java/com/github/mreutegg/laszip4j/laszip/MyDefs.java
// static String stringFromByteArray(byte[] bytes) {
//     int idx = -1;
//     for (int i = 0; i < bytes.length; i++) {
//         if (bytes[i] == '\0') {
//             idx = i;
//             break;
//         }
//     }
//     try {
//         if (idx != -1) {
//             return new String(bytes, 0, idx, "US-ASCII");
//         } else {
//             return new String(bytes, "US-ASCII");
//         }
//     } catch (UnsupportedEncodingException e) {
//         throw new RuntimeException(e);
//     }
// }


import java.io.PrintStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import static com.github.mreutegg.laszip4j.clib.Cstdio.fprintf;
import static com.github.mreutegg.laszip4j.clib.Cstring.strncmp;
import static com.github.mreutegg.laszip4j.laszip.MyDefs.U32_QUANTIZE;
import static com.github.mreutegg.laszip4j.laszip.MyDefs.asByteArray;
import static com.github.mreutegg.laszip4j.laszip.MyDefs.realloc;
import static com.github.mreutegg.laszip4j.laszip.MyDefs.stringFromByteArray;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import static java.lang.Float.floatToIntBits;
import static java.lang.Float.intBitsToFloat;
        if (adaptive != null)
        {
            current_cell = current_cells.get(next_cell_index);
        }
        else
        {
            current_cell = level_offset[levels] + current_cells.get(next_cell_index);
        }
        next_cell_index++;
        return TRUE;
    }

    public boolean setup(double bb_min_x, double bb_max_x, double bb_min_y, double bb_max_y, float cell_size)
    {
        this.cell_size = cell_size;
        this.sub_level = 0;
        this.sub_level_index = 0;

        // enlarge bounding box to units of cells
        if (bb_min_x >= 0) min_x = cell_size*((int)(bb_min_x/cell_size));
        else min_x = cell_size*((int)(bb_min_x/cell_size)-1);
        if (bb_max_x >= 0) max_x = cell_size*((int)(bb_max_x/cell_size)+1);
        else max_x = cell_size*((int)(bb_max_x/cell_size));
        if (bb_min_y >= 0) min_y = cell_size*((int)(bb_min_y/cell_size));
        else min_y = cell_size*((int)(bb_min_y/cell_size)-1);
        if (bb_max_y >= 0) max_y = cell_size*((int)(bb_max_y/cell_size)+1);
        else max_y = cell_size*((int)(bb_max_y/cell_size));

        // how many cells minimally in each direction
        cells_x = U32_QUANTIZE((max_x - min_x)/cell_size);
// Path: src/main/java/com/github/mreutegg/laszip4j/clib/Cstdio.java
// public static void fprintf(PrintStream ps, String msg, Object... args) {
//     ps.printf(msg, args);
// }
// 
// Path: src/main/java/com/github/mreutegg/laszip4j/clib/Cstring.java
// public static int strncmp(String s1, String s2, int num) {
//     s1 = trim(s1);
//     s2 = trim(s2);
//     if (s1.length() > num) {
//         s1 = s1.substring(0, num);
//     }
//     if (s2.length() > num) {
//         s2 = s2.substring(0, num);
//     }
//     return s1.compareTo(s2);
// }
// 
// Path: src/main/java/com/github/mreutegg/laszip4j/laszip/MyDefs.java
// static int U32_QUANTIZE(double n) {
//     return ((n) >= 0) ? (int)((n)+0.5f) : 0;
// }
// 
// Path: src/main/java/com/github/mreutegg/laszip4j/laszip/MyDefs.java
// static byte[] asByteArray(char[] chars) {
//     return asByteArray(new String(chars));
// }
// 
// Path: src/main/java/com/github/mreutegg/laszip4j/laszip/MyDefs.java
// static int[] realloc(int[] data, int size) {
//     if (data.length >= size) {
//         return data;
//     }
//     int[] tmp = new int[size];
//     System.arraycopy(data, 0, tmp, 0, data.length);
//     return tmp;
// }
// 
// Path: src/main/java/com/github/mreutegg/laszip4j/laszip/MyDefs.java
// static String stringFromByteArray(byte[] bytes) {
//     int idx = -1;
//     for (int i = 0; i < bytes.length; i++) {
//         if (bytes[i] == '\0') {
//             idx = i;
//             break;
//         }
//     }
//     try {
//         if (idx != -1) {
//             return new String(bytes, 0, idx, "US-ASCII");
//         } else {
//             return new String(bytes, "US-ASCII");
//         }
//     } catch (UnsupportedEncodingException e) {
//         throw new RuntimeException(e);
//     }
// }


// Path: src/main/java/com/github/mreutegg/laszip4j/laszip/LASquadtree.java
import java.io.PrintStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import static com.github.mreutegg.laszip4j.clib.Cstdio.fprintf;
import static com.github.mreutegg.laszip4j.clib.Cstring.strncmp;
import static com.github.mreutegg.laszip4j.laszip.MyDefs.U32_QUANTIZE;
import static com.github.mreutegg.laszip4j.laszip.MyDefs.asByteArray;
import static com.github.mreutegg.laszip4j.laszip.MyDefs.realloc;
import static com.github.mreutegg.laszip4j.laszip.MyDefs.stringFromByteArray;
import static java.lang.Boolean.FALSE;
import static java.lang.Boolean.TRUE;
import static java.lang.Float.floatToIntBits;
import static java.lang.Float.intBitsToFloat;

        if (adaptive != null)
        {
            current_cell = current_cells.get(next_cell_index);
        }
        else
        {
            current_cell = level_offset[levels] + current_cells.get(next_cell_index);
        }
        next_cell_index++;
        return TRUE;
    }

    public boolean setup(double bb_min_x, double bb_max_x, double bb_min_y, double bb_max_y, float cell_size)
    {
        this.cell_size = cell_size;
        this.sub_level = 0;
        this.sub_level_index = 0;

        // enlarge bounding box to units of cells
        if (bb_min_x >= 0) min_x = cell_size*((int)(bb_min_x/cell_size));
        else min_x = cell_size*((int)(bb_min_x/cell_size)-1);
        if (bb_max_x >= 0) max_x = cell_size*((int)(bb_max_x/cell_size)+1);
        else max_x = cell_size*((int)(bb_max_x/cell_size));
        if (bb_min_y >= 0) min_y = cell_size*((int)(bb_min_y/cell_size));
        else min_y = cell_size*((int)(bb_min_y/cell_size)-1);
        if (bb_max_y >= 0) max_y = cell_size*((int)(bb_max_y/cell_size)+1);
        else max_y = cell_size*((int)(bb_max_y/cell_size));

        // how many cells minimally in each direction
        cells_x = U32_QUANTIZE((max_x - min_x)/cell_size);
        cells_y = U32_QUANTIZE((max_y - min_y)/cell_size);