docs: private void addRequiredFixFiles(File installRoot, Set<String> absPathsForLibertyContent, Collection<FeatureResource> fixes) {
          //Filter the fix xmls, and add the ones required.
          //has to be last thing done to absPath set, as it uses the total set of files being kept so far to determine which
          //xmls to keep.
          for (FeatureResource fixFile : fixes) {
              //if fixFile isnt xml.. add anyways.. (if we don't understand it, we better keep it)
              //if fixFile IS xml, then we need to make sense of it.
              /*
               * <fix>
               * <updates>
               * <file hash="sha1hash" id="path under installroot"/>
               * </updates>
               * </fix>
               * 
               * if any file in updates exists in our current set of paths-to-keep
               * AND said file has the same SHA1
               * THEN keep xml.
               * else (if no files exist, or all that did had different sha1's)
               * discard xml.
               */
              String fixFileLoc = fixFile.getLocation();
              //convert fix loc back to absolute.. featureResources use relative to wlp root.
              File f = new File(installRoot, fixFileLoc);
              String absFixFileLoc = f.getAbsolutePath();
              if (fixFileLoc.regionMatches(true, fixFileLoc.length() - 4, ".xml", 0, 4)) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Evaluating fix xml " + fixFileLoc);
                  }
                  try {
                      DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                      Document d = db.parse(f);
                      NodeList fl = d.getChildNodes();
                      for (int x = 0; x < fl.getLength(); x++) {
                          Node fn = fl.item(x);
                          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                              Tr.debug(tc, "n.getNodeName(" + x + ")" + fn.getNodeName() + " element?" + (fn instanceof Element));
                          }
                          if ((fn instanceof Element) && "fix".equals(fn.getNodeName())) {
                              NodeList nl = fn.getChildNodes();
                              for (int i = 0; i < nl.getLength(); i++) {
                                  Node n = nl.item(i);
                                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                                      Tr.debug(tc, "n.getNodeName(" + i + ")" + n.getNodeName() + " element?" + (n instanceof Element));
                                  }
                                  if ((n instanceof Element) && "updates".equals(n.getNodeName())) {
                                      NodeList files = n.getChildNodes();
                                      for (int j = 0; j < files.getLength(); j++) {
                                          Node o = files.item(j);
                                          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                                              Tr.debug(tc, "o.getNodeName(" + j + ")" + o.getNodeName() + " element?" + (o instanceof Element));
                                          }
                                          if ((o instanceof Element) && "file".equals(o.getNodeName())) {
                                              Element eo = (Element) o;
                                              String oName = eo.getAttribute("id");
                                              String oHash = eo.getAttribute("hash");
  
                                              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                                                  Tr.debug(tc, "eo.getNodeName()" + eo.getNodeName() + " oName:" + oName + " oHash:" + oHash);
                                              }
  
                                              File testFile = new File(installRoot, oName);
                                              if (FileUtils.fileExists(testFile)) {
                                                  String tHash = HashUtils.getFileMD5String(testFile);
                                                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                                                      Tr.debug(tc, "tHash:" + tHash);
                                                  }
                                                  if (oHash.equals(tHash)) {
                                                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                                                          Tr.debug(tc, "Keeping fix xml due to hash match" + fixFileLoc);
                                                      }
                                                      absPathsForLibertyContent.add(absFixFileLoc);
                                                      break;
                                                  }
                                              }
                                          }
                                      }
                                      break;
                                  }
                              }
                          }
                      }
                  } catch (ParserConfigurationException e) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "Unable to parse file " + fixFileLoc + " due to parser config error, file will be kept regardless");
                      }
                      //error? add the file anyways.. 
                      absPathsForLibertyContent.add(absFixFileLoc);
                  } catch (SAXException e) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "Unable to parse file " + fixFileLoc + " due to sax error, file will be kept regardless");
                      }
                      //error? add the file anyways.. 
                      absPathsForLibertyContent.add(absFixFileLoc);
                  } catch (IOException e) {
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                          Tr.debug(tc, "Unable to parse file " + fixFileLoc + " due to io error, file will be kept regardless");
                      }
                      //error? add the file anyways.. 
                      absPathsForLibertyContent.add(absFixFileLoc);
                  }
              } else {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) {
                      Tr.debug(tc, "Unable to parse file " + fixFileLoc + " not xml, file will be kept regardless");
                  }
                  //not an xml file? add the file anyways.. 
                  absPathsForLibertyContent.add(absFixFileLoc);
              }
          }
      }