private ProgramDB filloutSharedNotepadProgram(ToyProgramBuilder builder) throws Exception {

		// functions
		Function function =
			builder.createEmptyFunction("entry", "0x1006420", 396, new Undefined1DataType());

		// structures
		Structure intStruct = new StructureDataType("IntStruct", 0);
		intStruct.add(new ByteDataType(), "field0", "");
		intStruct.add(new WordDataType());
		intStruct.add(new DWordDataType());
		intStruct.add(new QWordDataType());
		intStruct.setCategoryPath(new CategoryPath("/Category1/Category2/Category3"));

		builder.addDataType(intStruct);

		Structure dllTable = new StructureDataType("DLL_Table", 0);
		dllTable.add(new StringDataType(), 13, "COMDLG32", "");
		dllTable.add(new StringDataType(), 12, "SHELL32", "");
		dllTable.add(new StringDataType(), 11, "MSVCRT", "");
		dllTable.add(new StringDataType(), 13, "ADVAPI32", "");
		dllTable.add(new StringDataType(), 13, "KERNEL32", "");
		dllTable.add(new StringDataType(), 10, "GDI32", "");
		dllTable.add(new StringDataType(), 11, "USER32", "");
		dllTable.add(new StringDataType(), 13, "WINSPOOL32", "");

		builder.addDataType(dllTable);

		Union union = new UnionDataType("CoolUnion");
		union.add(new QWordDataType());
		union.add(new WordDataType());

		// Undefined * * * * *
		union.add(createPointer(DataType.DEFAULT, 5));
		union.add(dllTable);
		PointerDataType pointer = new PointerDataType(dllTable, 4);
		union.add(pointer);
		union.setCategoryPath(new CategoryPath("/Category1/Category2"));

		builder.addDataType(union);

		Structure charStruct = new StructureDataType("CharStruct", 0);
		charStruct.add(new CharDataType());
		charStruct.add(new StringDataType(), 4);
		charStruct.add(new TerminatedStringDataType(), 8);
		charStruct.add(new UnicodeDataType(), 12);
		charStruct.setCategoryPath(new CategoryPath("/Category1/Category2/Category4"));

		builder.addDataType(charStruct);

		Structure struct = new StructureDataType("ArrayStruct", 0);
		pointer = createPointer(intStruct, 2);
		struct.add(new ArrayDataType(pointer, 10, pointer.getLength()));
		struct.add(new ArrayDataType(intStruct, 3, intStruct.getLength()));
		struct.add(createPointer(DataType.DEFAULT, 5));
		struct.setCategoryPath(new CategoryPath("/MISC"));

		builder.addDataType(struct);

		Structure floatStruct = new StructureDataType("FloatStruct", 0);
		floatStruct.add(new FloatDataType());
		floatStruct.add(new DoubleDataType());
		floatStruct.setCategoryPath(new CategoryPath("/Category1/Category2/Category5"));

		builder.addDataType(struct);

		EnumDataType enumm = new EnumDataType("FavoriteColors", 1);
		enumm.add("Red", 0x0);
		enumm.add("Violet", 0x1);
		enumm.add("Black", 0x2);
		enumm.add("Pink", 0x3);
		enumm.setCategoryPath(new CategoryPath("/MISC"));

		builder.addDataType(enumm);

		//
		// From notepad2		
		//
		// functions
		FunctionDefinitionDataType def = new FunctionDefinitionDataType("MyFunctionDef");
		def.setReturnType(dllTable);

		ParameterDefinition[] params = new ParameterDefinition[4];
		params[0] = new ParameterDefinitionImpl("param_4", new WordDataType(), "");
		params[1] = new ParameterDefinitionImpl("param_8", new CharDataType(), "");
		params[2] = new ParameterDefinitionImpl("param_c", new Undefined4DataType(), "");
		params[3] = new ParameterDefinitionImpl("param_10", new Undefined4DataType(), "");
		def.setArguments(params);

		def.setCategoryPath(new CategoryPath("/MISC"));

		builder.addDataType(def);

		// datatypes
		Structure bar = new StructureDataType("Bar", 0);
		bar.add(new WordDataType());
		bar.setCategoryPath(new CategoryPath("/MISC"));

		Structure foo = new StructureDataType("Foo", 0);
		foo.add(new ByteDataType());
		foo.add(new ByteDataType());
		foo.add(new WordDataType());
		foo.setCategoryPath(new CategoryPath("/MISC"));

		Structure struct1 = new StructureDataType("Structure_1", 0);
		struct1.add(new ByteDataType());
		struct1.add(new WordDataType());
		struct1.add(new ByteDataType());
		struct1.setCategoryPath(new CategoryPath("/Category1/Category2"));

		foo.add(bar);
		bar.add(new PointerDataType(struct1, 4));
		struct1.insert(2, foo);

		builder.addDataType(bar);
		builder.addDataType(foo);
		builder.addDataType(struct1);

		TypedefDataType td = new TypedefDataType("FooTypedef", foo);
		td.setCategoryPath(new CategoryPath("/MISC"));
		builder.addDataType(td);

		enumm = new EnumDataType("ExpressionType", 1);
		enumm.add("TYPE_INT", 0x0);
		enumm.add("TYPE_FLOAT", 0x1);
		enumm.add("TYPE_RELOC", 0x2);
		enumm.add("TYPE_STRING", 0x3);
		enumm.add("TYPE_BITS", 0x4);
		enumm.add("TYPE_UNKNOWN", 0x5);
		enumm.setCategoryPath(new CategoryPath("/MISC"));

		builder.addDataType(enumm);

		Structure myStruct = new StructureDataType("MyStruct", 0);
		pointer = createPointer(intStruct, 2);
		myStruct.add(new ArrayDataType(floatStruct, 10, pointer.getLength()));
		pointer = createPointer(charStruct, 3);
		myStruct.add(new ArrayDataType(intStruct, 3, intStruct.getLength()));
		myStruct.add(pointer);
		myStruct.setCategoryPath(new CategoryPath("/Category1/Category2"));

		builder.addDataType(myStruct);

		//
		// notepad4
		//
		builder.addCategory(new CategoryPath("/A"));
		builder.addCategory(new CategoryPath("/A/B"));
		builder.addCategory(new CategoryPath("/A/C"));

		// program trees
		builder.createProgramTree("Main Tree");
		builder.getOrCreateModule("Main Tree", "Strings");
		builder.createProgramTree("Tree Three");
		builder.getOrCreateModule("Tree Three", "B");
		builder.createProgramTree("Tree Two");
		builder.createProgramTree("Tree One");

		// code units
		builder.addBytesFallthrough("0x100652a");
		builder.disassemble("0x100652a", 1);

		//
		//
		//
		builder.setProperty(Program.DATE_CREATED, new Date(100000000)); // arbitrary, but consistent
		ProgramDB program = builder.getProgram();
		AbstractGenericTest.setInstanceField("recordChanges", program, Boolean.TRUE);

		UniversalID ID = UniversalIdGenerator.nextID();

		if (lastGeneratedUniversalID != null) {
			if (!lastGeneratedUniversalID.equals(ID)) {
				// if this happens, update initializeStaticUniversalIDUsage()
				throw new AssertException("Expected Test UniversalID has changed.  "
					+ "This is probably due to an new static usage of the UniversalIDGenerator.");
			}
		}

		return program;
	}
We keep track of this to know if there are any changes in static initialization.  We want
to make sure that all program building runs result in the same ID sequences.  The first
program built triggers static loading, which will cause the IDs for that run to be 
larger than the subsequent runs.  So, we call all known static initializers before we 
run.  This variable lets us know if a new initializer was added, as the ID value between
the first run and the second run will be different.
Ghidra/Features/Base/src/test/java/ghidra/program/database/MergeProgramGenerator_Notepads.java