public <T extends SymbolServer> T newSymbolServer(String symbolServerLocationString,
			SymbolServerInstanceCreatorContext symbolServerInstanceCreatorContext,
			Class<T> expectedSymbolServerClass) {
		if (symbolServerLocationString == null || symbolServerLocationString.isBlank()) {
			return null;
		}
		for (SymbolServerInstanceCreatorInfo symbolServerInstanceCreatorInfo : symbolServerInstanceCreatorsByPriority
				.values()) {
			if (symbolServerInstanceCreatorInfo.getLocationStringMatcher()
					.test(symbolServerLocationString)) {
				SymbolServer result =
					symbolServerInstanceCreatorInfo.getSymbolServerInstanceCreator()
							.createSymbolServerFromLocationString(
								symbolServerLocationString, symbolServerInstanceCreatorContext);
				if (result == null) {
					return null;
				}
				if (!expectedSymbolServerClass.isInstance(result)) {
					Msg.debug(this, "SymbolServer location unexpected class type.  Wanted " +
						expectedSymbolServerClass.getName() + ", got " +
						result.getClass().getName());
					return null;
				}
				return expectedSymbolServerClass.cast(result);
			}
		}
		Msg.debug(SymbolServerService.class,
			"Symbol server location [" + symbolServerLocationString + "] not valid, skipping.");
		return null;
	}
Creates a new SymbolServer instance, using the registered SymbolServer types.

@param symbolServerLocationString SymbolServer location - see {@link SymbolServer#getName()}
@param symbolServerInstanceCreatorContext a {@link SymbolServerInstanceCreatorContext} 
- see {@link #getContext()}
@param expectedSymbolServerClass expected class of the new symbol server being created
@return new SymbolServer instance, or null if bad location string
Ghidra/Features/PDB/src/main/java/pdb/symbolserver/SymbolServerInstanceCreatorRegistry.java