anchor.diff:  
   procedure TKeyboardProjectTemplate.Generate;
   begin
  -  if not ForceDirectories(FBasePath + FKeyboardID + '\source') then
  +  if not ForceDirectories(FBasePath + FKeyboardID + '\' + SFolder_Source) then
       raise EKeyboardProjectTemplate.Create('Could not create destination path '+FBasePath+FKeyboardID);
   
     WriteDocumentation;
  
positive.code:   if Base = '' then
      Result := ''
    else if ExtractFileExt(Base) = Base then
      Result := FBasePath + FKeyboardID + '\source\' + FKeyboardID + Base
    else
      Result := FBasePath + FKeyboardID + '\source\' + Base;
  end;
  
  function TKeyboardProjectTemplate.GetIconFilename: string;
  
negative.code:   kmxfileconsts,
    Keyman.Developer.System.Project.kmnProjectFile,
    Keyman.Developer.System.Project.kpsProjectFile,
    Keyman.Developer.System.Project.ProjectFile,
    Keyman.Developer.System.Project.ProjectFiles,
    PackageInfo,
    RedistFiles,
    TouchLayout,
    utilfiletypes,
    utilstr,
    VisualKeyboard;
  
  
  const
    SFolder_Source = 'source';
    SFolder_Build = 'build';
  
    SFile_ReadmeMD = 'README.md';     // in root
    SFile_HistoryMD = 'HISTORY.md';   // in root
    SFile_LicenseMD = 'LICENSE.md';   // in root
    SFile_WelcomeHTM = 'welcome.htm'; // in source/
    SFile_ReadmeHTM = 'readme.htm';   // in source/
  
    SFileTemplate_KeyboardInfo = '%s.keyboard_info'; // in root
  
  { TKeyboardProjectTemplate }
  
  constructor TKeyboardProjectTemplate.Create(const BasePath, KeyboardID: string; Targets: TKeymanTargets);
  