<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def __match_signature_tree(self, signature_tree, data, depth = 0):
 """Recursive function to find matches along the signature tree. signature_tree is the part of the tree left to walk data is the data being checked against the signature tree depth keeps track of how far we have gone down the tree """



        matched_names = list ()
        match = signature_tree

        # Walk the bytes in the data and match them
        # against the signature
        #
        for idx, byte in enumerate ( [b if isinstance(b, int) else ord(b) for b in data] ):

            # If the tree is exhausted...
            #
            if match is None :
                break

            # Get the next byte in the tree
            #
            match_next = match.get(byte, None)


            # If None is among the values for the key
            # it means that a signature in the database
            # ends here and that there's an exact match.
            #
            if None in list(match.values()):
                # idx represent how deep we are in the tree
                #
                #names = [idx+depth]
                names = list()

                # For each of the item pairs we check
                # if it has an element other than None,
                # if not then we have an exact signature
                #
                for item in list(match.items()):
                    if item[1] is None :
                        names.append (item[0])
                matched_names.append(names)

            # If a wildcard is found keep scanning the signature
            # ignoring the byte.
            #
            if '??' in match :
                match_tree_alternate = match.get ('??', None)
                data_remaining = data[idx + 1 :]
                if data_remaining:
                    matched_names.extend(
                        self.__match_signature_tree(
                            match_tree_alternate, data_remaining, idx+depth+1))

            match = match_next

        # If we have any more packer name in the end of the signature tree
        # add them to the matches
        #
        if match is not None and None in list(match.values()):
            #names = [idx + depth + 1]
            names = list()
            for item in list(match.items()) :
                if item[1] is None:
                    names.append(item[0])
            matched_names.append(names)

        return matched_names