```python
def merge_settings(base: dict, ours: dict, theirs: dict) -> dict:
    if not all(isinstance(k, str) and isinstance(v, str) for k, v in base.items()):
        raise ValueError("base must be a flat mapping of string values")
    if not all(isinstance(k, str) and isinstance(v, str) for k, v in ours.items()):
        raise ValueError("ours must be a flat mapping of string values")
    if not all(isinstance(k, str) and isinstance(v, str) for k, v in theirs.items()):
        raise ValueError("theirs must be a flat mapping of string values")

    merged = {}
    for key in base:
        if key in ours and key in theirs:
            if ours[key] == theirs[key]:
                merged[key] = ours[key]
            else:
                merged[key] = ours[key] if ours[key] != "" else theirs[key]
        elif key in ours:
            merged[key] = ours[key]
        elif key in theirs:
            merged[key] = theirs[key]
        else:
            merged[key] = ""

    for key in ours:
        if key not in base or ours[key] != base[key]:
            merged[key] = ours[key]

    for key in theirs:
        if key not in base or theirs[key] != base[key]:
            merged[key] = theirs[key]

    return merged
```