int ribi::MenuDialog::Execute(const std::vector<std::string>& argv) noexcept
{
    const int argc = static_cast<int>(argv.size());
    if (argc == 1)
    {
        return ExecuteSpecific(argv);
    }
    const std::string s = argv[1];
    if (s == std::string("--about") || s == std::string("-a"))
    {
        const std::vector<std::string> v { GetAbout().CreateAboutText() };
        std::copy(v.begin(),v.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
        std::cout
                << "\n"
                << "Source code built on "
                << __DATE__
                << " "
                << __TIME__
                << " ("
#ifdef NDEBUG
                << "release"
#else
                << "debug"
#endif
                << " version)"
                << std::endl;
        return 0;
    }
    else if (s == std::string("--help") || s == std::string("-h"))
    {
        std::cout << GetHelp() << '\n';
        return 0;
    }
    else if (s == std::string("--history") || s == std::string("-i"))
    {
        const std::vector<std::string> v { GetVersionHistory() };
        std::copy(v.begin(),v.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
        return 0;
    }
    else if (s == std::string("--licence") || s == std::string("-l"))
    {
        const std::vector<std::string> v { GetAbout().CreateLicenceText() };
        std::copy(v.begin(),v.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
        return 0;
    }
    else if (s == std::string("--version") || s == std::string("-v"))
    {
        const std::vector<std::string> v = { GetAbout().CreateLibrariesUsedText() };
        std::copy(v.begin(),v.end(),std::ostream_iterator<std::string>(std::cout,"\n"));
        return 0;
    }
    return ExecuteSpecific(argv);
}
ribi::About ribi::RegexTesterMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "RegexTester",
    "regular expression tester",
    "November 21st of 2015",
    "2010-2015",
    "http://www.richelbilderbeek.nl/ToolRegexTester.htm",
    GetVersion(),
    GetVersionHistory());
  return a;
}
const ribi::About ribi::QtCreatorProFile::GetAbout() noexcept
{
  ribi::About a(
    "Richel Bilderbeek",
    "QtCreatorProFile",
    "class to parse Qt Project files",
    "the 19th of August 2013",
    "2010-2014",
    "http://www.richelbilderbeek.nl/CppQtCreatorProFile.htm",
    GetVersion(),
    GetVersionHistory());
  return a;
}
const About RegexTesterMenuDialog::GetAbout()
{
  About a(
    "Richel Bilderbeek",
    "RegexTester",
    "regular expression tester",
    "the 16th of July 2013",
    "2010-2013",
    "http://www.richelbilderbeek.nl/ToolRegexTester.htm",
    GetVersion(),
    GetVersionHistory());
  return a;
}
const ribi::About ribi::TestGroupWidgetMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "TestGroupWidget",
    "tool to test the (Wt)GroupWidget class",
    "the 8th of September 2011",
    "2011-2014",
    "http://www.richelbilderbeek.nl/ToolTestGroupWidget.htm",
    GetVersion(),
    GetVersionHistory());
  return a;
}
const ribi::About ribi::NsanaBrosMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "Super Nsana Bros",
    "true two-dimensional platform game",
    "the 29th of March 2011",
    "2011-2014",
    "http://www.richelbilderbeek.nl/GameNsanaBros.htm",
    GetVersion(),
    GetVersionHistory());
  return a;
}
const ribi::About ribi::MazeCreatorMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "MazeCreator",
    "creates a maze and displays it on screen",
    "the 6th of March 2012",
    "2007-2014",
    "http://www.richelbilderbeek.nl/ToolMazeCreator.htm",
    GetVersion(),
    GetVersionHistory());
  //a.AddLibrary("QtDialWidget version: " + QtDialWidget::GetVersion());
  return a;
}
const ribi::About ribi::PerfectElasticCollisionMenuDialog::GetAbout() const noexcept
{
    About a(
        "Richel Bilderbeek",
        "PerfectElasticCollision",
        "tool to investigate a perfect elastic collision",
        "the 7th of March 2012",
        "2010-2014",
        "http://www.richelbilderbeek.nl/ToolPerfectElasticCollision.htm",
        GetVersion(),
        GetVersionHistory());
    //a.AddLibrary("QtDialWidget version: " + QtDialWidget::GetVersion());
    return a;
}
ribi::About ribi::TronMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "TronCollection",
    "",
    "",
    "",
    "http://www.richelbilderbeek.nl/GameTronCollection.htm",
    GetVersion(),
    GetVersionHistory());
  //a.AddLibrary("QtDialWidget version: " + QtDialWidget::GetVersion());
  return a;
}
const ribi::About ribi::maziak::MenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "Maziak",
    "a simple maze game",
    "the 28th of January 2014",
    "2007-2014",
    "http://www.richelbilderbeek.nl/GameMaziak.htm",
    GetVersion(),
    GetVersionHistory());
  //a.AddLibrary("QtDialWidget version: " + QtDialWidget::GetVersion());
  return a;
}
const ribi::About ribi::TestTextPositionWidgetMenuDialog::GetAbout()
{
    About a(
        "Richel Bilderbeek",
        "TestTextPositionWidget",
        "tool to test the TicTacToe class",
        "the 15th of Oktober 2013",
        "2011-2013",
        "http://www.richelbilderbeek.nl/ToolTestTextPositionWidget.htm",
        GetVersion(),
        GetVersionHistory());
    a.AddLibrary("Trace version: " + Trace::GetVersion());
    return a;
}
ribi::About ribi::XeNonZeroMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "XeNonZero",
    "a simple game",
    "the 13th of July 2013",
    "2005-2015",
    "http://www.richelbilderbeek.nl/GameXeNonZero.htm",
    GetVersion(),
    GetVersionHistory());
  //a.AddLibrary("QtDialWidget version: " + QtDialWidget::GetVersion());
  return a;
}
const ribi::About ribi::MetZnDrieenMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "Met z'n Drieen",
    "Billy-themed connect-three game",
    "today",
    "200x-2014",
    "http://www.richelbilderbeek.nl/GameMetZnDrieen.htm",
    GetVersion(),
    GetVersionHistory());
  //a.AddLibrary("QtDialWidget version: " + QtDialWidget::GetVersion());
  return a;
}
const ribi::About ribi::PongMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "Pong",
    "Pong clone",
    "today",
    "2013-x",
    "http://www.richelbilderbeek.nl/GamePong.htm",
    GetVersion(),
    GetVersionHistory());
  //a.AddLibrary("QtDialWidget version: " + QtDialWidget::GetVersion());
  return a;
}
const ribi::About ribi::PreDickAdvocaTorMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "PreDickAdvocaTor",
    "tool to correctly predict WC scores", //if the lucky number is correct and the truth becomes reality
    "the 3rd of December 2013",
    "20010-2014",
    "http://www.richelbilderbeek.nl/ToolPreDickAdvocaTor.htm",
    GetVersion(),
    GetVersionHistory());
  //a.AddLibrary("ProFile version: " + QtCreatorProFile::GetVersion());
  return a;
}
const About BeerWanterMenuDialog::GetAbout()
{
  About a(
    "Richel Bilderbeek",
    "BeerWanter",
    "a simple game",
    "the 13th of July 2013",
    "2005-2013",
    "http://www.richelbilderbeek.nl/GameBeerWanter.htm",
    GetVersion(),
    GetVersionHistory());
  //a.AddLibrary("QtDialWidget version: " + QtDialWidget::GetVersion());
  return a;
}
ribi::About ribi::TestKeyboardFriendlyGraphicsViewMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "TestKeyboardFriendlyGraphicsView",
    "tests QtKeyboardFriendlyGraphicsView",
    "the 2nd of October 2015",
    "2012-2016",
    "http://www.richelbilderbeek.nl/ToolTestKeyboardFriendlyGraphicsView.htm",
    GetVersion(),
    GetVersionHistory()
  );
  return a;
}
const ribi::About ribi::TestAboutMenuDialog::GetAbout() const noexcept
{
    About a(
        "Richel Bilderbeek",
        "TestAbout",
        "test the About classes",
        "the 12th of July 2013",
        "2012-2014",
        "http://www.richelbilderbeek.nl/ToolTestAbout.htm",
        GetVersion(),
        GetVersionHistory());
    //a.AddLibrary("ProFile version: " + QtCreatorProFile::GetVersion());
    return a;
}
const About CreateGlossaryMenuDialog::GetAbout()
{
  About a(
    "Richel Bilderbeek",
    "CreateGlossary",
    "tool for creating my site's glossaries",
    "the 11th of August 2012",
    "2012",
    "http://www.richelbilderbeek.nl/ToolCreateGlossary.htm",
    GetVersion(),
    GetVersionHistory());
  a.AddLibrary("HtmlPage version: " + HtmlPage::GetVersion());
  return a;
}
ribi::About ribi::tent::MenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "TestEntrance",
    "tool to test WtEntrance",
    "December 2nd 2015",
    "2011-2015",
    "http://www.richelbilderbeek.nl/ToolTestEntrance.htm",
    GetVersion(),
    GetVersionHistory());
  a.AddLibrary("IpAddress version: " + IpAddress::GetVersion());

  return a;
}
const About MenuDialog::GetAbout()
{
  About a(
    "Richel Bilderbeek",
    "TestEntrance",
    "tool to test WtEntrance",
    "the 19th of September 2011",
    "2011",
    "http://www.richelbilderbeek.nl/ToolTestEntrance.htm",
    GetVersion(),
    GetVersionHistory());
  a.AddLibrary("IpAddress version: " + IpAddress::GetVersion());

  return a;
}
const ribi::About ribi::GalleryMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "RichelBilderbeekGallery",
    "gallery of Richel Bilderbeek's work",
    "the 20st of February 2012",
    "2012-2014",
    "http://www.richelbilderbeek.nl/ToolRichelBilderbeekGallery.htm",
    GetVersion(),
    GetVersionHistory());
  a.AddLibrary("Program version: " + Program::GetVersion());
  a.AddLibrary("ProgramStatus version: " + ProgramStatusVersion::GetVersion());
  return a;
}
const ribi::About ribi::TestKeyboardFriendlyGraphicsViewMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "TestKeyboardFriendlyGraphicsView",
    "tests QtKeyboardFriendlyGraphicsView",
    "the 19th of December 2012",
    "2012-2014",
    "http://www.richelbilderbeek.nl/ToolTestKeyboardFriendlyGraphicsView.htm",
    GetVersion(),
    GetVersionHistory());
  //a.AddLibrary("ProFile version: " + ProFile::GetVersion());
  a.AddLibrary("Trace version: " + Trace::GetVersion());
  return a;
}
ribi::About ribi::scc::MenuDialog::GetAbout() const noexcept
{
  ribi::About a {
    "Richel Bilderbeek",
    "StaircaseCardCreator",
    "tool to generate staircase cards",
    "the 6th of March 2014",
    "2010-2015",
    "http://www.richelbilderbeek.nl/ToolStaircaseCardCreator.htm",
    GetVersion(),
    GetVersionHistory()
  };
  a.AddLibrary("FileIo version: " + fileio::FileIo().GetVersion());
  a.AddLibrary("Trace version: " + Trace::GetVersion());
  return a;
}
const About MenuDialog::GetAbout() const
{
  About a(
    "Richel Bilderbeek",
    "SearchAndDestroyChess",
    "Kriegspiel",
    "the 23rd of Februari 2013",
    "2011",
    "http://www.richelbilderbeek.nl/GameSearchAndDestroyChess.htm",
    GetVersion(),
    GetVersionHistory());
  a.AddLibrary("Artwork from GNU XBoard");
  //a.AddLibrary("Chess::Board2d version: " + Chess::Board2d::GetVersion());
  a.AddLibrary("Trace version: " + Trace::GetVersion());
  return a;
}
ribi::About ribi::tapx::MenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "TestApproximator",
    "tests the Approximator class",
    "November 30th of 2015",
    "2013-2015",
    "http://www.richelbilderbeek.nl/ToolTestApproximator.htm",
    GetVersion(),
    GetVersionHistory()
  );
  a.AddLibrary("Approximator version: " + Approximator<>::GetVersion());
  a.AddLibrary("Trace version: " + Trace::GetVersion());
  return a;
}
const ribi::About ribi::TestBinaryNewickVectorMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "TestBinaryNewickVector",
    "GUI tool to test BinaryNewickVector",
    "the 6th of December 2013",
    "2010-2014",
    "http://www.richelbilderbeek.nl/ToolTestBinaryNewickVector.htm",
    GetVersion(),
    GetVersionHistory());
  a.AddLibrary("BigInt: version 2010.04.30");
  a.AddLibrary("BinaryNewickVector: " + BinaryNewickVector::GetVersion());
  a.AddLibrary("Trace version: " + Trace::GetVersion());
  return a;
}
const ribi::About ribi::TestMultiCanvasMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "TestMultiCanvas",
    "tests the MultiCanvas class",
    "the 13th of January 2014",
    "2014-2014",
    "http://www.richelbilderbeek.nl/ToolTestMultiCanvas.htm",
    GetVersion(),
    GetVersionHistory());
  a.AddLibrary("Canvas version: " + Canvas::GetVersion());
  a.AddLibrary("MultiCanvas version: " + MultiCanvas::GetVersion());
  a.AddLibrary("Trace version: " + Trace::GetVersion());
  return a;
}
//---------------------------------------------------------------------------
const About ToolSurfacePlotterMenuDialog::GetAbout()
{
  About a(
    "Richel Bilderbeek",
    "SurfacePlotter",
    "plots a bivariate function",
    "the 14th of July 2012",
    "2012",
    "http://www.richelbilderbeek.nl/ToolSurfacePlotter.htm",
    GetVersion(),
    GetVersionHistory());
  //a.AddLibrary("Rectangle version: " + Rect::GetVersion());

  a.AddLibrary("Warp's FunctionParser version: 4.4.3");
  return a;
}
ribi::About ribi::FilterOperationerMenuDialog::GetAbout() const noexcept
{
  About a(
    "Richel Bilderbeek",
    "FilterOperationer",
    "tool to perform image filter operations",
    "on the 29th of November 2013",
    "2008-2015",
    "http://www.richelbilderbeek.nl/ToolFilterOperationer.htm",
    GetVersion(),
    GetVersionHistory());
  a.AddLibrary("Test image from http://sipi.usc.edu");
  a.AddLibrary("TestTimer version: " + TestTimer::GetVersion());
  a.AddLibrary("Trace version: " + Trace::GetVersion());

  return a;
}