// 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;
        //     float  max_y           4 bytes 
        // which totals 28 bytes

        byte[] signature = new byte[4];
        try { stream.getBytes(signature, 4); } catch (Exception e)
        {
            fprintf(stderr,"ERROR (LASquadtree): reading LASspatial signature\n");
            return FALSE;
        }
        if (strncmp(stringFromByteArray(signature), "LASS", 4) != 0)
        {
            fprintf(stderr,"ERROR (LASquadtree): wrong LASspatial signature %4s instead of 'LASS'\n", stringFromByteArray(signature));
            return FALSE;
        }
        int type;
        try { type = stream.get32bitsLE(); } catch (Exception e)
        {
            fprintf(stderr,"ERROR (LASquadtree): reading LASspatial type\n");
            return FALSE;
        }
        if (type != LAS_SPATIAL_QUAD_TREE)
        {
            fprintf(stderr,"ERROR (LASquadtree): unknown LASspatial type %d\n", type);
            return FALSE;
        }
        try { stream.getBytes(signature, 4); } catch (Exception e)
        {
            fprintf(stderr,"ERROR (LASquadtree): reading signature\n");
            return FALSE;
        }
// 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;

        //     float  max_y           4 bytes 
        // which totals 28 bytes

        byte[] signature = new byte[4];
        try { stream.getBytes(signature, 4); } catch (Exception e)
        {
            fprintf(stderr,"ERROR (LASquadtree): reading LASspatial signature\n");
            return FALSE;
        }
        if (strncmp(stringFromByteArray(signature), "LASS", 4) != 0)
        {
            fprintf(stderr,"ERROR (LASquadtree): wrong LASspatial signature %4s instead of 'LASS'\n", stringFromByteArray(signature));
            return FALSE;
        }
        int type;
        try { type = stream.get32bitsLE(); } catch (Exception e)
        {
            fprintf(stderr,"ERROR (LASquadtree): reading LASspatial type\n");
            return FALSE;
        }
        if (type != LAS_SPATIAL_QUAD_TREE)
        {
            fprintf(stderr,"ERROR (LASquadtree): unknown LASspatial type %d\n", type);
            return FALSE;
        }
        try { stream.getBytes(signature, 4); } catch (Exception e)
        {
            fprintf(stderr,"ERROR (LASquadtree): reading signature\n");
            return FALSE;
        }
        if (strncmp(stringFromByteArray(signature), "LASQ", 4) != 0)