private void finalizeAllVxtParentage() {

		// Now consolidate virtual indirects (can we use some of what is in MsftVxtManager in the
		//  future (move the node stuff to VxtManager)?

		PNode vbtChildToParentRoot = new PNode(null);
		PNode vbtParentToChildRoot = new PNode(null);
		PNode vftChildToParentRoot = new PNode(null);
		PNode vftParentToChildRoot = new PNode(null);
		PNode childToParentNode;
		PNode parentToChildNode;

		for (VxtPtrInfo info : finalVftPtrInfoByOffset.values()) {
			List<ClassID> parentage = info.parentage();
			childToParentNode = vftChildToParentRoot;
			parentToChildNode = vftParentToChildRoot;
			for (ClassID id : parentage) {
				String name = id.getSymbolPath().toString();
				childToParentNode.incrementPathCount();
				childToParentNode = childToParentNode.getOrAddBranch(name);
			}
			for (ClassID id : parentage.reversed()) {
				String name = id.getSymbolPath().toString();
				parentToChildNode.incrementPathCount();
				parentToChildNode = parentToChildNode.getOrAddBranch(name);
			}
		}
		for (VxtPtrInfo info : finalVbtPtrInfoByOffset.values()) {
			List<ClassID> parentage = info.parentage();
			childToParentNode = vbtChildToParentRoot;
			parentToChildNode = vbtParentToChildRoot;
			for (ClassID id : parentage) {
				String name = id.getSymbolPath().toString();
				childToParentNode.incrementPathCount();
				childToParentNode = childToParentNode.getOrAddBranch(name);
			}
			for (ClassID id : parentage.reversed()) {
				String name = id.getSymbolPath().toString();
				parentToChildNode.incrementPathCount();
				parentToChildNode = parentToChildNode.getOrAddBranch(name);
			}
		}

		StringBuilder builder = new StringBuilder();
		Map<String, String> results = new TreeMap<>();
		for (VxtPtrInfo info : finalVftPtrInfoByOffset.values()) {
			List<ClassID> altParentage =
				finalizeVxtPtrParentage(vftChildToParentRoot, vftParentToChildRoot, info);
			String name = ClassUtils.getSpecialVxTableName(info.finalOffset);
			String result = dumpVxtPtrResult("vft", info, altParentage.reversed());
			builder.append(result + "\n");
			results.put(name, result);

		}
		for (VxtPtrInfo info : finalVbtPtrInfoByOffset.values()) {
			List<ClassID> altParentage =
				finalizeVxtPtrParentage(vbtChildToParentRoot, vbtParentToChildRoot, info);
			String name = ClassUtils.getSpecialVxTableName(info.finalOffset);
			String result = dumpVxtPtrResult("vbt", info, altParentage.reversed());
			builder.append(result + "\n");
			results.put(name, result);
		}
		if (!builder.isEmpty()) {
			builder.insert(0, String.format("Class: %s\n", getSymbolPath().toString()));
		}
		summarizedClassVxtPtrInfo = builder.toString();
		vxtPtrSummary = results;
	}
Determines final parentage information for each vxt.  This information includes full
parentage as well as a shortened version similar to the MSFT mangled scheme  (results not
100%... needs more work)
Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/CppCompositeType.java