'This method returns a dict with commands that we need
for mach-o patching'

def find_Needed_Items(self, theCmds):

    _tempDict = {}
    text_segment = {}
    text_section = {}
    LC_MAIN = {}
    LC_UNIXTREAD = {}
    LC_CODE_SIGNATURE = {}
    LC_DYLIB_CODE_SIGN_DRS = {}
    locationInFIle = 0
    last_cmd = 0
    for item in theCmds:
        locationInFIle = item['LOCInFIle']
        if ((item['DATA'][0:6] == '__TEXT') and (item['Command'] == 1)):
            text_segment = {'segname': item['DATA'][0:16], 'VMAddress': item['DATA'][16:20], 'VMSize': item['DATA'][20:24], 'File    Offset': item['DATA'][24:28], 'File    Size': item['DATA'][28:32], 'MaxVMProt': item['DATA'][32:36], 'InitalVMProt': item['DATA'][36:40], 'NumberOfSections': item['DATA'][40:44], 'Flags': item['DATA'][44:48]}
            count = struct.unpack('<I', text_segment['NumberOfSections'])[0]
            i = 0
            while (count > 0):
                if ('__text' in item['DATA'][(48 + i):(64 + i)]):
                    text_section = {'sectionName': item['DATA'][(48 + i):(64 + i)], 'segmentName': item['DATA'][(64 + i):(80 + i)], 'Address': item['DATA'][(80 + i):(84 + i)], 'LOCAddress': ((locationInFIle + 80) + i), 'Size': item['DATA'][(84 + i):(88 + i)], 'LOCTextSize': ((locationInFIle + 84) + i), 'Offset': item['DATA'][(88 + i):(92 + i)], 'LocTextOffset': ((locationInFIle + 88) + i), 'Alignment': item['DATA'][(92 + i):(96 + i)], 'Relocations': item['DATA'][(96 + i):(100 + i)], 'NumberOfRelocs': item['DATA'][(100 + i):(104 + i)], 'Flags': item['DATA'][(104 + i):(108 + i)], 'Reserved1': item['DATA'][(108 + i):(112 + i)], 'Reserved2': item['DATA'][(112 + i):(116 + i)]}
                    break
                else:
                    count -= 1
                    i += 64
        elif ((item['DATA'][0:6] == '__TEXT') and (item['Command'] == 25)):
            text_segment = {'segname': item['DATA'][0:16], 'VMAddress': item['DATA'][16:24], 'VMSize': item['DATA'][24:32], 'File    Offset': item['DATA'][32:40], 'File    Size': item['DATA'][40:48], 'MaxVMProt': item['DATA'][48:52], 'InitalVMProt': item['DATA'][52:56], 'NumberOfSections': item['DATA'][56:60], 'Flags': item['DATA'][60:64]}
            count = struct.unpack('<I', text_segment['NumberOfSections'])[0]
            i = 0
            while (count > 0):
                if ('__text' in item['DATA'][(64 + i):(80 + i)]):
                    text_section = {'sectionName': item['DATA'][(64 + i):(80 + i)], 'segmentName': item['DATA'][(80 + i):(96 + i)], 'Address': item['DATA'][(96 + i):(104 + i)], 'LOCAddress': ((locationInFIle + 96) + i), 'Size': item['DATA'][(104 + i):(112 + i)], 'LOCTextSize': ((locationInFIle + 104) + i), 'Offset': item['DATA'][(112 + i):(116 + i)], 'LocTextOffset': ((locationInFIle + 112) + i), 'Alignment': item['DATA'][(116 + i):(120 + i)], 'Relocations': item['DATA'][(120 + i):(124 + i)], 'NumberOfRelocs': item['DATA'][(124 + i):(128 + i)], 'Flags': item['DATA'][(128 + i):(132 + i)], 'Reserved1': item['DATA'][(132 + i):(136 + i)], 'Reserved2': item['DATA'][(136 + i):(140 + i)], 'Reserved3': item['DATA'][(140 + i):(144 + i)]}
                    break
                else:
                    count -= 1
                    i += 76
        if (item['Command'] == 2147483688):
            LC_MAIN = {'LOCEntryOffset': locationInFIle, 'EntryOffset': item['DATA'][0:8], 'StackSize': item['DATA'][8:22]}
        elif ((item['Command'] == 5) and (struct.unpack('<I', item['DATA'][0:4])[0] == 1)):
            LC_UNIXTREAD = {'LOCEntryOffset': locationInFIle, 'Flavor': item['DATA'][0:4], 'Count': item['DATA'][4:8], 'eax': item['DATA'][8:12], 'ebx': item['DATA'][12:16], 'ecx': item['DATA'][16:20], 'edx': item['DATA'][20:24], 'edi': item['DATA'][24:28], 'esi': item['DATA'][28:32], 'ebp': item['DATA'][32:36], 'esp': item['DATA'][36:40], 'ss': item['DATA'][40:44], 'eflags': item['DATA'][44:48], 'LOCeip': (locationInFIle + 48), 'eip': item['DATA'][48:52], 'cs': item['DATA'][52:56], 'ds': item['DATA'][56:60], 'es': item['DATA'][60:64], 'fs': item['DATA'][64:68], 'gs': item['DATA'][68:72]}
        elif ((item['Command'] == 5) and (struct.unpack('<I', item['DATA'][0:4])[0] == 4)):
            LC_UNIXTREAD = {'LOCEntryOffset': locationInFIle, 'Flavor': item['DATA'][0:4], 'Count': item['DATA'][4:8], 'rax': item['DATA'][8:16], 'rbx': item['DATA'][16:24], 'rcx': item['DATA'][24:32], 'rdx': item['DATA'][32:40], 'rdi': item['DATA'][40:48], 'rsi': item['DATA'][48:56], 'rbp': item['DATA'][56:64], 'rsp': item['DATA'][64:72], 'r8': item['DATA'][72:80], 'r9': item['DATA'][80:88], 'r10': item['DATA'][88:96], 'r11': item['DATA'][96:104], 'r12': item['DATA'][104:112], 'r13': item['DATA'][112:120], 'r14': item['DATA'][120:128], 'r15': item['DATA'][128:136], 'LOCrip': (locationInFIle + 136), 'rip': item['DATA'][136:144], 'rflags': item['DATA'][144:152], 'cs': item['DATA'][152:160], 'fs': item['DATA'][160:168], 'gs': item['DATA'][168:176]}
        if (item['Command'] == 29):
            LC_CODE_SIGNATURE = {'Data    Offset': item['DATA'][0:4], 'Data    Size': item['DATA'][0:8]}
        if (item['Command'] == 43):
            LC_DYLIB_CODE_SIGN_DRS = {'Data    Offset': item['DATA'][0:4], 'Data    Size': item['DATA'][0:8]}
        if (item['last_cmd'] > last_cmd):
            last_cmd = item['last_cmd']
    _tempDict = {'text_segment': text_segment, 'text_section': text_section, 'LC_MAIN': LC_MAIN, 'LC_UNIXTREAD': LC_UNIXTREAD, 'LC_CODE_SIGNATURE': LC_CODE_SIGNATURE, 'LC_DYLIB_CODE_SIGN_DRS': LC_DYLIB_CODE_SIGN_DRS, 'last_cmd': last_cmd}
    return _tempDict
