docs: def LoadSecondaryConfig(self, filename=None, parser=None):
      """Loads an additional configuration file.
  
      The configuration system has the concept of a single Primary configuration
      file, and multiple secondary files. The primary configuration file is the
      main file that is used by the program. Any writebacks will only be made to
      the primary configuration file. Secondary files contain additional
      configuration data which will be merged into the configuration system.
  
      This method adds an additional configuration file.
  
      Args:
        filename: The configuration file that will be loaded. For example
             file:///etc/grr.conf or reg://HKEY_LOCAL_MACHINE/Software/GRR.
        parser: An optional parser can be given. In this case, the parser's data
          will be loaded directly.
  
      Returns:
        The parser used to parse this configuration source.
  
      Raises:
        ValueError: if both filename and parser arguments are None.
        ConfigFileNotFound: If a specified included file was not found.
  
      """
      if filename:
        # Maintain a stack of config file locations in loaded order.
        self.files.append(filename)
  
        parser_cls = self.GetParserFromFilename(filename)
        parser = parser_cls(filename=filename)
        logging.debug("Loading configuration from %s", filename)
        self.secondary_config_parsers.append(parser)
      elif parser is None:
        raise ValueError("Must provide either a filename or a parser.")
  
      clone = self.MakeNewConfig()
      clone.MergeData(parser.RawData())
      clone.initialized = True
  
      for file_to_load in clone["Config.includes"]:
        # We can not include a relative file from a config which does not have
        # path.
        if not os.path.isabs(file_to_load):
          if not filename:
            raise ConfigFileNotFound(
                "While loading %s: Unable to include a relative path (%s) "
                "from a config without a filename" % (filename, file_to_load))
  
          # If the included path is relative, we take it as relative to the
          # current path of the config.
          file_to_load = os.path.join(os.path.dirname(filename), file_to_load)
  
        clone_parser = clone.LoadSecondaryConfig(file_to_load)
        # If an include file is specified but it was not found, raise an error.
        if not clone_parser.parsed:
          raise ConfigFileNotFound(
              "Unable to load include file %s" % file_to_load)
  
      self.MergeData(clone.raw_data)
      self.files.extend(clone.files)
  
      return parser