<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def generate_config_index(defaults: Dict[str, str], base_dir=None) -> Dict[str, Path]: """ Determines where existing info can be found in the system, and creates a corresponding data dict that can be written to index.json in the baseDataDir. The information in the files defined by the config index is information required by the API itself and nothing else - labware definitions, feature flags, robot configurations. It does not include configuration files that relate to the rest of the system, such as network description file definitions. :param defaults: A dict of defaults to write, useful for specifying part (but not all) of the index succinctly. This is used both when loading a configuration file from disk and when generating a new one. :param base_dir: If specified, a base path used if this function has to generate defaults. If not specified, falls back to :py:attr:`CONFIG_BASE_DIR` :returns: The config object """

    base = Path(base_dir) if base_dir else infer_config_base_dir()

    def parse_or_default(
            ce: ConfigElement, val: Optional[str]) -> Path:
        if not val:
            return base / Path(ce.default)
        else:
            return Path(val)

    return {
        ce.name: parse_or_default(ce,
                                  defaults.get(ce.name))
        for ce in CONFIG_ELEMENTS
    }