# Path: appAux.py
# def loadFile(file_fullpath, max_chunk_size = 0):
#     """Abstracts loading a regular file and a file from within a zip archive.
#     Args:
#         file_fullpath (str): Full path to file to load
#         max_chunk_size (int): maximum number of bytes to be read from the file
#     Returns:
#         file_pointer (StringIO): Data read from fileFullPath
#     """
#     global zipCache
#     global zipCache_hits
#     global zipCache_misses
#     logger.debug("Loading file %s" % file_fullpath)
#     if ".zip/" in file_fullpath:
#         m = re.match(r'^((?:.*)\.zip)[\\/](.*)$', file_fullpath)
#         if m:
#             zip_container = m.group(1)
#             if m.lastindex > 1:
#                 file_fullpath_unprocessed = m.group(2)
#                 if '.zip' in file_fullpath_unprocessed:
#                     m = re.match(r'^(.*)(?:\.zip[\\/](.*))*$', file_fullpath_unprocessed)
#                     if m:
#                         zip_container_relative_path = m.group(1)
#                         if m.lastindex > 1:
#                             file_fullpath_unprocessed = m.group(2)
#                         else:
#                             file_fullpath_unprocessed = None
#                     else:
#                         logger.error("Issue extracting container and relative path from ZIP file: %s" % file_fullpath)
#                 else:
#                     zip_container_relative_path = file_fullpath_unprocessed
# 
#                 # If not in the zipCache we add it
#             if zip_container not in zipCache:
#                 zipCache_misses +=1
#                 if zipfile.is_zipfile(loadFile(zip_container)):
#                     zipCache[zip_container] = zipfile.ZipFile(loadFile(zip_container))
#                 else:
#                     logger.error("Invalid ZIP file found: %s" % file_fullpath)
#                     return None
#             else:
#                 zipCache_hits += 1
#                 # print("ZipCache hits / misses: %d/%d" % (zipCache_hits, zipCache_misses))
# 
#             # Extract file_pointer from zip:
#             file_pointer = StringIO(zipCache[zip_container].read(zip_container_relative_path))
#             if max_chunk_size != 0:
#                 file_pointer = StringIO(file_pointer.read(max_chunk_size))
# 
#         else:
#             logger.error("Issue extracting container and relative path from ZIP file: %s" % file_fullpath)
#     else:
#             # Extract file_pointer:
#             input_file = open(file_fullpath, 'rb')
#             if max_chunk_size == 0:
#                 file_pointer = StringIO(input_file.read())
#             else: file_pointer = StringIO(input_file.read(max_chunk_size))
#     assert(file_pointer is not None)
# 
#     logger.debug("Read %d bytes [%s]" % (getFileSize(file_pointer), toHex(file_pointer.read(20))))
#     # Return file pointer to pos 0
#     file_pointer.seek(0, 0)
# 
#     return file_pointer


import settings
import logging
import xml.etree.ElementTree as ET
import hashlib
import ntpath
import sys, traceback
import os
    import xml.etree.cElementTree as etree
    import xml.etree.ElementTree as etree
from ingest import Ingest
from appAux import loadFile
from datetime import datetime
                        return True
            except Exception:
                logger.warning("[%s] Failed to parse XML for: %s" % (self.ingest_type, file_name_fullpath))
            finally:
                file_object.close()

        return False

    def calculateID(self, file_name_fullpath):
        # Get the creation date for the first PersistenceItem in the audit (they will all be the same)
        instanceID = datetime.min
        tmp_instanceID = None

        try:
            file_object = loadFile(file_name_fullpath)
            root = ET.parse(file_object).getroot()
            file_object.close()
            reg_key = root.find('AppCompatItemExtended')
            reg_modified = reg_key.get('created')
            try:
                tmp_instanceID = datetime.strptime(reg_modified, "%Y-%m-%dT%H:%M:%SZ")
            except ValueError as e:
                tmp_instanceID = datetime.max
                logger.warning("Invalid reg_modified date found!: %s (%s)" % (reg_modified, file_name_fullpath))
            instanceID = tmp_instanceID
        except Exception:
            traceback.print_exc(file=sys.stdout)

        # If we found no PersistenceItem date we go with plan B (but most probably this is corrupt and will fail later)
        if instanceID is None:

# Path: appAux.py
# def loadFile(file_fullpath, max_chunk_size = 0):
#     """Abstracts loading a regular file and a file from within a zip archive.
#     Args:
#         file_fullpath (str): Full path to file to load
#         max_chunk_size (int): maximum number of bytes to be read from the file
#     Returns:
#         file_pointer (StringIO): Data read from fileFullPath
#     """
#     global zipCache
#     global zipCache_hits
#     global zipCache_misses
#     logger.debug("Loading file %s" % file_fullpath)
#     if ".zip/" in file_fullpath:
#         m = re.match(r'^((?:.*)\.zip)[\\/](.*)$', file_fullpath)
#         if m:
#             zip_container = m.group(1)
#             if m.lastindex > 1:
#                 file_fullpath_unprocessed = m.group(2)
#                 if '.zip' in file_fullpath_unprocessed:
#                     m = re.match(r'^(.*)(?:\.zip[\\/](.*))*$', file_fullpath_unprocessed)
#                     if m:
#                         zip_container_relative_path = m.group(1)
#                         if m.lastindex > 1:
#                             file_fullpath_unprocessed = m.group(2)
#                         else:
#                             file_fullpath_unprocessed = None
#                     else:
#                         logger.error("Issue extracting container and relative path from ZIP file: %s" % file_fullpath)
#                 else:
#                     zip_container_relative_path = file_fullpath_unprocessed
# 
#                 # If not in the zipCache we add it
#             if zip_container not in zipCache:
#                 zipCache_misses +=1
#                 if zipfile.is_zipfile(loadFile(zip_container)):
#                     zipCache[zip_container] = zipfile.ZipFile(loadFile(zip_container))
#                 else:
#                     logger.error("Invalid ZIP file found: %s" % file_fullpath)
#                     return None
#             else:
#                 zipCache_hits += 1
#                 # print("ZipCache hits / misses: %d/%d" % (zipCache_hits, zipCache_misses))
# 
#             # Extract file_pointer from zip:
#             file_pointer = StringIO(zipCache[zip_container].read(zip_container_relative_path))
#             if max_chunk_size != 0:
#                 file_pointer = StringIO(file_pointer.read(max_chunk_size))
# 
#         else:
#             logger.error("Issue extracting container and relative path from ZIP file: %s" % file_fullpath)
#     else:
#             # Extract file_pointer:
#             input_file = open(file_fullpath, 'rb')
#             if max_chunk_size == 0:
#                 file_pointer = StringIO(input_file.read())
#             else: file_pointer = StringIO(input_file.read(max_chunk_size))
#     assert(file_pointer is not None)
# 
#     logger.debug("Read %d bytes [%s]" % (getFileSize(file_pointer), toHex(file_pointer.read(20))))
#     # Return file pointer to pos 0
#     file_pointer.seek(0, 0)
# 
#     return file_pointer


# Path: Ingest/appcompat_mirlua_v2.py
import settings
import logging
import xml.etree.ElementTree as ET
import hashlib
import ntpath
import sys, traceback
import os
    import xml.etree.cElementTree as etree
    import xml.etree.ElementTree as etree
from ingest import Ingest
from appAux import loadFile
from datetime import datetime

                        return True
            except Exception:
                logger.warning("[%s] Failed to parse XML for: %s" % (self.ingest_type, file_name_fullpath))
            finally:
                file_object.close()

        return False

    def calculateID(self, file_name_fullpath):
        # Get the creation date for the first PersistenceItem in the audit (they will all be the same)
        instanceID = datetime.min
        tmp_instanceID = None

        try:
            file_object = loadFile(file_name_fullpath)
            root = ET.parse(file_object).getroot()
            file_object.close()
            reg_key = root.find('AppCompatItemExtended')
            reg_modified = reg_key.get('created')
            try:
                tmp_instanceID = datetime.strptime(reg_modified, "%Y-%m-%dT%H:%M:%SZ")
            except ValueError as e:
                tmp_instanceID = datetime.max
                logger.warning("Invalid reg_modified date found!: %s (%s)" % (reg_modified, file_name_fullpath))
            instanceID = tmp_instanceID
        except Exception:
            traceback.print_exc(file=sys.stdout)

        # If we found no PersistenceItem date we go with plan B (but most probably this is corrupt and will fail later)
        if instanceID is None:

            file_object = loadFile(file_name_fullpath)