// Path: gcodeparser/src/main/java/com/rvantwisk/gcodeparser/gcodes/GCodeGroups.java
// public enum GCodeGroups {
// 
//     ActivePlane,
//     AxisOffset,
//     CollantMode,
//     CoordinateSystemMode,
//     CutterLengthCompMode,
//     CutterRadiusCompMode,
//     DistanceMode,
//     FeedRateMode,
//     MotionsModes,
//     PathControleMode,
//     PredefinedPosition,
//     ReferenceLocation,
//     RetrackMode,
//     SFOverrideMode,
//     SpindleMode,
//     StopModes,
//     Units;
// 
// 
// 
// }
// 
// Path: gcodeparser/src/main/java/com/rvantwisk/gcodeparser/gcodes/ModalGrouping.java
// public final class ModalGrouping {
// 
//     public static final Map<GCodeGroups, Set<String>> groupToModals;
//     public static final Map<String, GCodeGroups> modalToGroup;
// 
//     static {
//         HashMap<GCodeGroups, Set<String>> gGroups = new HashMap<>();
//         HashMap<String, GCodeGroups> mGroups = new HashMap<>();
// 
//         // Add all model sets
//         gGroups.put(GCodeGroups.ActivePlane,  toStringSet(ActivePlane.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.AxisOffset, toStringSet(AxisOffset.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.CollantMode,  toStringSet(CollantMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.CoordinateSystemMode, toStringSet(CoordinateSystemMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.CutterLengthCompMode,  toStringSet(CutterLengthCompMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.CutterRadiusCompMode, toStringSet(CutterRadiusCompMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.DistanceMode,  toStringSet(DistanceMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.FeedRateMode, toStringSet(FeedRateMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.MotionsModes,  toStringSet(MotionMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.PathControleMode, toStringSet(PathControleMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.PredefinedPosition,  toStringSet(PredefinedPosition.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.ReferenceLocation, toStringSet(ReferenceLocation.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.RetrackMode, toStringSet(RetrackMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.SFOverrideMode, toStringSet(SFOverrideMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.SpindleMode, toStringSet(SpindleMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.StopModes, toStringSet(StopModes.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.Units, toStringSet(Units.class.getEnumConstants()));
// 
//         // Create a modal to group map
//         for (Map.Entry<GCodeGroups, Set<String>> group : gGroups.entrySet()) {
//             for (String modals : group.getValue()) {
//                 mGroups.put(modals, group.getKey());
//             }
//         }
// 
//         //
//         groupToModals = Collections.unmodifiableMap(gGroups);
//         modalToGroup = Collections.unmodifiableMap(mGroups);
//     }
// 
//     /**
//      * Return the group belonging to a modal word
//      * @param word
//      * @return
//      */
//     static public GCodeGroups whatGroup(final String word) {
//         return modalToGroup.get(word);
//     }
// 
//     private static <T> Set<String> toStringSet(T[] enumClass) {
//         final Set<String> stringSet = new HashSet<>();
//         for (T code : enumClass) {
//             stringSet.add(code.toString());
//         }
//         return stringSet;
//     }
// 
// }


import com.rvantwisk.gcodeparser.gcodes.GCodeGroups;
import com.rvantwisk.gcodeparser.gcodes.ModalGrouping;
import java.util.*;
                ParsedWord word = block.get(axis.toString());
                machineOffsets.put(axis, word.value);
            }
        }
    }

    private void setAxis(final Map<String, ParsedWord> block) {
        for (Axis axis : Axis.values()) {
            if (block.containsKey(axis.toString())) {
                ParsedWord word = block.get(axis.toString());
                // Handle absolute cordinate position (G0 and G1 only)
                if (modals.contains("G53")) {
                    machineCoordinates.put(axis, word.value);
                } else {
                    // Handle relative distance mode
                    if (modals.contains("G90")) {
                        machineCoordinates.put(axis, machineOffsets.get(axis) + word.value);
                    } else {
                        machineCoordinates.put(axis, machineCoordinates.get(axis) + word.value);
                    }
                }
            }
        }
    }

    private void setModals(final Map<String, ParsedWord> block) {
        for (ParsedWord word : block.values()) {
            if (word.word.equals("G") || word.word.equals("M")) {

                // Find the modal group and remove all modals if found
// Path: gcodeparser/src/main/java/com/rvantwisk/gcodeparser/gcodes/GCodeGroups.java
// public enum GCodeGroups {
// 
//     ActivePlane,
//     AxisOffset,
//     CollantMode,
//     CoordinateSystemMode,
//     CutterLengthCompMode,
//     CutterRadiusCompMode,
//     DistanceMode,
//     FeedRateMode,
//     MotionsModes,
//     PathControleMode,
//     PredefinedPosition,
//     ReferenceLocation,
//     RetrackMode,
//     SFOverrideMode,
//     SpindleMode,
//     StopModes,
//     Units;
// 
// 
// 
// }
// 
// Path: gcodeparser/src/main/java/com/rvantwisk/gcodeparser/gcodes/ModalGrouping.java
// public final class ModalGrouping {
// 
//     public static final Map<GCodeGroups, Set<String>> groupToModals;
//     public static final Map<String, GCodeGroups> modalToGroup;
// 
//     static {
//         HashMap<GCodeGroups, Set<String>> gGroups = new HashMap<>();
//         HashMap<String, GCodeGroups> mGroups = new HashMap<>();
// 
//         // Add all model sets
//         gGroups.put(GCodeGroups.ActivePlane,  toStringSet(ActivePlane.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.AxisOffset, toStringSet(AxisOffset.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.CollantMode,  toStringSet(CollantMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.CoordinateSystemMode, toStringSet(CoordinateSystemMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.CutterLengthCompMode,  toStringSet(CutterLengthCompMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.CutterRadiusCompMode, toStringSet(CutterRadiusCompMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.DistanceMode,  toStringSet(DistanceMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.FeedRateMode, toStringSet(FeedRateMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.MotionsModes,  toStringSet(MotionMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.PathControleMode, toStringSet(PathControleMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.PredefinedPosition,  toStringSet(PredefinedPosition.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.ReferenceLocation, toStringSet(ReferenceLocation.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.RetrackMode, toStringSet(RetrackMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.SFOverrideMode, toStringSet(SFOverrideMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.SpindleMode, toStringSet(SpindleMode.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.StopModes, toStringSet(StopModes.class.getEnumConstants()));
//         gGroups.put(GCodeGroups.Units, toStringSet(Units.class.getEnumConstants()));
// 
//         // Create a modal to group map
//         for (Map.Entry<GCodeGroups, Set<String>> group : gGroups.entrySet()) {
//             for (String modals : group.getValue()) {
//                 mGroups.put(modals, group.getKey());
//             }
//         }
// 
//         //
//         groupToModals = Collections.unmodifiableMap(gGroups);
//         modalToGroup = Collections.unmodifiableMap(mGroups);
//     }
// 
//     /**
//      * Return the group belonging to a modal word
//      * @param word
//      * @return
//      */
//     static public GCodeGroups whatGroup(final String word) {
//         return modalToGroup.get(word);
//     }
// 
//     private static <T> Set<String> toStringSet(T[] enumClass) {
//         final Set<String> stringSet = new HashSet<>();
//         for (T code : enumClass) {
//             stringSet.add(code.toString());
//         }
//         return stringSet;
//     }
// 
// }


// Path: gcodeparser/src/main/java/com/rvantwisk/gcodeparser/MachineStatus.java
import com.rvantwisk.gcodeparser.gcodes.GCodeGroups;
import com.rvantwisk.gcodeparser.gcodes.ModalGrouping;
import java.util.*;

                ParsedWord word = block.get(axis.toString());
                machineOffsets.put(axis, word.value);
            }
        }
    }

    private void setAxis(final Map<String, ParsedWord> block) {
        for (Axis axis : Axis.values()) {
            if (block.containsKey(axis.toString())) {
                ParsedWord word = block.get(axis.toString());
                // Handle absolute cordinate position (G0 and G1 only)
                if (modals.contains("G53")) {
                    machineCoordinates.put(axis, word.value);
                } else {
                    // Handle relative distance mode
                    if (modals.contains("G90")) {
                        machineCoordinates.put(axis, machineOffsets.get(axis) + word.value);
                    } else {
                        machineCoordinates.put(axis, machineCoordinates.get(axis) + word.value);
                    }
                }
            }
        }
    }

    private void setModals(final Map<String, ParsedWord> block) {
        for (ParsedWord word : block.values()) {
            if (word.word.equals("G") || word.word.equals("M")) {

                // Find the modal group and remove all modals if found
                GCodeGroups thisGroup = ModalGrouping.whatGroup(word.parsed);