'Manages processing of raw data from the artifact collection.
The raw data and parsed results are stored in different result contexts:
Anomaly, Parser and Raw. Demuxing these results makes the specific data
types available to checks working in different contexts.
Then, iterate over the parsers that should be applied to the raw data and
map rdfvalues to the Parse context.
Args:
artifact_name: The name of the artifact being processed as a string.
responses: Input from previous states as an rdfvalue.Dict'

def _RunProcessors(self, artifact_name, responses):

    source = responses.request_data.GetItem('source', None)
    processors = parsers.Parser.GetClassesByArtifact(artifact_name)
    saved_responses = {}
    for response in responses:
        if processors:
            for processor_cls in processors:
                processor = processor_cls()
                if processor.process_together:
                    processor_name = processor.__class__.__name__
                    saved_responses.setdefault(processor_name, []).append(response)
                else:
                    self._ProcessData(processor, response, artifact_name, source)
    for (processor_name, responses_list) in saved_responses.items():
        processor = parsers.Parser.classes[processor_name]()
        self._ProcessData(processor, responses_list, artifact_name, source)
