Merged with the changes of the 'jsonfiles' branch.

Mon, 01 Feb 2021 13:25:37 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Mon, 01 Feb 2021 13:25:37 +0100
changeset 8045
4d5209dc6eb4
parent 8042
3ded0527855a (current diff)
parent 8031
ce5858a237d2 (diff)
child 8047
b5594178c7fa

Merged with the changes of the 'jsonfiles' branch.

docs/changelog file | annotate | diff | comparison | revisions
eric6.e4p file | annotate | diff | comparison | revisions
eric6/Preferences/__init__.py file | annotate | diff | comparison | revisions
--- a/docs/changelog	Mon Feb 01 10:06:11 2021 +0100
+++ b/docs/changelog	Mon Feb 01 13:25:37 2021 +0100
@@ -1,5 +1,11 @@
 Change Log
 ----------
+Version 21.3:
+- bug fixes
+- General
+  -- changed the default file format for several generated files to be based on
+     JSON
+
 Version 21.2:
 - bug fixes
 - General
--- a/eric6.e4p	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6.e4p	Mon Feb 01 13:25:37 2021 +0100
@@ -280,6 +280,7 @@
     <Source>eric6/MultiProject/AddProjectDialog.py</Source>
     <Source>eric6/MultiProject/MultiProject.py</Source>
     <Source>eric6/MultiProject/MultiProjectBrowser.py</Source>
+    <Source>eric6/MultiProject/MultiProjectFile.py</Source>
     <Source>eric6/MultiProject/PropertiesDialog.py</Source>
     <Source>eric6/MultiProject/__init__.py</Source>
     <Source>eric6/Network/IRC/IrcChannelEditDialog.py</Source>
@@ -724,6 +725,7 @@
     <Source>eric6/Preferences/ConfigurationPages/EditorGeneralPage.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/EditorHighlightersPage.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py</Source>
+    <Source>eric6/Preferences/ConfigurationPages/EditorHighlightingStylesSelectionDialog.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/EditorKeywordsPage.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/EditorMouseClickHandlerPage.py</Source>
@@ -771,12 +773,14 @@
     <Source>eric6/Preferences/ConfigurationPages/WebBrowserSpellCheckingPage.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/WebBrowserVirusTotalPage.py</Source>
     <Source>eric6/Preferences/ConfigurationPages/__init__.py</Source>
+    <Source>eric6/Preferences/HighlightingStylesFile.py</Source>
     <Source>eric6/Preferences/MouseClickDialog.py</Source>
     <Source>eric6/Preferences/PreferencesLexer.py</Source>
     <Source>eric6/Preferences/ProgramsDialog.py</Source>
     <Source>eric6/Preferences/ShortcutDialog.py</Source>
     <Source>eric6/Preferences/Shortcuts.py</Source>
     <Source>eric6/Preferences/ShortcutsDialog.py</Source>
+    <Source>eric6/Preferences/ShortcutsFile.py</Source>
     <Source>eric6/Preferences/SubstyleDefinitionDialog.py</Source>
     <Source>eric6/Preferences/ToolConfigurationDialog.py</Source>
     <Source>eric6/Preferences/ToolGroupConfigurationDialog.py</Source>
@@ -788,6 +792,7 @@
     <Source>eric6/Project/AddLanguageDialog.py</Source>
     <Source>eric6/Project/CreateDialogCodeDialog.py</Source>
     <Source>eric6/Project/DebuggerPropertiesDialog.py</Source>
+    <Source>eric6/Project/DebuggerPropertiesFile.py</Source>
     <Source>eric6/Project/FiletypeAssociationDialog.py</Source>
     <Source>eric6/Project/IdlCompilerDefineNameDialog.py</Source>
     <Source>eric6/Project/IdlCompilerOptionsDialog.py</Source>
@@ -801,6 +806,7 @@
     <Source>eric6/Project/ProjectBrowserFlags.py</Source>
     <Source>eric6/Project/ProjectBrowserModel.py</Source>
     <Source>eric6/Project/ProjectBrowserSortFilterProxyModel.py</Source>
+    <Source>eric6/Project/ProjectFile.py</Source>
     <Source>eric6/Project/ProjectFormsBrowser.py</Source>
     <Source>eric6/Project/ProjectInterfacesBrowser.py</Source>
     <Source>eric6/Project/ProjectOthersBrowser.py</Source>
@@ -816,6 +822,7 @@
     <Source>eric6/Project/UicCompilerOptionsDialog.py</Source>
     <Source>eric6/Project/UicLoadUi5.py</Source>
     <Source>eric6/Project/UicLoadUi6.py</Source>
+    <Source>eric6/Project/UserProjectFile.py</Source>
     <Source>eric6/Project/UserPropertiesDialog.py</Source>
     <Source>eric6/Project/__init__.py</Source>
     <Source>eric6/PyUnit/UnittestDialog.py</Source>
@@ -909,6 +916,8 @@
     <Source>eric6/QScintilla/TypingCompleters/__init__.py</Source>
     <Source>eric6/QScintilla/ZoomDialog.py</Source>
     <Source>eric6/QScintilla/__init__.py</Source>
+    <Source>eric6/Sessions/SessionFile.py</Source>
+    <Source>eric6/Sessions/__init__.py</Source>
     <Source>eric6/Snapshot/SnapWidget.py</Source>
     <Source>eric6/Snapshot/SnapshotDefaultGrabber.py</Source>
     <Source>eric6/Snapshot/SnapshotFreehandGrabber.py</Source>
@@ -928,11 +937,13 @@
     <Source>eric6/Tasks/TaskFilterConfigDialog.py</Source>
     <Source>eric6/Tasks/TaskPropertiesDialog.py</Source>
     <Source>eric6/Tasks/TaskViewer.py</Source>
+    <Source>eric6/Tasks/TasksFile.py</Source>
     <Source>eric6/Tasks/__init__.py</Source>
     <Source>eric6/Templates/TemplateMultipleVariablesDialog.py</Source>
     <Source>eric6/Templates/TemplatePropertiesDialog.py</Source>
     <Source>eric6/Templates/TemplateSingleVariableDialog.py</Source>
     <Source>eric6/Templates/TemplateViewer.py</Source>
+    <Source>eric6/Templates/TemplatesFile.py</Source>
     <Source>eric6/Templates/__init__.py</Source>
     <Source>eric6/ThirdParty/CharDet/__init__.py</Source>
     <Source>eric6/ThirdParty/CharDet/chardet/__init__.py</Source>
@@ -1901,6 +1912,7 @@
     <Form>eric6/Preferences/ConfigurationPages/EditorGeneralPage.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/EditorHighlightersPage.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/EditorHighlightingStylesPage.ui</Form>
+    <Form>eric6/Preferences/ConfigurationPages/EditorHighlightingStylesSelectionDialog.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/EditorKeywordsPage.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.ui</Form>
     <Form>eric6/Preferences/ConfigurationPages/EditorMouseClickHandlerPage.ui</Form>
@@ -2115,6 +2127,7 @@
     <Other>docs/THANKS</Other>
     <Other>docs/changelog</Other>
     <Other>eric6.e4p</Other>
+    <Other>eric6.epj</Other>
     <Other>eric6/APIs/MicroPython/calliope.api</Other>
     <Other>eric6/APIs/MicroPython/circuitpython.api</Other>
     <Other>eric6/APIs/MicroPython/microbit.api</Other>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6.epj	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,2639 @@
+{
+  "header": {
+    "comment": "eric project file for project eric6",
+    "copyright": " Copyright (C) 2021 Detlev Offenbach, detlev@die-offenbachs.de "
+  },
+  "project": {
+    "DESCRIPTION": "eric6 is an integrated development environment for the Python language. It uses the PyQt5 bindings and the QScintilla2 editor widget.",
+    "VERSION": "6.x",
+    "SOURCES": [
+      "Examples/hallo.py",
+      "Examples/modpython.py",
+      "Examples/modpython_dbg.py",
+      "Examples/rhallo.py",
+      "eric6/CondaInterface/Conda.py",
+      "eric6/CondaInterface/CondaExecDialog.py",
+      "eric6/CondaInterface/CondaExportDialog.py",
+      "eric6/CondaInterface/CondaInfoDialog.py",
+      "eric6/CondaInterface/CondaNewEnvironmentDataDialog.py",
+      "eric6/CondaInterface/CondaPackageDetailsWidget.py",
+      "eric6/CondaInterface/CondaPackagesWidget.py",
+      "eric6/CondaInterface/__init__.py",
+      "eric6/Cooperation/ChatWidget.py",
+      "eric6/Cooperation/Connection.py",
+      "eric6/Cooperation/CooperationClient.py",
+      "eric6/Cooperation/CooperationServer.py",
+      "eric6/Cooperation/__init__.py",
+      "eric6/DataViews/CodeMetrics.py",
+      "eric6/DataViews/CodeMetricsDialog.py",
+      "eric6/DataViews/PyCoverageDialog.py",
+      "eric6/DataViews/PyProfileDialog.py",
+      "eric6/DataViews/__init__.py",
+      "eric6/DebugClients/Python/AsyncFile.py",
+      "eric6/DebugClients/Python/BreakpointWatch.py",
+      "eric6/DebugClients/Python/DCTestResult.py",
+      "eric6/DebugClients/Python/DebugBase.py",
+      "eric6/DebugClients/Python/DebugClient.py",
+      "eric6/DebugClients/Python/DebugClientBase.py",
+      "eric6/DebugClients/Python/DebugClientCapabilities.py",
+      "eric6/DebugClients/Python/DebugConfig.py",
+      "eric6/DebugClients/Python/DebugUtilities.py",
+      "eric6/DebugClients/Python/DebugVariables.py",
+      "eric6/DebugClients/Python/FlexCompleter.py",
+      "eric6/DebugClients/Python/ModuleLoader.py",
+      "eric6/DebugClients/Python/MultiProcessDebugExtension.py",
+      "eric6/DebugClients/Python/MultiprocessingExtension.py",
+      "eric6/DebugClients/Python/PyProfile.py",
+      "eric6/DebugClients/Python/QProcessExtension.py",
+      "eric6/DebugClients/Python/SubprocessExtension.py",
+      "eric6/DebugClients/Python/ThreadExtension.py",
+      "eric6/DebugClients/Python/__init__.py",
+      "eric6/DebugClients/Python/coverage/__init__.py",
+      "eric6/DebugClients/Python/coverage/__main__.py",
+      "eric6/DebugClients/Python/coverage/annotate.py",
+      "eric6/DebugClients/Python/coverage/backunittest.py",
+      "eric6/DebugClients/Python/coverage/backward.py",
+      "eric6/DebugClients/Python/coverage/bytecode.py",
+      "eric6/DebugClients/Python/coverage/cmdline.py",
+      "eric6/DebugClients/Python/coverage/collector.py",
+      "eric6/DebugClients/Python/coverage/config.py",
+      "eric6/DebugClients/Python/coverage/context.py",
+      "eric6/DebugClients/Python/coverage/control.py",
+      "eric6/DebugClients/Python/coverage/data.py",
+      "eric6/DebugClients/Python/coverage/debug.py",
+      "eric6/DebugClients/Python/coverage/disposition.py",
+      "eric6/DebugClients/Python/coverage/env.py",
+      "eric6/DebugClients/Python/coverage/execfile.py",
+      "eric6/DebugClients/Python/coverage/files.py",
+      "eric6/DebugClients/Python/coverage/html.py",
+      "eric6/DebugClients/Python/coverage/inorout.py",
+      "eric6/DebugClients/Python/coverage/jsonreport.py",
+      "eric6/DebugClients/Python/coverage/misc.py",
+      "eric6/DebugClients/Python/coverage/multiproc.py",
+      "eric6/DebugClients/Python/coverage/numbits.py",
+      "eric6/DebugClients/Python/coverage/optional.py",
+      "eric6/DebugClients/Python/coverage/parser.py",
+      "eric6/DebugClients/Python/coverage/phystokens.py",
+      "eric6/DebugClients/Python/coverage/plugin.py",
+      "eric6/DebugClients/Python/coverage/plugin_support.py",
+      "eric6/DebugClients/Python/coverage/python.py",
+      "eric6/DebugClients/Python/coverage/pytracer.py",
+      "eric6/DebugClients/Python/coverage/report.py",
+      "eric6/DebugClients/Python/coverage/results.py",
+      "eric6/DebugClients/Python/coverage/sqldata.py",
+      "eric6/DebugClients/Python/coverage/summary.py",
+      "eric6/DebugClients/Python/coverage/templite.py",
+      "eric6/DebugClients/Python/coverage/tomlconfig.py",
+      "eric6/DebugClients/Python/coverage/version.py",
+      "eric6/DebugClients/Python/coverage/xmlreport.py",
+      "eric6/DebugClients/Python/eric6dbgstub.py",
+      "eric6/DebugClients/Python/getpass.py",
+      "eric6/DebugClients/__init__.py",
+      "eric6/Debugger/BreakPointModel.py",
+      "eric6/Debugger/BreakPointViewer.py",
+      "eric6/Debugger/CallStackViewer.py",
+      "eric6/Debugger/CallTraceViewer.py",
+      "eric6/Debugger/Config.py",
+      "eric6/Debugger/DebugClientCapabilities.py",
+      "eric6/Debugger/DebugServer.py",
+      "eric6/Debugger/DebugUI.py",
+      "eric6/Debugger/DebugViewer.py",
+      "eric6/Debugger/DebuggerInterfaceNone.py",
+      "eric6/Debugger/DebuggerInterfacePython.py",
+      "eric6/Debugger/EditBreakpointDialog.py",
+      "eric6/Debugger/EditWatchpointDialog.py",
+      "eric6/Debugger/ExceptionLogger.py",
+      "eric6/Debugger/ExceptionsFilterDialog.py",
+      "eric6/Debugger/StartDialog.py",
+      "eric6/Debugger/StartHistoryEditDialog.py",
+      "eric6/Debugger/VariableDetailDialog.py",
+      "eric6/Debugger/VariablesFilterDialog.py",
+      "eric6/Debugger/VariablesViewer.py",
+      "eric6/Debugger/WatchPointModel.py",
+      "eric6/Debugger/WatchPointViewer.py",
+      "eric6/Debugger/__init__.py",
+      "eric6/DocumentationTools/APIGenerator.py",
+      "eric6/DocumentationTools/Config.py",
+      "eric6/DocumentationTools/IndexGenerator.py",
+      "eric6/DocumentationTools/ModuleDocumentor.py",
+      "eric6/DocumentationTools/QtHelpGenerator.py",
+      "eric6/DocumentationTools/TemplatesListsStyle.py",
+      "eric6/DocumentationTools/TemplatesListsStyleCSS.py",
+      "eric6/DocumentationTools/__init__.py",
+      "eric6/E5Graphics/E5ArrowItem.py",
+      "eric6/E5Graphics/E5GraphicsView.py",
+      "eric6/E5Graphics/__init__.py",
+      "eric6/E5Gui/E5Action.py",
+      "eric6/E5Gui/E5AnimatedLabel.py",
+      "eric6/E5Gui/E5AnimatedWidget.py",
+      "eric6/E5Gui/E5Application.py",
+      "eric6/E5Gui/E5ClickableLabel.py",
+      "eric6/E5Gui/E5ComboBox.py",
+      "eric6/E5Gui/E5Completers.py",
+      "eric6/E5Gui/E5ErrorMessage.py",
+      "eric6/E5Gui/E5ErrorMessageFilterDialog.py",
+      "eric6/E5Gui/E5FileDialog.py",
+      "eric6/E5Gui/E5FileSaveConfirmDialog.py",
+      "eric6/E5Gui/E5GenericDiffHighlighter.py",
+      "eric6/E5Gui/E5Led.py",
+      "eric6/E5Gui/E5LineEdit.py",
+      "eric6/E5Gui/E5LineEditButton.py",
+      "eric6/E5Gui/E5ListSelectionDialog.py",
+      "eric6/E5Gui/E5ListView.py",
+      "eric6/E5Gui/E5MainWindow.py",
+      "eric6/E5Gui/E5MapWidget.py",
+      "eric6/E5Gui/E5MessageBox.py",
+      "eric6/E5Gui/E5ModelMenu.py",
+      "eric6/E5Gui/E5ModelToolBar.py",
+      "eric6/E5Gui/E5OverrideCursor.py",
+      "eric6/E5Gui/E5PassivePopup.py",
+      "eric6/E5Gui/E5PasswordMeter.py",
+      "eric6/E5Gui/E5PathPicker.py",
+      "eric6/E5Gui/E5PathPickerDialog.py",
+      "eric6/E5Gui/E5PlainTextDialog.py",
+      "eric6/E5Gui/E5ProcessDialog.py",
+      "eric6/E5Gui/E5ProgressDialog.py",
+      "eric6/E5Gui/E5SideBar.py",
+      "eric6/E5Gui/E5SimpleHelpDialog.py",
+      "eric6/E5Gui/E5SingleApplication.py",
+      "eric6/E5Gui/E5SqueezeLabels.py",
+      "eric6/E5Gui/E5StringListEditWidget.py",
+      "eric6/E5Gui/E5TabWidget.py",
+      "eric6/E5Gui/E5TableView.py",
+      "eric6/E5Gui/E5TextEditSearchWidget.py",
+      "eric6/E5Gui/E5TextInputDialog.py",
+      "eric6/E5Gui/E5TextSpinBox.py",
+      "eric6/E5Gui/E5ToolBarDialog.py",
+      "eric6/E5Gui/E5ToolBarManager.py",
+      "eric6/E5Gui/E5ToolBox.py",
+      "eric6/E5Gui/E5ToolButton.py",
+      "eric6/E5Gui/E5TreeSortFilterProxyModel.py",
+      "eric6/E5Gui/E5TreeView.py",
+      "eric6/E5Gui/E5TreeWidget.py",
+      "eric6/E5Gui/E5ZoomWidget.py",
+      "eric6/E5Gui/__init__.py",
+      "eric6/E5Network/E5Ftp.py",
+      "eric6/E5Network/E5GoogleMail.py",
+      "eric6/E5Network/E5GoogleMailHelpers.py",
+      "eric6/E5Network/E5NetworkHeaderDetailsDialog.py",
+      "eric6/E5Network/E5NetworkProxyFactory.py",
+      "eric6/E5Network/E5RFC6266.py",
+      "eric6/E5Network/E5SslCertificateSelectionDialog.py",
+      "eric6/E5Network/E5SslCertificatesDialog.py",
+      "eric6/E5Network/E5SslCertificatesInfoDialog.py",
+      "eric6/E5Network/E5SslCertificatesInfoWidget.py",
+      "eric6/E5Network/E5SslErrorHandler.py",
+      "eric6/E5Network/E5SslInfoWidget.py",
+      "eric6/E5Network/E5SslUtilities.py",
+      "eric6/E5Network/E5TldExtractor.py",
+      "eric6/E5Network/E5UrlInfo.py",
+      "eric6/E5Network/E5XmlRpcClient.py",
+      "eric6/E5Network/__init__.py",
+      "eric6/E5Network/data/__init__.py",
+      "eric6/E5Utilities/E5Cache.py",
+      "eric6/E5Utilities/E5MutexLocker.py",
+      "eric6/E5Utilities/__init__.py",
+      "eric6/E5XML/Config.py",
+      "eric6/E5XML/DebuggerPropertiesReader.py",
+      "eric6/E5XML/DebuggerPropertiesWriter.py",
+      "eric6/E5XML/HighlightingStylesReader.py",
+      "eric6/E5XML/HighlightingStylesWriter.py",
+      "eric6/E5XML/MultiProjectReader.py",
+      "eric6/E5XML/MultiProjectWriter.py",
+      "eric6/E5XML/PluginRepositoryReader.py",
+      "eric6/E5XML/ProjectReader.py",
+      "eric6/E5XML/ProjectWriter.py",
+      "eric6/E5XML/SessionReader.py",
+      "eric6/E5XML/SessionWriter.py",
+      "eric6/E5XML/ShortcutsReader.py",
+      "eric6/E5XML/ShortcutsWriter.py",
+      "eric6/E5XML/SpellCheckDictionariesReader.py",
+      "eric6/E5XML/TasksReader.py",
+      "eric6/E5XML/TasksWriter.py",
+      "eric6/E5XML/TemplatesReader.py",
+      "eric6/E5XML/TemplatesWriter.py",
+      "eric6/E5XML/UserProjectReader.py",
+      "eric6/E5XML/UserProjectWriter.py",
+      "eric6/E5XML/XMLStreamReaderBase.py",
+      "eric6/E5XML/XMLStreamWriterBase.py",
+      "eric6/E5XML/__init__.py",
+      "eric6/Globals/AppInfo.py",
+      "eric6/Globals/__init__.py",
+      "eric6/Graphics/ApplicationDiagramBuilder.py",
+      "eric6/Graphics/AssociationItem.py",
+      "eric6/Graphics/ClassItem.py",
+      "eric6/Graphics/GraphicsUtilities.py",
+      "eric6/Graphics/ImportsDiagramBuilder.py",
+      "eric6/Graphics/ModuleItem.py",
+      "eric6/Graphics/PackageDiagramBuilder.py",
+      "eric6/Graphics/PackageItem.py",
+      "eric6/Graphics/PixmapDiagram.py",
+      "eric6/Graphics/SvgDiagram.py",
+      "eric6/Graphics/UMLClassDiagramBuilder.py",
+      "eric6/Graphics/UMLDiagramBuilder.py",
+      "eric6/Graphics/UMLDialog.py",
+      "eric6/Graphics/UMLGraphicsView.py",
+      "eric6/Graphics/UMLItem.py",
+      "eric6/Graphics/UMLSceneSizeDialog.py",
+      "eric6/Graphics/__init__.py",
+      "eric6/HexEdit/HexEditChunks.py",
+      "eric6/HexEdit/HexEditGotoWidget.py",
+      "eric6/HexEdit/HexEditMainWindow.py",
+      "eric6/HexEdit/HexEditSearchReplaceWidget.py",
+      "eric6/HexEdit/HexEditUndoStack.py",
+      "eric6/HexEdit/HexEditWidget.py",
+      "eric6/HexEdit/__init__.py",
+      "eric6/IconEditor/IconEditorGrid.py",
+      "eric6/IconEditor/IconEditorPalette.py",
+      "eric6/IconEditor/IconEditorWindow.py",
+      "eric6/IconEditor/IconSizeDialog.py",
+      "eric6/IconEditor/__init__.py",
+      "eric6/IconEditor/cursors/__init__.py",
+      "eric6/MicroPython/CircuitPythonDevices.py",
+      "eric6/MicroPython/CircuitPythonFirmwareSelectionDialog.py",
+      "eric6/MicroPython/EspBackupRestoreFirmwareDialog.py",
+      "eric6/MicroPython/EspDevices.py",
+      "eric6/MicroPython/EspFirmwareSelectionDialog.py",
+      "eric6/MicroPython/IgnoredDevicesDialog.py",
+      "eric6/MicroPython/MicroPythonCommandsInterface.py",
+      "eric6/MicroPython/MicroPythonDevices.py",
+      "eric6/MicroPython/MicroPythonFileManager.py",
+      "eric6/MicroPython/MicroPythonFileManagerWidget.py",
+      "eric6/MicroPython/MicroPythonFileSystemUtilities.py",
+      "eric6/MicroPython/MicroPythonGraphWidget.py",
+      "eric6/MicroPython/MicroPythonProgressInfoDialog.py",
+      "eric6/MicroPython/MicroPythonSerialPort.py",
+      "eric6/MicroPython/MicroPythonWidget.py",
+      "eric6/MicroPython/MicrobitDevices.py",
+      "eric6/MicroPython/PyBoardDevices.py",
+      "eric6/MicroPython/__init__.py",
+      "eric6/MultiProject/AddProjectDialog.py",
+      "eric6/MultiProject/MultiProject.py",
+      "eric6/MultiProject/MultiProjectBrowser.py",
+      "eric6/MultiProject/MultiProjectFile.py",
+      "eric6/MultiProject/PropertiesDialog.py",
+      "eric6/MultiProject/__init__.py",
+      "eric6/Network/IRC/IrcChannelEditDialog.py",
+      "eric6/Network/IRC/IrcChannelWidget.py",
+      "eric6/Network/IRC/IrcIdentitiesEditDialog.py",
+      "eric6/Network/IRC/IrcMessageEdit.py",
+      "eric6/Network/IRC/IrcNetworkEditDialog.py",
+      "eric6/Network/IRC/IrcNetworkListDialog.py",
+      "eric6/Network/IRC/IrcNetworkManager.py",
+      "eric6/Network/IRC/IrcNetworkWidget.py",
+      "eric6/Network/IRC/IrcServerEditDialog.py",
+      "eric6/Network/IRC/IrcUtilities.py",
+      "eric6/Network/IRC/IrcWidget.py",
+      "eric6/Network/IRC/__init__.py",
+      "eric6/Network/__init__.py",
+      "eric6/PipInterface/Pip.py",
+      "eric6/PipInterface/PipDialog.py",
+      "eric6/PipInterface/PipFileSelectionDialog.py",
+      "eric6/PipInterface/PipFreezeDialog.py",
+      "eric6/PipInterface/PipPackageDetailsDialog.py",
+      "eric6/PipInterface/PipPackagesInputDialog.py",
+      "eric6/PipInterface/PipPackagesWidget.py",
+      "eric6/PipInterface/__init__.py",
+      "eric6/PluginManager/PluginDetailsDialog.py",
+      "eric6/PluginManager/PluginExceptions.py",
+      "eric6/PluginManager/PluginInfoDialog.py",
+      "eric6/PluginManager/PluginInstallDialog.py",
+      "eric6/PluginManager/PluginManager.py",
+      "eric6/PluginManager/PluginRepositoryDialog.py",
+      "eric6/PluginManager/PluginUninstallDialog.py",
+      "eric6/PluginManager/__init__.py",
+      "eric6/Plugins/AboutPlugin/AboutDialog.py",
+      "eric6/Plugins/AboutPlugin/__init__.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/AnnotationsChecker.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/__init__.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Annotations/translations.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/AstUtilities.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleAddBuiltinIgnoreDialog.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleChecker.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCodeSelectionDialog.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleFixer.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleStatisticsDialog.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Complexity/ComplexityChecker.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Complexity/__init__.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Complexity/translations.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/DocStyle/DocStyleChecker.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/DocStyle/__init__.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/DocStyle/translations.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/MiscellaneousChecker.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/MiscellaneousDefaults.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/__init__.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Miscellaneous/translations.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Naming/NamingStyleChecker.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Naming/__init__.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Naming/translations.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/__init__.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/assert.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/awsHardcodedPassword.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/blackListCalls.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/blackListImports.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/certificateValidation.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/djangoSqlInjection.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/djangoXssVulnerability.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/exec.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/flaskDebug.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalBindAllInterfaces.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalFilePermissions.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalHardcodedPassword.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/generalHardcodedTmp.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionParamiko.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionShell.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionSql.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/injectionWildcard.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/insecureHashlibNew.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/insecureSslTls.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/jinja2Templates.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/makoTemplates.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/sshNoHostKeyVerification.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/tryExcept.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/weakCryptographicKey.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/Checks/yamlLoad.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityChecker.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityContext.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityDefaults.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityNodeVisitor.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/SecurityUtils.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/__init__.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/Security/translations.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/__init__.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/eradicate.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/mccabe.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/pycodestyle.py",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/translations.py",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheck.py",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckService.py",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckerDialog.py",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/__init__.py",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/jsCheckSyntax.py",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/jsonCheckSyntax.py",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/__init__.py",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/checker.py",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/messages.py",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/pyflakes/translations.py",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/tomlCheckSyntax.py",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/yamlCheckSyntax.py",
+      "eric6/Plugins/CheckerPlugins/__init__.py",
+      "eric6/Plugins/DocumentationPlugins/Ericapi/EricapiConfigDialog.py",
+      "eric6/Plugins/DocumentationPlugins/Ericapi/EricapiExecDialog.py",
+      "eric6/Plugins/DocumentationPlugins/Ericapi/__init__.py",
+      "eric6/Plugins/DocumentationPlugins/Ericdoc/EricdocConfigDialog.py",
+      "eric6/Plugins/DocumentationPlugins/Ericdoc/EricdocExecDialog.py",
+      "eric6/Plugins/DocumentationPlugins/Ericdoc/__init__.py",
+      "eric6/Plugins/DocumentationPlugins/__init__.py",
+      "eric6/Plugins/PluginAbout.py",
+      "eric6/Plugins/PluginCodeStyleChecker.py",
+      "eric6/Plugins/PluginEricapi.py",
+      "eric6/Plugins/PluginEricdoc.py",
+      "eric6/Plugins/PluginSyntaxChecker.py",
+      "eric6/Plugins/PluginTranslator.py",
+      "eric6/Plugins/PluginVcsGit.py",
+      "eric6/Plugins/PluginVcsMercurial.py",
+      "eric6/Plugins/PluginVcsPySvn.py",
+      "eric6/Plugins/PluginVcsSubversion.py",
+      "eric6/Plugins/PluginVmListspace.py",
+      "eric6/Plugins/PluginVmTabview.py",
+      "eric6/Plugins/PluginWizardDotDesktop.py",
+      "eric6/Plugins/PluginWizardE5MessageBox.py",
+      "eric6/Plugins/PluginWizardEricPlugin.py",
+      "eric6/Plugins/PluginWizardPyRegExp.py",
+      "eric6/Plugins/PluginWizardQColorDialog.py",
+      "eric6/Plugins/PluginWizardQFileDialog.py",
+      "eric6/Plugins/PluginWizardQFontDialog.py",
+      "eric6/Plugins/PluginWizardQInputDialog.py",
+      "eric6/Plugins/PluginWizardQMessageBox.py",
+      "eric6/Plugins/PluginWizardQRegularExpression.py",
+      "eric6/Plugins/PluginWizardSetup.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/ConfigurationPage/TranslatorPage.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/ConfigurationPage/__init__.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/Translator.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/DeepLEngine.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GlosbeEngine.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GoogleV1Engine.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/GoogleV2Engine.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/IbmWatsonEngine.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/MicrosoftEngine.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/MyMemoryEngine.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/PromtEngine.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/TranslationEngine.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/YandexEngine.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorEngines/__init__.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorLanguagesDb.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorRequest.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorWidget.py",
+      "eric6/Plugins/UiExtensionPlugins/Translator/__init__.py",
+      "eric6/Plugins/UiExtensionPlugins/__init__.py",
+      "eric6/Plugins/VcsPlugins/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/Config.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/ConfigurationPage/GitPage.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/ConfigurationPage/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitAddRemoteDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitApplyBundleDataDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitArchiveDataDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitBisectLogBrowserDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitBisectStartDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitBlameDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitBranchDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitBranchPushDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitBundleDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitChangeRemoteUrlDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitCherryPickDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitCommandDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitCommitDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitCopyDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitDescribeDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitDiffDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitDiffGenerator.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitDiffHighlighter.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitDiffParser.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitFetchDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitListDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitLogBrowserDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitMergeDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitNewProjectOptionsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitOptionsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitPatchFilesDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitPatchStatisticsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitPullDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitPushDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitReflogBrowserDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitRemoteCredentialsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitRemoteRepositoriesDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitRevisionSelectionDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitRevisionsSelectionDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitStashBrowserDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitStashDataDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitStatusDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitStatusMonitorThread.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmoduleAddDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmodulesDeinitDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmodulesListDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmodulesStatusDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmodulesSummaryOptionsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmodulesSyncDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmodulesUpdateOptionsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitTagBranchListDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitTagDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitUserConfigDataDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitUtilities.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/ProjectBrowserHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsGit/git.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/closehead.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/Config.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/GpgExtension/HgGpgSignDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/GpgExtension/HgGpgSignaturesDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/GpgExtension/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/GpgExtension/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/GpgExtension/gpg.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgAddSubrepositoryDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgAnnotateDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgArchiveDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBackoutDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBookmarkDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBookmarkRenameDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBookmarksInOutDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBookmarksListDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBranchInputDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBundleDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgClient.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgClientPromptDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgCommandDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgCommitDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgConflictsListDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgCopyDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgDiffDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgDiffGenerator.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgDiffHighlighter.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgExportDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgExtension.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgExtensionProjectBrowserHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgExtensionProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgGraftDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgImportDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgMergeDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgNewProjectOptionsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgOptionsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgPhaseDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgRemoveSubrepositoriesDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgRepoConfigDataDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgRevisionSelectionDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgRevisionsSelectionDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgServeDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgStatusMonitorThread.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgSummaryDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgTagBranchListDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgTagDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigHostFingerprintDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigHostMinimumProtocolDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgUtilities.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditCommitEditor.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditConfigDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditEditor.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditPlanEditor.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/histedit.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/LfConvertDataDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/LfRevisionsInputDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/ProjectBrowserHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/largefiles.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ProjectBrowserHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/HgPurgeListDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/purge.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesDefineGuardsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesFoldDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesGuardsSelectionDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesHeaderDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListAllGuardsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListGuardsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesNewPatchDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesQueueManagementDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesRenamePatchDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/queues.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/HgRebaseDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/rebase.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveBrowserDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelvesSelectionDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgUnshelveDataDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/ProjectBrowserHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/shelve.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/StripExtension/HgStripDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/StripExtension/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/StripExtension/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/StripExtension/strip.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/hg.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/Config.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/ConfigurationPage/SubversionPage.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/ConfigurationPage/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/ProjectBrowserHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnBlameDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnChangeListsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnCommandDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnCommitDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnConst.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnCopyDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnDialogMixin.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnDiffDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnDiffHighlighter.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnInfoDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnLogBrowserDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnLoginDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnMergeDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnNewProjectOptionsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnOptionsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnPropDelDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnPropListDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnPropSetDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnRelocateDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnRepoBrowserDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnRevisionSelectionDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnStatusDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnStatusMonitorThread.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnSwitchDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnTagBranchListDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnTagDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnUrlSelectionDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnUtilities.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/subversion.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/Config.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/ConfigurationPage/SubversionPage.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/ConfigurationPage/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/ProjectBrowserHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/ProjectHelper.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnBlameDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnChangeListsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnCommandDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnCommitDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnCopyDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnDiffDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnDiffHighlighter.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnLogBrowserDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnMergeDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnNewProjectOptionsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnOptionsDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnPropListDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnPropSetDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnRelocateDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnRepoBrowserDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnRevisionSelectionDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnStatusDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnStatusMonitorThread.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnSwitchDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnTagBranchListDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnTagDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnUrlSelectionDialog.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnUtilities.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/__init__.py",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/subversion.py",
+      "eric6/Plugins/ViewManagerPlugins/Listspace/Listspace.py",
+      "eric6/Plugins/ViewManagerPlugins/Listspace/__init__.py",
+      "eric6/Plugins/ViewManagerPlugins/Tabview/Tabview.py",
+      "eric6/Plugins/ViewManagerPlugins/Tabview/__init__.py",
+      "eric6/Plugins/ViewManagerPlugins/__init__.py",
+      "eric6/Plugins/WizardPlugins/ColorDialogWizard/ColorDialogWizardDialog.py",
+      "eric6/Plugins/WizardPlugins/ColorDialogWizard/__init__.py",
+      "eric6/Plugins/WizardPlugins/DotDesktopWizard/DotDesktopListSelectionDialog.py",
+      "eric6/Plugins/WizardPlugins/DotDesktopWizard/DotDesktopWizardDialog.py",
+      "eric6/Plugins/WizardPlugins/DotDesktopWizard/__init__.py",
+      "eric6/Plugins/WizardPlugins/E5MessageBoxWizard/E5MessageBoxWizardDialog.py",
+      "eric6/Plugins/WizardPlugins/E5MessageBoxWizard/__init__.py",
+      "eric6/Plugins/WizardPlugins/EricPluginWizard/PluginWizardDialog.py",
+      "eric6/Plugins/WizardPlugins/EricPluginWizard/Templates.py",
+      "eric6/Plugins/WizardPlugins/EricPluginWizard/__init__.py",
+      "eric6/Plugins/WizardPlugins/FileDialogWizard/FileDialogWizardDialog.py",
+      "eric6/Plugins/WizardPlugins/FileDialogWizard/__init__.py",
+      "eric6/Plugins/WizardPlugins/FontDialogWizard/FontDialogWizardDialog.py",
+      "eric6/Plugins/WizardPlugins/FontDialogWizard/__init__.py",
+      "eric6/Plugins/WizardPlugins/InputDialogWizard/InputDialogWizardDialog.py",
+      "eric6/Plugins/WizardPlugins/InputDialogWizard/__init__.py",
+      "eric6/Plugins/WizardPlugins/MessageBoxWizard/MessageBoxWizardDialog.py",
+      "eric6/Plugins/WizardPlugins/MessageBoxWizard/__init__.py",
+      "eric6/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardCharactersDialog.py",
+      "eric6/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardDialog.py",
+      "eric6/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardRepeatDialog.py",
+      "eric6/Plugins/WizardPlugins/PyRegExpWizard/__init__.py",
+      "eric6/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardCharactersDialog.py",
+      "eric6/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardDialog.py",
+      "eric6/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardRepeatDialog.py",
+      "eric6/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardServer.py",
+      "eric6/Plugins/WizardPlugins/QRegularExpressionWizard/__init__.py",
+      "eric6/Plugins/WizardPlugins/SetupWizard/SetupWizardDialog.py",
+      "eric6/Plugins/WizardPlugins/SetupWizard/__init__.py",
+      "eric6/Plugins/WizardPlugins/__init__.py",
+      "eric6/Plugins/__init__.py",
+      "eric6/Preferences/ConfigurationDialog.py",
+      "eric6/Preferences/ConfigurationPages/ApplicationPage.py",
+      "eric6/Preferences/ConfigurationPages/CondaPage.py",
+      "eric6/Preferences/ConfigurationPages/ConfigurationPageBase.py",
+      "eric6/Preferences/ConfigurationPages/CooperationPage.py",
+      "eric6/Preferences/ConfigurationPages/CorbaPage.py",
+      "eric6/Preferences/ConfigurationPages/DebuggerGeneralPage.py",
+      "eric6/Preferences/ConfigurationPages/DebuggerPython3Page.py",
+      "eric6/Preferences/ConfigurationPages/DiffColoursPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorAPIsPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorAutocompletionPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorAutocompletionQScintillaPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorCalltipsPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorCalltipsQScintillaPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorDocViewerPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorExportersPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorFilePage.py",
+      "eric6/Preferences/ConfigurationPages/EditorGeneralPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorHighlightersPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorKeywordsPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.py",
+      "eric6/Preferences/ConfigurationPages/EditorMouseClickHandlerPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorPropertiesPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorSearchPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorSpellCheckingPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorStylesPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorSyntaxPage.py",
+      "eric6/Preferences/ConfigurationPages/EditorTypingPage.py",
+      "eric6/Preferences/ConfigurationPages/EmailPage.py",
+      "eric6/Preferences/ConfigurationPages/GraphicsPage.py",
+      "eric6/Preferences/ConfigurationPages/HelpDocumentationPage.py",
+      "eric6/Preferences/ConfigurationPages/HelpViewersPage.py",
+      "eric6/Preferences/ConfigurationPages/HexEditorPage.py",
+      "eric6/Preferences/ConfigurationPages/IconsPage.py",
+      "eric6/Preferences/ConfigurationPages/IconsPreviewDialog.py",
+      "eric6/Preferences/ConfigurationPages/InterfacePage.py",
+      "eric6/Preferences/ConfigurationPages/IrcPage.py",
+      "eric6/Preferences/ConfigurationPages/LogViewerPage.py",
+      "eric6/Preferences/ConfigurationPages/MasterPasswordEntryDialog.py",
+      "eric6/Preferences/ConfigurationPages/MicroPythonPage.py",
+      "eric6/Preferences/ConfigurationPages/MimeTypesPage.py",
+      "eric6/Preferences/ConfigurationPages/MultiProjectPage.py",
+      "eric6/Preferences/ConfigurationPages/NetworkPage.py",
+      "eric6/Preferences/ConfigurationPages/NotificationsPage.py",
+      "eric6/Preferences/ConfigurationPages/PipPage.py",
+      "eric6/Preferences/ConfigurationPages/PluginManagerPage.py",
+      "eric6/Preferences/ConfigurationPages/PrinterPage.py",
+      "eric6/Preferences/ConfigurationPages/ProjectBrowserPage.py",
+      "eric6/Preferences/ConfigurationPages/ProjectPage.py",
+      "eric6/Preferences/ConfigurationPages/ProtobufPage.py",
+      "eric6/Preferences/ConfigurationPages/PythonPage.py",
+      "eric6/Preferences/ConfigurationPages/QtPage.py",
+      "eric6/Preferences/ConfigurationPages/SecurityPage.py",
+      "eric6/Preferences/ConfigurationPages/ShellPage.py",
+      "eric6/Preferences/ConfigurationPages/TasksPage.py",
+      "eric6/Preferences/ConfigurationPages/TemplatesPage.py",
+      "eric6/Preferences/ConfigurationPages/TrayStarterPage.py",
+      "eric6/Preferences/ConfigurationPages/VcsPage.py",
+      "eric6/Preferences/ConfigurationPages/ViewmanagerPage.py",
+      "eric6/Preferences/ConfigurationPages/WebBrowserAppearancePage.py",
+      "eric6/Preferences/ConfigurationPages/WebBrowserFlashCookieManagerPage.py",
+      "eric6/Preferences/ConfigurationPages/WebBrowserInterfacePage.py",
+      "eric6/Preferences/ConfigurationPages/WebBrowserPage.py",
+      "eric6/Preferences/ConfigurationPages/WebBrowserSpellCheckingPage.py",
+      "eric6/Preferences/ConfigurationPages/WebBrowserVirusTotalPage.py",
+      "eric6/Preferences/ConfigurationPages/__init__.py",
+      "eric6/Preferences/MouseClickDialog.py",
+      "eric6/Preferences/PreferencesLexer.py",
+      "eric6/Preferences/ProgramsDialog.py",
+      "eric6/Preferences/ShortcutDialog.py",
+      "eric6/Preferences/Shortcuts.py",
+      "eric6/Preferences/ShortcutsDialog.py",
+      "eric6/Preferences/SubstyleDefinitionDialog.py",
+      "eric6/Preferences/ToolConfigurationDialog.py",
+      "eric6/Preferences/ToolGroupConfigurationDialog.py",
+      "eric6/Preferences/ViewProfileDialog.py",
+      "eric6/Preferences/__init__.py",
+      "eric6/Project/AddDirectoryDialog.py",
+      "eric6/Project/AddFileDialog.py",
+      "eric6/Project/AddFoundFilesDialog.py",
+      "eric6/Project/AddLanguageDialog.py",
+      "eric6/Project/CreateDialogCodeDialog.py",
+      "eric6/Project/DebuggerPropertiesDialog.py",
+      "eric6/Project/FiletypeAssociationDialog.py",
+      "eric6/Project/IdlCompilerDefineNameDialog.py",
+      "eric6/Project/IdlCompilerOptionsDialog.py",
+      "eric6/Project/LexerAssociationDialog.py",
+      "eric6/Project/MakePropertiesDialog.py",
+      "eric6/Project/NewDialogClassDialog.py",
+      "eric6/Project/NewPythonPackageDialog.py",
+      "eric6/Project/Project.py",
+      "eric6/Project/ProjectBaseBrowser.py",
+      "eric6/Project/ProjectBrowser.py",
+      "eric6/Project/ProjectBrowserFlags.py",
+      "eric6/Project/ProjectBrowserModel.py",
+      "eric6/Project/ProjectBrowserSortFilterProxyModel.py",
+      "eric6/Project/ProjectFile.py",
+      "eric6/Project/ProjectFormsBrowser.py",
+      "eric6/Project/ProjectInterfacesBrowser.py",
+      "eric6/Project/ProjectOthersBrowser.py",
+      "eric6/Project/ProjectProtocolsBrowser.py",
+      "eric6/Project/ProjectResourcesBrowser.py",
+      "eric6/Project/ProjectSourcesBrowser.py",
+      "eric6/Project/ProjectTranslationsBrowser.py",
+      "eric6/Project/PropertiesDialog.py",
+      "eric6/Project/QuickFindFileDialog.py",
+      "eric6/Project/RccCompilerOptionsDialog.py",
+      "eric6/Project/SpellingPropertiesDialog.py",
+      "eric6/Project/TranslationPropertiesDialog.py",
+      "eric6/Project/UicCompilerOptionsDialog.py",
+      "eric6/Project/UicLoadUi5.py",
+      "eric6/Project/UicLoadUi6.py",
+      "eric6/Project/UserPropertiesDialog.py",
+      "eric6/Project/__init__.py",
+      "eric6/PyUnit/UnittestDialog.py",
+      "eric6/PyUnit/__init__.py",
+      "eric6/QScintilla/APIsManager.py",
+      "eric6/QScintilla/DocstringGenerator/BaseDocstringGenerator.py",
+      "eric6/QScintilla/DocstringGenerator/EricdocGenerator.py",
+      "eric6/QScintilla/DocstringGenerator/GoogledocGenerator.py",
+      "eric6/QScintilla/DocstringGenerator/NumpydocGenerator.py",
+      "eric6/QScintilla/DocstringGenerator/PyDocstringGenerator.py",
+      "eric6/QScintilla/DocstringGenerator/SphinxdocGenerator.py",
+      "eric6/QScintilla/DocstringGenerator/__init__.py",
+      "eric6/QScintilla/Editor.py",
+      "eric6/QScintilla/EditorAssembly.py",
+      "eric6/QScintilla/EditorButtonsWidget.py",
+      "eric6/QScintilla/EditorMarkerMap.py",
+      "eric6/QScintilla/EditorOutline.py",
+      "eric6/QScintilla/EditorOutlineModel.py",
+      "eric6/QScintilla/Exporters/ExporterBase.py",
+      "eric6/QScintilla/Exporters/ExporterHTML.py",
+      "eric6/QScintilla/Exporters/ExporterODT.py",
+      "eric6/QScintilla/Exporters/ExporterPDF.py",
+      "eric6/QScintilla/Exporters/ExporterRTF.py",
+      "eric6/QScintilla/Exporters/ExporterTEX.py",
+      "eric6/QScintilla/Exporters/__init__.py",
+      "eric6/QScintilla/GotoDialog.py",
+      "eric6/QScintilla/KeySequenceTranslator.py",
+      "eric6/QScintilla/Lexers/Lexer.py",
+      "eric6/QScintilla/Lexers/LexerBash.py",
+      "eric6/QScintilla/Lexers/LexerBatch.py",
+      "eric6/QScintilla/Lexers/LexerCMake.py",
+      "eric6/QScintilla/Lexers/LexerCPP.py",
+      "eric6/QScintilla/Lexers/LexerCSS.py",
+      "eric6/QScintilla/Lexers/LexerCSharp.py",
+      "eric6/QScintilla/Lexers/LexerCoffeeScript.py",
+      "eric6/QScintilla/Lexers/LexerContainer.py",
+      "eric6/QScintilla/Lexers/LexerD.py",
+      "eric6/QScintilla/Lexers/LexerDiff.py",
+      "eric6/QScintilla/Lexers/LexerFortran.py",
+      "eric6/QScintilla/Lexers/LexerFortran77.py",
+      "eric6/QScintilla/Lexers/LexerHTML.py",
+      "eric6/QScintilla/Lexers/LexerIDL.py",
+      "eric6/QScintilla/Lexers/LexerJSON.py",
+      "eric6/QScintilla/Lexers/LexerJava.py",
+      "eric6/QScintilla/Lexers/LexerJavaScript.py",
+      "eric6/QScintilla/Lexers/LexerLua.py",
+      "eric6/QScintilla/Lexers/LexerMakefile.py",
+      "eric6/QScintilla/Lexers/LexerMarkdown.py",
+      "eric6/QScintilla/Lexers/LexerMatlab.py",
+      "eric6/QScintilla/Lexers/LexerOctave.py",
+      "eric6/QScintilla/Lexers/LexerPO.py",
+      "eric6/QScintilla/Lexers/LexerPOV.py",
+      "eric6/QScintilla/Lexers/LexerPascal.py",
+      "eric6/QScintilla/Lexers/LexerPerl.py",
+      "eric6/QScintilla/Lexers/LexerPostScript.py",
+      "eric6/QScintilla/Lexers/LexerProperties.py",
+      "eric6/QScintilla/Lexers/LexerPygments.py",
+      "eric6/QScintilla/Lexers/LexerPython.py",
+      "eric6/QScintilla/Lexers/LexerQSS.py",
+      "eric6/QScintilla/Lexers/LexerRuby.py",
+      "eric6/QScintilla/Lexers/LexerSQL.py",
+      "eric6/QScintilla/Lexers/LexerTCL.py",
+      "eric6/QScintilla/Lexers/LexerTeX.py",
+      "eric6/QScintilla/Lexers/LexerVHDL.py",
+      "eric6/QScintilla/Lexers/LexerXML.py",
+      "eric6/QScintilla/Lexers/LexerYAML.py",
+      "eric6/QScintilla/Lexers/SubstyledLexer.py",
+      "eric6/QScintilla/Lexers/__init__.py",
+      "eric6/QScintilla/MarkupProviders/HtmlProvider.py",
+      "eric6/QScintilla/MarkupProviders/HyperlinkMarkupDialog.py",
+      "eric6/QScintilla/MarkupProviders/ImageMarkupDialog.py",
+      "eric6/QScintilla/MarkupProviders/MarkdownProvider.py",
+      "eric6/QScintilla/MarkupProviders/MarkupBase.py",
+      "eric6/QScintilla/MarkupProviders/RestructuredTextProvider.py",
+      "eric6/QScintilla/MarkupProviders/__init__.py",
+      "eric6/QScintilla/MiniEditor.py",
+      "eric6/QScintilla/Printer.py",
+      "eric6/QScintilla/QsciScintillaCompat.py",
+      "eric6/QScintilla/SearchReplaceWidget.py",
+      "eric6/QScintilla/Shell.py",
+      "eric6/QScintilla/ShellHistoryDialog.py",
+      "eric6/QScintilla/ShellWindow.py",
+      "eric6/QScintilla/SortOptionsDialog.py",
+      "eric6/QScintilla/SpellChecker.py",
+      "eric6/QScintilla/SpellCheckingDialog.py",
+      "eric6/QScintilla/SpellingDictionaryEditDialog.py",
+      "eric6/QScintilla/TypingCompleters/CompleterBase.py",
+      "eric6/QScintilla/TypingCompleters/CompleterPython.py",
+      "eric6/QScintilla/TypingCompleters/CompleterRuby.py",
+      "eric6/QScintilla/TypingCompleters/CompleterYaml.py",
+      "eric6/QScintilla/TypingCompleters/__init__.py",
+      "eric6/QScintilla/ZoomDialog.py",
+      "eric6/QScintilla/__init__.py",
+      "eric6/Snapshot/SnapWidget.py",
+      "eric6/Snapshot/SnapshotDefaultGrabber.py",
+      "eric6/Snapshot/SnapshotFreehandGrabber.py",
+      "eric6/Snapshot/SnapshotModes.py",
+      "eric6/Snapshot/SnapshotPreview.py",
+      "eric6/Snapshot/SnapshotRegionGrabber.py",
+      "eric6/Snapshot/SnapshotTimer.py",
+      "eric6/Snapshot/SnapshotWaylandGrabber.py",
+      "eric6/Snapshot/__init__.py",
+      "eric6/SqlBrowser/SqlBrowser.py",
+      "eric6/SqlBrowser/SqlBrowserWidget.py",
+      "eric6/SqlBrowser/SqlConnectionDialog.py",
+      "eric6/SqlBrowser/SqlConnectionWidget.py",
+      "eric6/SqlBrowser/__init__.py",
+      "eric6/Tasks/Task.py",
+      "eric6/Tasks/TaskFilter.py",
+      "eric6/Tasks/TaskFilterConfigDialog.py",
+      "eric6/Tasks/TaskPropertiesDialog.py",
+      "eric6/Tasks/TaskViewer.py",
+      "eric6/Tasks/__init__.py",
+      "eric6/Templates/TemplateMultipleVariablesDialog.py",
+      "eric6/Templates/TemplatePropertiesDialog.py",
+      "eric6/Templates/TemplateSingleVariableDialog.py",
+      "eric6/Templates/TemplateViewer.py",
+      "eric6/Templates/__init__.py",
+      "eric6/ThirdParty/CharDet/__init__.py",
+      "eric6/ThirdParty/CharDet/chardet/__init__.py",
+      "eric6/ThirdParty/CharDet/chardet/big5freq.py",
+      "eric6/ThirdParty/CharDet/chardet/big5prober.py",
+      "eric6/ThirdParty/CharDet/chardet/chardistribution.py",
+      "eric6/ThirdParty/CharDet/chardet/charsetgroupprober.py",
+      "eric6/ThirdParty/CharDet/chardet/charsetprober.py",
+      "eric6/ThirdParty/CharDet/chardet/cli/__init__.py",
+      "eric6/ThirdParty/CharDet/chardet/cli/chardetect.py",
+      "eric6/ThirdParty/CharDet/chardet/codingstatemachine.py",
+      "eric6/ThirdParty/CharDet/chardet/compat.py",
+      "eric6/ThirdParty/CharDet/chardet/cp949prober.py",
+      "eric6/ThirdParty/CharDet/chardet/enums.py",
+      "eric6/ThirdParty/CharDet/chardet/escprober.py",
+      "eric6/ThirdParty/CharDet/chardet/escsm.py",
+      "eric6/ThirdParty/CharDet/chardet/eucjpprober.py",
+      "eric6/ThirdParty/CharDet/chardet/euckrfreq.py",
+      "eric6/ThirdParty/CharDet/chardet/euckrprober.py",
+      "eric6/ThirdParty/CharDet/chardet/euctwfreq.py",
+      "eric6/ThirdParty/CharDet/chardet/euctwprober.py",
+      "eric6/ThirdParty/CharDet/chardet/gb2312freq.py",
+      "eric6/ThirdParty/CharDet/chardet/gb2312prober.py",
+      "eric6/ThirdParty/CharDet/chardet/hebrewprober.py",
+      "eric6/ThirdParty/CharDet/chardet/jisfreq.py",
+      "eric6/ThirdParty/CharDet/chardet/jpcntx.py",
+      "eric6/ThirdParty/CharDet/chardet/langbulgarianmodel.py",
+      "eric6/ThirdParty/CharDet/chardet/langgreekmodel.py",
+      "eric6/ThirdParty/CharDet/chardet/langhebrewmodel.py",
+      "eric6/ThirdParty/CharDet/chardet/langhungarianmodel.py",
+      "eric6/ThirdParty/CharDet/chardet/langrussianmodel.py",
+      "eric6/ThirdParty/CharDet/chardet/langthaimodel.py",
+      "eric6/ThirdParty/CharDet/chardet/langturkishmodel.py",
+      "eric6/ThirdParty/CharDet/chardet/latin1prober.py",
+      "eric6/ThirdParty/CharDet/chardet/mbcharsetprober.py",
+      "eric6/ThirdParty/CharDet/chardet/mbcsgroupprober.py",
+      "eric6/ThirdParty/CharDet/chardet/mbcssm.py",
+      "eric6/ThirdParty/CharDet/chardet/metadata/__init__.py",
+      "eric6/ThirdParty/CharDet/chardet/metadata/languages.py",
+      "eric6/ThirdParty/CharDet/chardet/sbcharsetprober.py",
+      "eric6/ThirdParty/CharDet/chardet/sbcsgroupprober.py",
+      "eric6/ThirdParty/CharDet/chardet/sjisprober.py",
+      "eric6/ThirdParty/CharDet/chardet/universaldetector.py",
+      "eric6/ThirdParty/CharDet/chardet/utf8prober.py",
+      "eric6/ThirdParty/CharDet/chardet/version.py",
+      "eric6/ThirdParty/EditorConfig/__init__.py",
+      "eric6/ThirdParty/EditorConfig/editorconfig/__init__.py",
+      "eric6/ThirdParty/EditorConfig/editorconfig/__main__.py",
+      "eric6/ThirdParty/EditorConfig/editorconfig/compat.py",
+      "eric6/ThirdParty/EditorConfig/editorconfig/exceptions.py",
+      "eric6/ThirdParty/EditorConfig/editorconfig/fnmatch.py",
+      "eric6/ThirdParty/EditorConfig/editorconfig/handler.py",
+      "eric6/ThirdParty/EditorConfig/editorconfig/ini.py",
+      "eric6/ThirdParty/EditorConfig/editorconfig/version.py",
+      "eric6/ThirdParty/EditorConfig/editorconfig/versiontools.py",
+      "eric6/ThirdParty/Jasy/__init__.py",
+      "eric6/ThirdParty/Jasy/jasy/__init__.py",
+      "eric6/ThirdParty/Jasy/jasy/core/Console.py",
+      "eric6/ThirdParty/Jasy/jasy/core/Text.py",
+      "eric6/ThirdParty/Jasy/jasy/core/__init__.py",
+      "eric6/ThirdParty/Jasy/jasy/parse/AbstractNode.py",
+      "eric6/ThirdParty/Jasy/jasy/parse/__init__.py",
+      "eric6/ThirdParty/Jasy/jasy/script/__init__.py",
+      "eric6/ThirdParty/Jasy/jasy/script/api/Comment.py",
+      "eric6/ThirdParty/Jasy/jasy/script/api/Text.py",
+      "eric6/ThirdParty/Jasy/jasy/script/api/__init__.py",
+      "eric6/ThirdParty/Jasy/jasy/script/output/Compressor.py",
+      "eric6/ThirdParty/Jasy/jasy/script/output/__init__.py",
+      "eric6/ThirdParty/Jasy/jasy/script/parse/Lang.py",
+      "eric6/ThirdParty/Jasy/jasy/script/parse/Node.py",
+      "eric6/ThirdParty/Jasy/jasy/script/parse/Parser.py",
+      "eric6/ThirdParty/Jasy/jasy/script/parse/VanillaBuilder.py",
+      "eric6/ThirdParty/Jasy/jasy/script/parse/__init__.py",
+      "eric6/ThirdParty/Jasy/jasy/script/tokenize/Lang.py",
+      "eric6/ThirdParty/Jasy/jasy/script/tokenize/Tokenizer.py",
+      "eric6/ThirdParty/Jasy/jasy/script/tokenize/__init__.py",
+      "eric6/ThirdParty/Jasy/jasy/script/util/__init__.py",
+      "eric6/ThirdParty/Pygments/__init__.py",
+      "eric6/ThirdParty/Pygments/pygments/__init__.py",
+      "eric6/ThirdParty/Pygments/pygments/__main__.py",
+      "eric6/ThirdParty/Pygments/pygments/cmdline.py",
+      "eric6/ThirdParty/Pygments/pygments/console.py",
+      "eric6/ThirdParty/Pygments/pygments/filter.py",
+      "eric6/ThirdParty/Pygments/pygments/filters/__init__.py",
+      "eric6/ThirdParty/Pygments/pygments/formatter.py",
+      "eric6/ThirdParty/Pygments/pygments/formatters/__init__.py",
+      "eric6/ThirdParty/Pygments/pygments/formatters/_mapping.py",
+      "eric6/ThirdParty/Pygments/pygments/formatters/bbcode.py",
+      "eric6/ThirdParty/Pygments/pygments/formatters/html.py",
+      "eric6/ThirdParty/Pygments/pygments/formatters/img.py",
+      "eric6/ThirdParty/Pygments/pygments/formatters/irc.py",
+      "eric6/ThirdParty/Pygments/pygments/formatters/latex.py",
+      "eric6/ThirdParty/Pygments/pygments/formatters/other.py",
+      "eric6/ThirdParty/Pygments/pygments/formatters/rtf.py",
+      "eric6/ThirdParty/Pygments/pygments/formatters/svg.py",
+      "eric6/ThirdParty/Pygments/pygments/formatters/terminal.py",
+      "eric6/ThirdParty/Pygments/pygments/formatters/terminal256.py",
+      "eric6/ThirdParty/Pygments/pygments/lexer.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/__init__.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_asy_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_cl_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_cocoa_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_csound_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_lasso_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_lua_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_mapping.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_mql_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_mysql_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_openedge_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_php_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_postgres_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_scilab_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_sourcemod_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_stan_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_stata_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_tsql_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_usd_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_vbscript_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/_vim_builtins.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/actionscript.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/agile.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/algebra.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/ambient.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/ampl.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/apl.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/archetype.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/arrow.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/asm.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/automation.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/bare.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/basic.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/bibtex.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/boa.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/business.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/c_cpp.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/c_like.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/capnproto.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/chapel.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/clean.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/compiled.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/configs.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/console.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/crystal.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/csound.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/css.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/d.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/dalvik.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/data.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/devicetree.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/diff.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/dotnet.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/dsls.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/dylan.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/ecl.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/eiffel.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/elm.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/email.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/erlang.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/esoteric.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/ezhil.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/factor.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/fantom.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/felix.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/floscript.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/forth.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/fortran.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/foxpro.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/freefem.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/functional.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/gdscript.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/go.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/grammar_notation.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/graph.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/graphics.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/haskell.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/haxe.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/hdl.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/hexdump.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/html.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/idl.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/igor.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/inferno.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/installers.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/int_fiction.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/iolang.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/j.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/javascript.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/julia.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/jvm.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/lisp.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/make.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/markup.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/math.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/matlab.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/mime.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/ml.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/modeling.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/modula2.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/monte.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/mosel.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/ncl.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/nimrod.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/nit.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/nix.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/oberon.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/objective.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/ooc.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/other.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/parasail.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/parsers.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/pascal.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/pawn.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/perl.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/php.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/pointless.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/pony.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/praat.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/prolog.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/promql.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/python.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/qvt.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/r.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/rdf.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/rebol.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/resource.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/ride.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/rnc.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/roboconf.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/robotframework.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/ruby.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/rust.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/sas.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/scdoc.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/scripting.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/sgf.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/shell.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/sieve.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/slash.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/smalltalk.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/smv.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/snobol.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/solidity.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/special.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/sql.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/stata.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/supercollider.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/tcl.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/templates.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/teraterm.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/testing.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/text.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/textedit.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/textfmts.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/theorem.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/tnt.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/trafficscript.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/typoscript.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/unicon.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/urbi.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/usd.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/varnish.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/verification.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/web.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/webidl.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/webmisc.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/whiley.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/x10.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/xorg.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/yang.py",
+      "eric6/ThirdParty/Pygments/pygments/lexers/zig.py",
+      "eric6/ThirdParty/Pygments/pygments/modeline.py",
+      "eric6/ThirdParty/Pygments/pygments/plugin.py",
+      "eric6/ThirdParty/Pygments/pygments/regexopt.py",
+      "eric6/ThirdParty/Pygments/pygments/scanner.py",
+      "eric6/ThirdParty/Pygments/pygments/sphinxext.py",
+      "eric6/ThirdParty/Pygments/pygments/style.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/__init__.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/abap.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/algol.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/algol_nu.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/arduino.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/autumn.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/borland.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/bw.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/colorful.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/default.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/emacs.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/friendly.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/fruity.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/igor.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/inkpot.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/lovelace.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/manni.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/monokai.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/murphy.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/native.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/paraiso_dark.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/paraiso_light.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/pastie.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/perldoc.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/rainbow_dash.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/rrt.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/sas.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/solarized.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/stata_dark.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/stata_light.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/tango.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/trac.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/vim.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/vs.py",
+      "eric6/ThirdParty/Pygments/pygments/styles/xcode.py",
+      "eric6/ThirdParty/Pygments/pygments/token.py",
+      "eric6/ThirdParty/Pygments/pygments/unistring.py",
+      "eric6/ThirdParty/Pygments/pygments/util.py",
+      "eric6/ThirdParty/Send2Trash/__init__.py",
+      "eric6/ThirdParty/Send2Trash/send2trash/__init__.py",
+      "eric6/ThirdParty/Send2Trash/send2trash/compat.py",
+      "eric6/ThirdParty/Send2Trash/send2trash/exceptions.py",
+      "eric6/ThirdParty/Send2Trash/send2trash/plat_gio.py",
+      "eric6/ThirdParty/Send2Trash/send2trash/plat_osx.py",
+      "eric6/ThirdParty/Send2Trash/send2trash/plat_other.py",
+      "eric6/ThirdParty/Send2Trash/send2trash/plat_win.py",
+      "eric6/ThirdParty/__init__.py",
+      "eric6/ThirdParty/asttokens/__init__.py",
+      "eric6/ThirdParty/asttokens/asttokens/__init__.py",
+      "eric6/ThirdParty/asttokens/asttokens/asttokens.py",
+      "eric6/ThirdParty/asttokens/asttokens/line_numbers.py",
+      "eric6/ThirdParty/asttokens/asttokens/mark_tokens.py",
+      "eric6/ThirdParty/asttokens/asttokens/util.py",
+      "eric6/ThirdParty/asttokens/asttokens/version.py",
+      "eric6/Toolbox/SingleApplication.py",
+      "eric6/Toolbox/Startup.py",
+      "eric6/Toolbox/__init__.py",
+      "eric6/Tools/TRPreviewer.py",
+      "eric6/Tools/TRSingleApplication.py",
+      "eric6/Tools/TrayStarter.py",
+      "eric6/Tools/UIPreviewer.py",
+      "eric6/Tools/__init__.py",
+      "eric6/Tools/webBrowserSupport.py",
+      "eric6/UI/AuthenticationDialog.py",
+      "eric6/UI/Browser.py",
+      "eric6/UI/BrowserModel.py",
+      "eric6/UI/BrowserSortFilterProxyModel.py",
+      "eric6/UI/ClearPrivateDataDialog.py",
+      "eric6/UI/CodeDocumentationViewer.py",
+      "eric6/UI/CodeDocumentationViewerTemplate.py",
+      "eric6/UI/CompareDialog.py",
+      "eric6/UI/Config.py",
+      "eric6/UI/DeleteFilesConfirmationDialog.py",
+      "eric6/UI/DiffDialog.py",
+      "eric6/UI/DiffHighlighter.py",
+      "eric6/UI/EmailDialog.py",
+      "eric6/UI/ErrorLogDialog.py",
+      "eric6/UI/FindFileDialog.py",
+      "eric6/UI/FindFileNameDialog.py",
+      "eric6/UI/Info.py",
+      "eric6/UI/InstallInfoDialog.py",
+      "eric6/UI/LogView.py",
+      "eric6/UI/NotificationWidget.py",
+      "eric6/UI/NumbersWidget.py",
+      "eric6/UI/PixmapCache.py",
+      "eric6/UI/Previewer.py",
+      "eric6/UI/Previewers/MarkdownExtensions.py",
+      "eric6/UI/Previewers/PreviewerHTML.py",
+      "eric6/UI/Previewers/PreviewerHTMLStyles.py",
+      "eric6/UI/Previewers/PreviewerQSS.py",
+      "eric6/UI/Previewers/__init__.py",
+      "eric6/UI/PythonAstViewer.py",
+      "eric6/UI/PythonDisViewer.py",
+      "eric6/UI/SearchWidget.py",
+      "eric6/UI/SplashScreen.py",
+      "eric6/UI/SymbolsWidget.py",
+      "eric6/UI/UserInterface.py",
+      "eric6/UI/__init__.py",
+      "eric6/UI/data/__init__.py",
+      "eric6/Utilities/AutoSaver.py",
+      "eric6/Utilities/BackgroundClient.py",
+      "eric6/Utilities/BackgroundService.py",
+      "eric6/Utilities/ClassBrowsers/ClbrBaseClasses.py",
+      "eric6/Utilities/ClassBrowsers/__init__.py",
+      "eric6/Utilities/ClassBrowsers/idlclbr.py",
+      "eric6/Utilities/ClassBrowsers/jsclbr.py",
+      "eric6/Utilities/ClassBrowsers/protoclbr.py",
+      "eric6/Utilities/ClassBrowsers/pyclbr.py",
+      "eric6/Utilities/ClassBrowsers/rbclbr.py",
+      "eric6/Utilities/FtpUtilities.py",
+      "eric6/Utilities/GetSysPath.py",
+      "eric6/Utilities/MimeTypes.py",
+      "eric6/Utilities/ModuleParser.py",
+      "eric6/Utilities/MouseUtilities.py",
+      "eric6/Utilities/PasswordChecker.py",
+      "eric6/Utilities/PySideImporter.py",
+      "eric6/Utilities/__init__.py",
+      "eric6/Utilities/crypto/__init__.py",
+      "eric6/Utilities/crypto/py3AES.py",
+      "eric6/Utilities/crypto/py3PBKDF2.py",
+      "eric6/Utilities/uic.py",
+      "eric6/VCS/CommandOptionsDialog.py",
+      "eric6/VCS/ProjectBrowserHelper.py",
+      "eric6/VCS/ProjectHelper.py",
+      "eric6/VCS/RepositoryInfoDialog.py",
+      "eric6/VCS/StatusMonitorLed.py",
+      "eric6/VCS/StatusMonitorThread.py",
+      "eric6/VCS/VersionControl.py",
+      "eric6/VCS/__init__.py",
+      "eric6/ViewManager/BookmarkedFilesDialog.py",
+      "eric6/ViewManager/ViewManager.py",
+      "eric6/ViewManager/__init__.py",
+      "eric6/VirtualEnv/VirtualenvAddEditDialog.py",
+      "eric6/VirtualEnv/VirtualenvConfigurationDialog.py",
+      "eric6/VirtualEnv/VirtualenvExecDialog.py",
+      "eric6/VirtualEnv/VirtualenvInterpreterSelectionDialog.py",
+      "eric6/VirtualEnv/VirtualenvManager.py",
+      "eric6/VirtualEnv/VirtualenvManagerDialog.py",
+      "eric6/VirtualEnv/VirtualenvNameDialog.py",
+      "eric6/VirtualEnv/__init__.py",
+      "eric6/WebBrowser/AdBlock/AdBlockDialog.py",
+      "eric6/WebBrowser/AdBlock/AdBlockExceptionsDialog.py",
+      "eric6/WebBrowser/AdBlock/AdBlockIcon.py",
+      "eric6/WebBrowser/AdBlock/AdBlockManager.py",
+      "eric6/WebBrowser/AdBlock/AdBlockMatcher.py",
+      "eric6/WebBrowser/AdBlock/AdBlockPage.py",
+      "eric6/WebBrowser/AdBlock/AdBlockRule.py",
+      "eric6/WebBrowser/AdBlock/AdBlockSearchTree.py",
+      "eric6/WebBrowser/AdBlock/AdBlockSubscription.py",
+      "eric6/WebBrowser/AdBlock/AdBlockTreeWidget.py",
+      "eric6/WebBrowser/AdBlock/AdBlockUrlInterceptor.py",
+      "eric6/WebBrowser/AdBlock/__init__.py",
+      "eric6/WebBrowser/AutoScroll/AutoScroller.py",
+      "eric6/WebBrowser/AutoScroll/FrameScroller.py",
+      "eric6/WebBrowser/AutoScroll/__init__.py",
+      "eric6/WebBrowser/Bookmarks/AddBookmarkDialog.py",
+      "eric6/WebBrowser/Bookmarks/BookmarkNode.py",
+      "eric6/WebBrowser/Bookmarks/BookmarkPropertiesDialog.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksDialog.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksImportDialog.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksImporters/BookmarksImporter.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksImporters/ChromeImporter.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksImporters/FirefoxImporter.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksImporters/HtmlImporter.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksImporters/IExplorerImporter.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksImporters/OperaImporter.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksImporters/SafariImporter.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksImporters/XbelImporter.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksImporters/__init__.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksManager.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksMenu.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksModel.py",
+      "eric6/WebBrowser/Bookmarks/BookmarksToolBar.py",
+      "eric6/WebBrowser/Bookmarks/NsHtmlReader.py",
+      "eric6/WebBrowser/Bookmarks/NsHtmlWriter.py",
+      "eric6/WebBrowser/Bookmarks/XbelReader.py",
+      "eric6/WebBrowser/Bookmarks/XbelWriter.py",
+      "eric6/WebBrowser/Bookmarks/__init__.py",
+      "eric6/WebBrowser/ClosedTabsManager.py",
+      "eric6/WebBrowser/CookieJar/CookieExceptionsModel.py",
+      "eric6/WebBrowser/CookieJar/CookieJar.py",
+      "eric6/WebBrowser/CookieJar/CookiesConfigurationDialog.py",
+      "eric6/WebBrowser/CookieJar/CookiesDialog.py",
+      "eric6/WebBrowser/CookieJar/CookiesExceptionsDialog.py",
+      "eric6/WebBrowser/CookieJar/__init__.py",
+      "eric6/WebBrowser/Download/DownloadAskActionDialog.py",
+      "eric6/WebBrowser/Download/DownloadItem.py",
+      "eric6/WebBrowser/Download/DownloadManager.py",
+      "eric6/WebBrowser/Download/DownloadManagerButton.py",
+      "eric6/WebBrowser/Download/DownloadModel.py",
+      "eric6/WebBrowser/Download/DownloadUtilities.py",
+      "eric6/WebBrowser/Download/__init__.py",
+      "eric6/WebBrowser/FeaturePermissions/FeaturePermissionBar.py",
+      "eric6/WebBrowser/FeaturePermissions/FeaturePermissionManager.py",
+      "eric6/WebBrowser/FeaturePermissions/FeaturePermissionsDialog.py",
+      "eric6/WebBrowser/FeaturePermissions/__init__.py",
+      "eric6/WebBrowser/Feeds/FeedEditDialog.py",
+      "eric6/WebBrowser/Feeds/FeedsDialog.py",
+      "eric6/WebBrowser/Feeds/FeedsManager.py",
+      "eric6/WebBrowser/Feeds/__init__.py",
+      "eric6/WebBrowser/FlashCookieManager/FlashCookie.py",
+      "eric6/WebBrowser/FlashCookieManager/FlashCookieManager.py",
+      "eric6/WebBrowser/FlashCookieManager/FlashCookieManagerDialog.py",
+      "eric6/WebBrowser/FlashCookieManager/FlashCookieNotification.py",
+      "eric6/WebBrowser/FlashCookieManager/FlashCookieReader.py",
+      "eric6/WebBrowser/FlashCookieManager/FlashCookieUtilities.py",
+      "eric6/WebBrowser/FlashCookieManager/__init__.py",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyAddScriptDialog.py",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationDialog.py",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationListDelegate.py",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationListWidget.py",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationScriptInfoDialog.py",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/__init__.py",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyDownloader.py",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyJavaScript.py",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyJsObject.py",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyManager.py",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyScript.py",
+      "eric6/WebBrowser/GreaseMonkey/__init__.py",
+      "eric6/WebBrowser/History/HistoryCompleter.py",
+      "eric6/WebBrowser/History/HistoryDialog.py",
+      "eric6/WebBrowser/History/HistoryFilterModel.py",
+      "eric6/WebBrowser/History/HistoryManager.py",
+      "eric6/WebBrowser/History/HistoryMenu.py",
+      "eric6/WebBrowser/History/HistoryModel.py",
+      "eric6/WebBrowser/History/HistoryTreeModel.py",
+      "eric6/WebBrowser/History/__init__.py",
+      "eric6/WebBrowser/ImageSearch/ImageSearchEngine.py",
+      "eric6/WebBrowser/ImageSearch/__init__.py",
+      "eric6/WebBrowser/JavaScript/ExternalJsObject.py",
+      "eric6/WebBrowser/JavaScript/PasswordManagerJsObject.py",
+      "eric6/WebBrowser/JavaScript/StartPageJsObject.py",
+      "eric6/WebBrowser/JavaScript/__init__.py",
+      "eric6/WebBrowser/Navigation/NavigationBar.py",
+      "eric6/WebBrowser/Navigation/NavigationContainer.py",
+      "eric6/WebBrowser/Navigation/ReloadStopButton.py",
+      "eric6/WebBrowser/Navigation/__init__.py",
+      "eric6/WebBrowser/Network/EricSchemeHandler.py",
+      "eric6/WebBrowser/Network/NetworkManager.py",
+      "eric6/WebBrowser/Network/NetworkUrlInterceptor.py",
+      "eric6/WebBrowser/Network/ProtocolHandlerManager.py",
+      "eric6/WebBrowser/Network/ProtocolHandlerManagerDialog.py",
+      "eric6/WebBrowser/Network/QtHelpSchemeHandler.py",
+      "eric6/WebBrowser/Network/SendRefererWhitelistDialog.py",
+      "eric6/WebBrowser/Network/SslErrorExceptionsDialog.py",
+      "eric6/WebBrowser/Network/UrlInterceptor.py",
+      "eric6/WebBrowser/Network/__init__.py",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/__init__.py",
+      "eric6/WebBrowser/OpenSearch/OpenSearchDialog.py",
+      "eric6/WebBrowser/OpenSearch/OpenSearchEditDialog.py",
+      "eric6/WebBrowser/OpenSearch/OpenSearchEngine.py",
+      "eric6/WebBrowser/OpenSearch/OpenSearchEngineAction.py",
+      "eric6/WebBrowser/OpenSearch/OpenSearchEngineModel.py",
+      "eric6/WebBrowser/OpenSearch/OpenSearchManager.py",
+      "eric6/WebBrowser/OpenSearch/OpenSearchReader.py",
+      "eric6/WebBrowser/OpenSearch/OpenSearchWriter.py",
+      "eric6/WebBrowser/OpenSearch/__init__.py",
+      "eric6/WebBrowser/PageScreenDialog.py",
+      "eric6/WebBrowser/Passwords/LoginForm.py",
+      "eric6/WebBrowser/Passwords/PasswordManager.py",
+      "eric6/WebBrowser/Passwords/PasswordModel.py",
+      "eric6/WebBrowser/Passwords/PasswordReader.py",
+      "eric6/WebBrowser/Passwords/PasswordWriter.py",
+      "eric6/WebBrowser/Passwords/PasswordsDialog.py",
+      "eric6/WebBrowser/Passwords/__init__.py",
+      "eric6/WebBrowser/PersonalInformationManager/PersonalDataDialog.py",
+      "eric6/WebBrowser/PersonalInformationManager/PersonalInformationManager.py",
+      "eric6/WebBrowser/PersonalInformationManager/__init__.py",
+      "eric6/WebBrowser/QtHelp/HelpDocsInstaller.py",
+      "eric6/WebBrowser/QtHelp/HelpIndexWidget.py",
+      "eric6/WebBrowser/QtHelp/HelpSearchWidget.py",
+      "eric6/WebBrowser/QtHelp/HelpTocWidget.py",
+      "eric6/WebBrowser/QtHelp/HelpTopicDialog.py",
+      "eric6/WebBrowser/QtHelp/QtHelpDocumentationDialog.py",
+      "eric6/WebBrowser/QtHelp/QtHelpDocumentationSelectionDialog.py",
+      "eric6/WebBrowser/QtHelp/__init__.py",
+      "eric6/WebBrowser/SafeBrowsing/SafeBrowsingAPIClient.py",
+      "eric6/WebBrowser/SafeBrowsing/SafeBrowsingCache.py",
+      "eric6/WebBrowser/SafeBrowsing/SafeBrowsingDialog.py",
+      "eric6/WebBrowser/SafeBrowsing/SafeBrowsingInfoWidget.py",
+      "eric6/WebBrowser/SafeBrowsing/SafeBrowsingLabel.py",
+      "eric6/WebBrowser/SafeBrowsing/SafeBrowsingManager.py",
+      "eric6/WebBrowser/SafeBrowsing/SafeBrowsingThreatList.py",
+      "eric6/WebBrowser/SafeBrowsing/SafeBrowsingUrl.py",
+      "eric6/WebBrowser/SafeBrowsing/__init__.py",
+      "eric6/WebBrowser/SearchWidget.py",
+      "eric6/WebBrowser/Session/SessionManager.py",
+      "eric6/WebBrowser/Session/SessionManagerDialog.py",
+      "eric6/WebBrowser/Session/__init__.py",
+      "eric6/WebBrowser/SiteInfo/SiteInfoDialog.py",
+      "eric6/WebBrowser/SiteInfo/SiteInfoWidget.py",
+      "eric6/WebBrowser/SiteInfo/__init__.py",
+      "eric6/WebBrowser/SpeedDial/Page.py",
+      "eric6/WebBrowser/SpeedDial/PageThumbnailer.py",
+      "eric6/WebBrowser/SpeedDial/SpeedDial.py",
+      "eric6/WebBrowser/SpeedDial/SpeedDialReader.py",
+      "eric6/WebBrowser/SpeedDial/SpeedDialWriter.py",
+      "eric6/WebBrowser/SpeedDial/__init__.py",
+      "eric6/WebBrowser/SpellCheck/ManageDictionariesDialog.py",
+      "eric6/WebBrowser/SpellCheck/__init__.py",
+      "eric6/WebBrowser/StatusBar/ImagesIcon.py",
+      "eric6/WebBrowser/StatusBar/JavaScriptIcon.py",
+      "eric6/WebBrowser/StatusBar/JavaScriptSettingsDialog.py",
+      "eric6/WebBrowser/StatusBar/StatusBarIcon.py",
+      "eric6/WebBrowser/StatusBar/__init__.py",
+      "eric6/WebBrowser/Sync/DirectorySyncHandler.py",
+      "eric6/WebBrowser/Sync/FtpSyncHandler.py",
+      "eric6/WebBrowser/Sync/SyncAssistantDialog.py",
+      "eric6/WebBrowser/Sync/SyncCheckPage.py",
+      "eric6/WebBrowser/Sync/SyncDataPage.py",
+      "eric6/WebBrowser/Sync/SyncDirectorySettingsPage.py",
+      "eric6/WebBrowser/Sync/SyncEncryptionPage.py",
+      "eric6/WebBrowser/Sync/SyncFtpSettingsPage.py",
+      "eric6/WebBrowser/Sync/SyncGlobals.py",
+      "eric6/WebBrowser/Sync/SyncHandler.py",
+      "eric6/WebBrowser/Sync/SyncHostTypePage.py",
+      "eric6/WebBrowser/Sync/SyncManager.py",
+      "eric6/WebBrowser/Sync/__init__.py",
+      "eric6/WebBrowser/TabManager/TabManagerWidget.py",
+      "eric6/WebBrowser/TabManager/__init__.py",
+      "eric6/WebBrowser/Tools/DelayedFileWatcher.py",
+      "eric6/WebBrowser/Tools/PrintToPdfDialog.py",
+      "eric6/WebBrowser/Tools/Scripts.py",
+      "eric6/WebBrowser/Tools/WebBrowserTools.py",
+      "eric6/WebBrowser/Tools/WebHitTestResult.py",
+      "eric6/WebBrowser/Tools/WebIconDialog.py",
+      "eric6/WebBrowser/Tools/WebIconLoader.py",
+      "eric6/WebBrowser/Tools/WebIconProvider.py",
+      "eric6/WebBrowser/Tools/__init__.py",
+      "eric6/WebBrowser/UrlBar/BookmarkActionSelectionDialog.py",
+      "eric6/WebBrowser/UrlBar/BookmarkInfoDialog.py",
+      "eric6/WebBrowser/UrlBar/FavIconLabel.py",
+      "eric6/WebBrowser/UrlBar/SslLabel.py",
+      "eric6/WebBrowser/UrlBar/StackedUrlBar.py",
+      "eric6/WebBrowser/UrlBar/UrlBar.py",
+      "eric6/WebBrowser/UrlBar/__init__.py",
+      "eric6/WebBrowser/UserAgent/UserAgentManager.py",
+      "eric6/WebBrowser/UserAgent/UserAgentMenu.py",
+      "eric6/WebBrowser/UserAgent/UserAgentModel.py",
+      "eric6/WebBrowser/UserAgent/UserAgentReader.py",
+      "eric6/WebBrowser/UserAgent/UserAgentWriter.py",
+      "eric6/WebBrowser/UserAgent/UserAgentsDialog.py",
+      "eric6/WebBrowser/UserAgent/__init__.py",
+      "eric6/WebBrowser/VirusTotal/VirusTotalApi.py",
+      "eric6/WebBrowser/VirusTotal/VirusTotalDomainReportDialog.py",
+      "eric6/WebBrowser/VirusTotal/VirusTotalIpReportDialog.py",
+      "eric6/WebBrowser/VirusTotal/VirusTotalWhoisDialog.py",
+      "eric6/WebBrowser/VirusTotal/__init__.py",
+      "eric6/WebBrowser/WebBrowserClearPrivateDataDialog.py",
+      "eric6/WebBrowser/WebBrowserJavaScriptConsole.py",
+      "eric6/WebBrowser/WebBrowserLanguagesDialog.py",
+      "eric6/WebBrowser/WebBrowserPage.py",
+      "eric6/WebBrowser/WebBrowserSingleApplication.py",
+      "eric6/WebBrowser/WebBrowserSnap.py",
+      "eric6/WebBrowser/WebBrowserTabBar.py",
+      "eric6/WebBrowser/WebBrowserTabWidget.py",
+      "eric6/WebBrowser/WebBrowserView.py",
+      "eric6/WebBrowser/WebBrowserWebSearchWidget.py",
+      "eric6/WebBrowser/WebBrowserWindow.py",
+      "eric6/WebBrowser/WebInspector.py",
+      "eric6/WebBrowser/ZoomManager/ZoomManager.py",
+      "eric6/WebBrowser/ZoomManager/ZoomValuesDialog.py",
+      "eric6/WebBrowser/ZoomManager/ZoomValuesModel.py",
+      "eric6/WebBrowser/ZoomManager/__init__.py",
+      "eric6/WebBrowser/__init__.py",
+      "eric6/WebBrowser/data/__init__.py",
+      "eric6/__init__.py",
+      "eric6/eric6.py",
+      "eric6/eric6.pyw",
+      "eric6/eric6_api.py",
+      "eric6/eric6_browser.py",
+      "eric6/eric6_browser.pyw",
+      "eric6/eric6_compare.py",
+      "eric6/eric6_compare.pyw",
+      "eric6/eric6_configure.py",
+      "eric6/eric6_configure.pyw",
+      "eric6/eric6_diff.py",
+      "eric6/eric6_diff.pyw",
+      "eric6/eric6_doc.py",
+      "eric6/eric6_editor.py",
+      "eric6/eric6_editor.pyw",
+      "eric6/eric6_hexeditor.py",
+      "eric6/eric6_hexeditor.pyw",
+      "eric6/eric6_iconeditor.py",
+      "eric6/eric6_iconeditor.pyw",
+      "eric6/eric6_plugininstall.py",
+      "eric6/eric6_plugininstall.pyw",
+      "eric6/eric6_pluginrepository.py",
+      "eric6/eric6_pluginrepository.pyw",
+      "eric6/eric6_pluginuninstall.py",
+      "eric6/eric6_pluginuninstall.pyw",
+      "eric6/eric6_post_install.py",
+      "eric6/eric6_qregularexpression.py",
+      "eric6/eric6_qregularexpression.pyw",
+      "eric6/eric6_re.py",
+      "eric6/eric6_re.pyw",
+      "eric6/eric6_shell.py",
+      "eric6/eric6_shell.pyw",
+      "eric6/eric6_snap.py",
+      "eric6/eric6_snap.pyw",
+      "eric6/eric6_sqlbrowser.py",
+      "eric6/eric6_sqlbrowser.pyw",
+      "eric6/eric6_tray.py",
+      "eric6/eric6_tray.pyw",
+      "eric6/eric6_trpreviewer.py",
+      "eric6/eric6_trpreviewer.pyw",
+      "eric6/eric6_uipreviewer.py",
+      "eric6/eric6_uipreviewer.pyw",
+      "eric6/eric6_unittest.py",
+      "eric6/eric6_unittest.pyw",
+      "eric6/eric6config.py",
+      "scripts/cleanupSource.py",
+      "scripts/compileUiFiles.py",
+      "scripts/create_windows_links.py",
+      "scripts/install-debugclients.py",
+      "scripts/install-i18n.py",
+      "scripts/install.py",
+      "scripts/patch_modpython.py",
+      "scripts/uninstall-debugclients.py",
+      "scripts/uninstall.py",
+      "setup.py"
+    ],
+    "FORMS": [
+      "eric6/CondaInterface/CondaExecDialog.ui",
+      "eric6/CondaInterface/CondaExportDialog.ui",
+      "eric6/CondaInterface/CondaInfoDialog.ui",
+      "eric6/CondaInterface/CondaNewEnvironmentDataDialog.ui",
+      "eric6/CondaInterface/CondaPackageDetailsWidget.ui",
+      "eric6/CondaInterface/CondaPackagesWidget.ui",
+      "eric6/Cooperation/ChatWidget.ui",
+      "eric6/DataViews/CodeMetricsDialog.ui",
+      "eric6/DataViews/PyCoverageDialog.ui",
+      "eric6/DataViews/PyProfileDialog.ui",
+      "eric6/Debugger/CallTraceViewer.ui",
+      "eric6/Debugger/EditBreakpointDialog.ui",
+      "eric6/Debugger/EditWatchpointDialog.ui",
+      "eric6/Debugger/ExceptionsFilterDialog.ui",
+      "eric6/Debugger/StartCoverageDialog.ui",
+      "eric6/Debugger/StartDebugDialog.ui",
+      "eric6/Debugger/StartHistoryEditDialog.ui",
+      "eric6/Debugger/StartProfileDialog.ui",
+      "eric6/Debugger/StartRunDialog.ui",
+      "eric6/Debugger/VariableDetailDialog.ui",
+      "eric6/Debugger/VariablesFilterDialog.ui",
+      "eric6/E5Gui/E5ErrorMessageFilterDialog.ui",
+      "eric6/E5Gui/E5ListSelectionDialog.ui",
+      "eric6/E5Gui/E5PlainTextDialog.ui",
+      "eric6/E5Gui/E5ProcessDialog.ui",
+      "eric6/E5Gui/E5SimpleHelpDialog.ui",
+      "eric6/E5Gui/E5StringListEditWidget.ui",
+      "eric6/E5Gui/E5ToolBarDialog.ui",
+      "eric6/E5Gui/E5ZoomWidget.ui",
+      "eric6/E5Network/E5NetworkHeaderDetailsDialog.ui",
+      "eric6/E5Network/E5SslCertificateSelectionDialog.ui",
+      "eric6/E5Network/E5SslCertificatesDialog.ui",
+      "eric6/E5Network/E5SslCertificatesInfoDialog.ui",
+      "eric6/E5Network/E5SslCertificatesInfoWidget.ui",
+      "eric6/Graphics/UMLSceneSizeDialog.ui",
+      "eric6/HexEdit/HexEditGotoWidget.ui",
+      "eric6/HexEdit/HexEditReplaceWidget.ui",
+      "eric6/HexEdit/HexEditSearchWidget.ui",
+      "eric6/IconEditor/IconSizeDialog.ui",
+      "eric6/MicroPython/CircuitPythonFirmwareSelectionDialog.ui",
+      "eric6/MicroPython/EspBackupRestoreFirmwareDialog.ui",
+      "eric6/MicroPython/EspFirmwareSelectionDialog.ui",
+      "eric6/MicroPython/IgnoredDevicesDialog.ui",
+      "eric6/MicroPython/MicroPythonFileManagerWidget.ui",
+      "eric6/MicroPython/MicroPythonProgressInfoDialog.ui",
+      "eric6/MicroPython/MicroPythonWidget.ui",
+      "eric6/MultiProject/AddProjectDialog.ui",
+      "eric6/MultiProject/PropertiesDialog.ui",
+      "eric6/Network/IRC/IrcChannelEditDialog.ui",
+      "eric6/Network/IRC/IrcChannelWidget.ui",
+      "eric6/Network/IRC/IrcIdentitiesEditDialog.ui",
+      "eric6/Network/IRC/IrcNetworkEditDialog.ui",
+      "eric6/Network/IRC/IrcNetworkListDialog.ui",
+      "eric6/Network/IRC/IrcNetworkWidget.ui",
+      "eric6/Network/IRC/IrcServerEditDialog.ui",
+      "eric6/Network/IRC/IrcWidget.ui",
+      "eric6/PipInterface/PipDialog.ui",
+      "eric6/PipInterface/PipFileSelectionDialog.ui",
+      "eric6/PipInterface/PipFreezeDialog.ui",
+      "eric6/PipInterface/PipPackageDetailsDialog.ui",
+      "eric6/PipInterface/PipPackagesInputDialog.ui",
+      "eric6/PipInterface/PipPackagesWidget.ui",
+      "eric6/PluginManager/PluginDetailsDialog.ui",
+      "eric6/PluginManager/PluginInfoDialog.ui",
+      "eric6/PluginManager/PluginInstallDialog.ui",
+      "eric6/PluginManager/PluginRepositoryDialog.ui",
+      "eric6/PluginManager/PluginUninstallDialog.ui",
+      "eric6/Plugins/AboutPlugin/AboutDialog.ui",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleAddBuiltinIgnoreDialog.ui",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCheckerDialog.ui",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleCodeSelectionDialog.ui",
+      "eric6/Plugins/CheckerPlugins/CodeStyleChecker/CodeStyleStatisticsDialog.ui",
+      "eric6/Plugins/CheckerPlugins/SyntaxChecker/SyntaxCheckerDialog.ui",
+      "eric6/Plugins/DocumentationPlugins/Ericapi/EricapiConfigDialog.ui",
+      "eric6/Plugins/DocumentationPlugins/Ericapi/EricapiExecDialog.ui",
+      "eric6/Plugins/DocumentationPlugins/Ericdoc/EricdocConfigDialog.ui",
+      "eric6/Plugins/DocumentationPlugins/Ericdoc/EricdocExecDialog.ui",
+      "eric6/Plugins/UiExtensionPlugins/Translator/ConfigurationPage/TranslatorPage.ui",
+      "eric6/Plugins/UiExtensionPlugins/Translator/TranslatorWidget.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/ConfigurationPage/GitPage.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitAddRemoteDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitApplyBundleDataDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitArchiveDataDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitBisectLogBrowserDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitBisectStartDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitBlameDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitBranchDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitBranchPushDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitBundleDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitChangeRemoteUrlDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitCherryPickDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitCommandDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitCommitDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitCopyDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitDescribeDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitDiffDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitFetchDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitListDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitLogBrowserDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitMergeDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitNewProjectOptionsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitOptionsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitPatchFilesDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitPatchStatisticsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitPullDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitPushDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitReflogBrowserDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitRemoteCredentialsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitRemoteRepositoriesDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitRevisionSelectionDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitRevisionsSelectionDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitStashBrowserDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitStashDataDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitStatusDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmoduleAddDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmodulesDeinitDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmodulesListDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmodulesStatusDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmodulesSummaryOptionsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmodulesSyncDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitSubmodulesUpdateOptionsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitTagBranchListDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitTagDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsGit/GitUserConfigDataDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/CloseheadExtension/HgCloseHeadSelectionDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ConfigurationPage/MercurialPage.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/GpgExtension/HgGpgSignDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/GpgExtension/HgGpgSignaturesDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgAddSubrepositoryDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgAnnotateDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgArchiveDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBackoutDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBookmarkDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBookmarkRenameDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBookmarksInOutDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBookmarksListDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBranchInputDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgBundleDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgClientPromptDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgCommandDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgCommitDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgConflictsListDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgCopyDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgDiffDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgExportDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgGraftDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgImportDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgLogBrowserDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgMergeDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgMultiRevisionSelectionDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgNewProjectOptionsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgOptionsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgPhaseDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgRemoveSubrepositoriesDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgRepoConfigDataDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgRevisionSelectionDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgRevisionsSelectionDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgStatusDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgSummaryDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgTagBranchListDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgTagDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigHostFingerprintDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HgUserConfigHostMinimumProtocolDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditCommitEditor.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditConfigDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/HisteditExtension/HgHisteditPlanEditor.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/LfConvertDataDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/LargefilesExtension/LfRevisionsInputDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/PurgeExtension/HgPurgeListDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesDefineGuardsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesFoldDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesGuardsSelectionDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesHeaderDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListAllGuardsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesListGuardsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesNewPatchDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesQueueManagementDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/QueuesExtension/HgQueuesRenamePatchDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/RebaseExtension/HgRebaseDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveBrowserDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelveDataDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgShelvesSelectionDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/ShelveExtension/HgUnshelveDataDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/StripExtension/HgStripDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/ConfigurationPage/SubversionPage.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnBlameDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnChangeListsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnCommandDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnCommitDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnCopyDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnDiffDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnLogBrowserDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnLoginDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnMergeDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnNewProjectOptionsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnOptionsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnPropDelDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnPropListDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnPropSetDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnRelocateDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnRepoBrowserDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnRevisionSelectionDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnStatusDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnSwitchDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnTagBranchListDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnTagDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/SvnUrlSelectionDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/ConfigurationPage/SubversionPage.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnBlameDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnChangeListsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnCommandDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnCommitDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnCopyDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnDiffDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnLogBrowserDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnMergeDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnNewProjectOptionsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnOptionsDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnPropListDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnPropSetDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnRelocateDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnRepoBrowserDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnRevisionSelectionDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnStatusDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnSwitchDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnTagBranchListDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnTagDialog.ui",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/SvnUrlSelectionDialog.ui",
+      "eric6/Plugins/WizardPlugins/ColorDialogWizard/ColorDialogWizardDialog.ui",
+      "eric6/Plugins/WizardPlugins/DotDesktopWizard/DotDesktopListSelectionDialog.ui",
+      "eric6/Plugins/WizardPlugins/DotDesktopWizard/DotDesktopWizardDialog.ui",
+      "eric6/Plugins/WizardPlugins/E5MessageBoxWizard/E5MessageBoxWizardDialog.ui",
+      "eric6/Plugins/WizardPlugins/EricPluginWizard/PluginWizardDialog.ui",
+      "eric6/Plugins/WizardPlugins/FileDialogWizard/FileDialogWizardDialog.ui",
+      "eric6/Plugins/WizardPlugins/FontDialogWizard/FontDialogWizardDialog.ui",
+      "eric6/Plugins/WizardPlugins/InputDialogWizard/InputDialogWizardDialog.ui",
+      "eric6/Plugins/WizardPlugins/MessageBoxWizard/MessageBoxWizardDialog.ui",
+      "eric6/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardCharactersDialog.ui",
+      "eric6/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardDialog.ui",
+      "eric6/Plugins/WizardPlugins/PyRegExpWizard/PyRegExpWizardRepeatDialog.ui",
+      "eric6/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardCharactersDialog.ui",
+      "eric6/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardDialog.ui",
+      "eric6/Plugins/WizardPlugins/QRegularExpressionWizard/QRegularExpressionWizardRepeatDialog.ui",
+      "eric6/Plugins/WizardPlugins/SetupWizard/SetupWizardDialog.ui",
+      "eric6/Preferences/ConfigurationPages/ApplicationPage.ui",
+      "eric6/Preferences/ConfigurationPages/CondaPage.ui",
+      "eric6/Preferences/ConfigurationPages/CooperationPage.ui",
+      "eric6/Preferences/ConfigurationPages/CorbaPage.ui",
+      "eric6/Preferences/ConfigurationPages/DebuggerGeneralPage.ui",
+      "eric6/Preferences/ConfigurationPages/DebuggerPython3Page.ui",
+      "eric6/Preferences/ConfigurationPages/DiffColoursPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorAPIsPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorAutocompletionPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorAutocompletionQScintillaPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorCalltipsPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorCalltipsQScintillaPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorDocViewerPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorExportersPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorFilePage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorGeneralPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorHighlightersPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorHighlightingStylesPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorKeywordsPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorLanguageTabIndentOverrideDialog.ui",
+      "eric6/Preferences/ConfigurationPages/EditorMouseClickHandlerPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorPropertiesPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorSearchPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorSpellCheckingPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorStylesPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorSyntaxPage.ui",
+      "eric6/Preferences/ConfigurationPages/EditorTypingPage.ui",
+      "eric6/Preferences/ConfigurationPages/EmailPage.ui",
+      "eric6/Preferences/ConfigurationPages/GraphicsPage.ui",
+      "eric6/Preferences/ConfigurationPages/HelpDocumentationPage.ui",
+      "eric6/Preferences/ConfigurationPages/HelpViewersPage.ui",
+      "eric6/Preferences/ConfigurationPages/HexEditorPage.ui",
+      "eric6/Preferences/ConfigurationPages/IconsPage.ui",
+      "eric6/Preferences/ConfigurationPages/IconsPreviewDialog.ui",
+      "eric6/Preferences/ConfigurationPages/InterfacePage.ui",
+      "eric6/Preferences/ConfigurationPages/IrcPage.ui",
+      "eric6/Preferences/ConfigurationPages/LogViewerPage.ui",
+      "eric6/Preferences/ConfigurationPages/MasterPasswordEntryDialog.ui",
+      "eric6/Preferences/ConfigurationPages/MicroPythonPage.ui",
+      "eric6/Preferences/ConfigurationPages/MimeTypesPage.ui",
+      "eric6/Preferences/ConfigurationPages/MultiProjectPage.ui",
+      "eric6/Preferences/ConfigurationPages/NetworkPage.ui",
+      "eric6/Preferences/ConfigurationPages/NotificationsPage.ui",
+      "eric6/Preferences/ConfigurationPages/PipPage.ui",
+      "eric6/Preferences/ConfigurationPages/PluginManagerPage.ui",
+      "eric6/Preferences/ConfigurationPages/PrinterPage.ui",
+      "eric6/Preferences/ConfigurationPages/ProjectBrowserPage.ui",
+      "eric6/Preferences/ConfigurationPages/ProjectPage.ui",
+      "eric6/Preferences/ConfigurationPages/ProtobufPage.ui",
+      "eric6/Preferences/ConfigurationPages/PythonPage.ui",
+      "eric6/Preferences/ConfigurationPages/QtPage.ui",
+      "eric6/Preferences/ConfigurationPages/SecurityPage.ui",
+      "eric6/Preferences/ConfigurationPages/ShellPage.ui",
+      "eric6/Preferences/ConfigurationPages/TasksPage.ui",
+      "eric6/Preferences/ConfigurationPages/TemplatesPage.ui",
+      "eric6/Preferences/ConfigurationPages/TrayStarterPage.ui",
+      "eric6/Preferences/ConfigurationPages/VcsPage.ui",
+      "eric6/Preferences/ConfigurationPages/ViewmanagerPage.ui",
+      "eric6/Preferences/ConfigurationPages/WebBrowserAppearancePage.ui",
+      "eric6/Preferences/ConfigurationPages/WebBrowserFlashCookieManagerPage.ui",
+      "eric6/Preferences/ConfigurationPages/WebBrowserInterfacePage.ui",
+      "eric6/Preferences/ConfigurationPages/WebBrowserPage.ui",
+      "eric6/Preferences/ConfigurationPages/WebBrowserSpellCheckingPage.ui",
+      "eric6/Preferences/ConfigurationPages/WebBrowserVirusTotalPage.ui",
+      "eric6/Preferences/MouseClickDialog.ui",
+      "eric6/Preferences/ProgramsDialog.ui",
+      "eric6/Preferences/ShortcutDialog.ui",
+      "eric6/Preferences/ShortcutsDialog.ui",
+      "eric6/Preferences/SubstyleDefinitionDialog.ui",
+      "eric6/Preferences/ToolConfigurationDialog.ui",
+      "eric6/Preferences/ToolGroupConfigurationDialog.ui",
+      "eric6/Preferences/ViewProfileSidebarsDialog.ui",
+      "eric6/Preferences/ViewProfileToolboxesDialog.ui",
+      "eric6/Project/AddDirectoryDialog.ui",
+      "eric6/Project/AddFileDialog.ui",
+      "eric6/Project/AddFoundFilesDialog.ui",
+      "eric6/Project/AddLanguageDialog.ui",
+      "eric6/Project/CreateDialogCodeDialog.ui",
+      "eric6/Project/DebuggerPropertiesDialog.ui",
+      "eric6/Project/FiletypeAssociationDialog.ui",
+      "eric6/Project/IdlCompilerDefineNameDialog.ui",
+      "eric6/Project/IdlCompilerOptionsDialog.ui",
+      "eric6/Project/LexerAssociationDialog.ui",
+      "eric6/Project/MakePropertiesDialog.ui",
+      "eric6/Project/NewDialogClassDialog.ui",
+      "eric6/Project/NewPythonPackageDialog.ui",
+      "eric6/Project/PropertiesDialog.ui",
+      "eric6/Project/QuickFindFile.ui",
+      "eric6/Project/RccCompilerOptionsDialog.ui",
+      "eric6/Project/SpellingPropertiesDialog.ui",
+      "eric6/Project/TranslationPropertiesDialog.ui",
+      "eric6/Project/UicCompilerOptionsDialog.ui",
+      "eric6/Project/UserPropertiesDialog.ui",
+      "eric6/PyUnit/UnittestDialog.ui",
+      "eric6/PyUnit/UnittestStacktraceDialog.ui",
+      "eric6/QScintilla/GotoDialog.ui",
+      "eric6/QScintilla/MarkupProviders/HyperlinkMarkupDialog.ui",
+      "eric6/QScintilla/MarkupProviders/ImageMarkupDialog.ui",
+      "eric6/QScintilla/ReplaceWidget.ui",
+      "eric6/QScintilla/SearchWidget.ui",
+      "eric6/QScintilla/ShellHistoryDialog.ui",
+      "eric6/QScintilla/SortOptionsDialog.ui",
+      "eric6/QScintilla/SpellCheckingDialog.ui",
+      "eric6/QScintilla/SpellingDictionaryEditDialog.ui",
+      "eric6/QScintilla/ZoomDialog.ui",
+      "eric6/Snapshot/SnapWidget.ui",
+      "eric6/SqlBrowser/SqlBrowserWidget.ui",
+      "eric6/SqlBrowser/SqlConnectionDialog.ui",
+      "eric6/Tasks/TaskFilterConfigDialog.ui",
+      "eric6/Tasks/TaskPropertiesDialog.ui",
+      "eric6/Templates/TemplatePropertiesDialog.ui",
+      "eric6/Templates/TemplateSingleVariableDialog.ui",
+      "eric6/UI/AuthenticationDialog.ui",
+      "eric6/UI/ClearPrivateDataDialog.ui",
+      "eric6/UI/CompareDialog.ui",
+      "eric6/UI/DeleteFilesConfirmationDialog.ui",
+      "eric6/UI/DiffDialog.ui",
+      "eric6/UI/EmailDialog.ui",
+      "eric6/UI/ErrorLogDialog.ui",
+      "eric6/UI/FindFileDialog.ui",
+      "eric6/UI/FindFileNameDialog.ui",
+      "eric6/UI/InstallInfoDialog.ui",
+      "eric6/UI/NotificationFrame.ui",
+      "eric6/UI/NumbersWidget.ui",
+      "eric6/UI/Previewers/PreviewerQSS.ui",
+      "eric6/UI/PythonDisViewer.ui",
+      "eric6/UI/SearchWidget.ui",
+      "eric6/UI/SearchWidgetLine.ui",
+      "eric6/UI/SymbolsWidget.ui",
+      "eric6/VCS/CommandOptionsDialog.ui",
+      "eric6/VCS/RepositoryInfoDialog.ui",
+      "eric6/ViewManager/BookmarkedFilesDialog.ui",
+      "eric6/VirtualEnv/VirtualenvAddEditDialog.ui",
+      "eric6/VirtualEnv/VirtualenvConfigurationDialog.ui",
+      "eric6/VirtualEnv/VirtualenvExecDialog.ui",
+      "eric6/VirtualEnv/VirtualenvInterpreterSelectionDialog.ui",
+      "eric6/VirtualEnv/VirtualenvManagerDialog.ui",
+      "eric6/VirtualEnv/VirtualenvNameDialog.ui",
+      "eric6/WebBrowser/AdBlock/AdBlockDialog.ui",
+      "eric6/WebBrowser/AdBlock/AdBlockExceptionsDialog.ui",
+      "eric6/WebBrowser/Bookmarks/AddBookmarkDialog.ui",
+      "eric6/WebBrowser/Bookmarks/BookmarkPropertiesDialog.ui",
+      "eric6/WebBrowser/Bookmarks/BookmarksDialog.ui",
+      "eric6/WebBrowser/Bookmarks/BookmarksImportDialog.ui",
+      "eric6/WebBrowser/CookieJar/CookieDetailsDialog.ui",
+      "eric6/WebBrowser/CookieJar/CookiesConfigurationDialog.ui",
+      "eric6/WebBrowser/CookieJar/CookiesDialog.ui",
+      "eric6/WebBrowser/CookieJar/CookiesExceptionsDialog.ui",
+      "eric6/WebBrowser/Download/DownloadAskActionDialog.ui",
+      "eric6/WebBrowser/Download/DownloadItem.ui",
+      "eric6/WebBrowser/Download/DownloadManager.ui",
+      "eric6/WebBrowser/FeaturePermissions/FeaturePermissionsDialog.ui",
+      "eric6/WebBrowser/Feeds/FeedEditDialog.ui",
+      "eric6/WebBrowser/Feeds/FeedsDialog.ui",
+      "eric6/WebBrowser/Feeds/FeedsManager.ui",
+      "eric6/WebBrowser/FlashCookieManager/FlashCookieManagerDialog.ui",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyAddScriptDialog.ui",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationDialog.ui",
+      "eric6/WebBrowser/GreaseMonkey/GreaseMonkeyConfiguration/GreaseMonkeyConfigurationScriptInfoDialog.ui",
+      "eric6/WebBrowser/History/HistoryDialog.ui",
+      "eric6/WebBrowser/Network/ProtocolHandlerManagerDialog.ui",
+      "eric6/WebBrowser/Network/SendRefererWhitelistDialog.ui",
+      "eric6/WebBrowser/Network/SslErrorExceptionsDialog.ui",
+      "eric6/WebBrowser/OpenSearch/OpenSearchDialog.ui",
+      "eric6/WebBrowser/OpenSearch/OpenSearchEditDialog.ui",
+      "eric6/WebBrowser/PageScreenDialog.ui",
+      "eric6/WebBrowser/Passwords/PasswordsDialog.ui",
+      "eric6/WebBrowser/PersonalInformationManager/PersonalDataDialog.ui",
+      "eric6/WebBrowser/QtHelp/HelpTopicDialog.ui",
+      "eric6/WebBrowser/QtHelp/QtHelpDocumentationDialog.ui",
+      "eric6/WebBrowser/QtHelp/QtHelpDocumentationSelectionDialog.ui",
+      "eric6/WebBrowser/SafeBrowsing/SafeBrowsingDialog.ui",
+      "eric6/WebBrowser/SearchWidget.ui",
+      "eric6/WebBrowser/Session/SessionManagerDialog.ui",
+      "eric6/WebBrowser/SiteInfo/SiteInfoDialog.ui",
+      "eric6/WebBrowser/SpellCheck/ManageDictionariesDialog.ui",
+      "eric6/WebBrowser/StatusBar/JavaScriptSettingsDialog.ui",
+      "eric6/WebBrowser/Sync/SyncCheckPage.ui",
+      "eric6/WebBrowser/Sync/SyncDataPage.ui",
+      "eric6/WebBrowser/Sync/SyncDirectorySettingsPage.ui",
+      "eric6/WebBrowser/Sync/SyncEncryptionPage.ui",
+      "eric6/WebBrowser/Sync/SyncFtpSettingsPage.ui",
+      "eric6/WebBrowser/Sync/SyncHostTypePage.ui",
+      "eric6/WebBrowser/Tools/PrintToPdfDialog.ui",
+      "eric6/WebBrowser/Tools/WebIconDialog.ui",
+      "eric6/WebBrowser/UrlBar/BookmarkActionSelectionDialog.ui",
+      "eric6/WebBrowser/UrlBar/BookmarkInfoDialog.ui",
+      "eric6/WebBrowser/UserAgent/UserAgentsDialog.ui",
+      "eric6/WebBrowser/VirusTotal/VirusTotalDomainReportDialog.ui",
+      "eric6/WebBrowser/VirusTotal/VirusTotalIpReportDialog.ui",
+      "eric6/WebBrowser/VirusTotal/VirusTotalWhoisDialog.ui",
+      "eric6/WebBrowser/WebBrowserClearPrivateDataDialog.ui",
+      "eric6/WebBrowser/WebBrowserLanguagesDialog.ui",
+      "eric6/WebBrowser/ZoomManager/ZoomValuesDialog.ui"
+    ],
+    "RESOURCES": [],
+    "INTERFACES": [],
+    "PROTOCOLS": [],
+    "OTHERS": [
+      ".hgignore",
+      "DTDs",
+      "Dictionaries",
+      "MANIFEST.in",
+      "docs/LICENSE.GPL3",
+      "docs/README-MacOSX.rst",
+      "docs/README-eric6-doc.rst",
+      "docs/README-i18n.rst",
+      "docs/README-passive-debugging.rst",
+      "docs/README.rst",
+      "docs/THANKS",
+      "docs/changelog",
+      "eric6.e4p",
+      "eric6/APIs/MicroPython/calliope.api",
+      "eric6/APIs/MicroPython/circuitpython.api",
+      "eric6/APIs/MicroPython/microbit.api",
+      "eric6/APIs/MicroPython/micropython.api",
+      "eric6/APIs/Python/zope-2.10.7.api",
+      "eric6/APIs/Python/zope-2.11.2.api",
+      "eric6/APIs/Python/zope-3.3.1.api",
+      "eric6/APIs/Python3/PyQt4.bas",
+      "eric6/APIs/Python3/PyQt5.bas",
+      "eric6/APIs/Python3/PyQtChart.bas",
+      "eric6/APIs/Python3/PyQtWebEngine.bas",
+      "eric6/APIs/Python3/QScintilla2.bas",
+      "eric6/APIs/Python3/eric6.api",
+      "eric6/APIs/Python3/eric6.bas",
+      "eric6/APIs/QSS/qss.api",
+      "eric6/APIs/Ruby/Ruby-1.8.7.api",
+      "eric6/APIs/Ruby/Ruby-1.8.7.bas",
+      "eric6/APIs/Ruby/Ruby-1.9.1.api",
+      "eric6/APIs/Ruby/Ruby-1.9.1.bas",
+      "eric6/CSSs",
+      "eric6/CodeTemplates",
+      "eric6/DebugClients/Python/coverage/doc",
+      "eric6/DesignerTemplates",
+      "eric6/Documentation/Help",
+      "eric6/Documentation/Source",
+      "eric6/E5Network/data/effective_tld_names.dat",
+      "eric6/E5Network/data/test_psl.txt",
+      "eric6/IconEditor/cursors/aim-cursor.xpm",
+      "eric6/IconEditor/cursors/colorpicker-cursor.xpm",
+      "eric6/IconEditor/cursors/eraser-cursor.xpm",
+      "eric6/IconEditor/cursors/fill-cursor.xpm",
+      "eric6/IconEditor/cursors/paintbrush-cursor.xpm",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/deepl-dark.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/deepl-light.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/glosbe.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/googlev1.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/googlev2.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/ibm_watson-dark.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/ibm_watson-light.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/microsoft-dark.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/microsoft-light.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/mymemory-dark.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/mymemory-light.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/promt.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/yandex-dark.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/engines/yandex-light.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flag-dark.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flag-light.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/af.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/ar.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/be.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/bg.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/bs.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/ca.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/cs.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/da.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/de.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/el.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/en.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/es.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/et.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/fi.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/fr.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/ga.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/gl.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/he.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/hi.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/hr.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/hu.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/id.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/is.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/it.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/iw.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/ja.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/ka.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/ko.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/lt.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/lv.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/mk.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/mt.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/nl.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/no.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/pl.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/pt.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/ro.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/ru.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/sk.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/sl.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/sq.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/sr.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/sv.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/th.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/tl.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/tr.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/uk.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/vi.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/zh-CN.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/flags/zh-TW.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/pronounce-dark.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/pronounce-light.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/swap-dark.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/swap-light.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/translate-dark.svg",
+      "eric6/Plugins/UiExtensionPlugins/Translator/icons/translate-light.svg",
+      "eric6/Plugins/VcsPlugins/vcsGit/icons/conflict.svg",
+      "eric6/Plugins/VcsPlugins/vcsGit/icons/git.svg",
+      "eric6/Plugins/VcsPlugins/vcsGit/icons/git92.svg",
+      "eric6/Plugins/VcsPlugins/vcsGit/icons/preferences-git.svg",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/icons/mercurial.svg",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/icons/preferences-mercurial.svg",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/icons/startServer-dark.svg",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/icons/startServer-light.svg",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/icons/stopServer-dark.svg",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/icons/stopServer-light.svg",
+      "eric6/Plugins/VcsPlugins/vcsMercurial/templates/logBrowserBookmarkPhase.tmpl",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/icons/preferences-subversion.svg",
+      "eric6/Plugins/VcsPlugins/vcsPySvn/icons/pysvn.svg",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/icons/preferences-subversion.svg",
+      "eric6/Plugins/VcsPlugins/vcsSubversion/icons/subversion.svg",
+      "eric6/Plugins/ViewManagerPlugins/Listspace/preview.png",
+      "eric6/Plugins/ViewManagerPlugins/Tabview/preview.png",
+      "eric6/Plugins/WizardPlugins/SetupWizard/data/trove_classifiers.txt",
+      "eric6/Styles",
+      "eric6/ThirdParty/CharDet/LICENSE",
+      "eric6/ThirdParty/CharDet/README.rst",
+      "eric6/ThirdParty/EditorConfig/COPYING",
+      "eric6/ThirdParty/EditorConfig/LICENSE.BSD",
+      "eric6/ThirdParty/EditorConfig/LICENSE.PSF",
+      "eric6/ThirdParty/EditorConfig/README.rst",
+      "eric6/ThirdParty/Jasy/jasy/license.md",
+      "eric6/ThirdParty/Pygments/pygments/AUTHORS",
+      "eric6/ThirdParty/Pygments/pygments/CHANGES",
+      "eric6/ThirdParty/Pygments/pygments/LICENSE",
+      "eric6/ThirdParty/Pygments/pygments/PKG-INFO",
+      "eric6/ThirdParty/Send2Trash/LICENSE",
+      "eric6/ThirdParty/Send2Trash/PKG-INFO",
+      "eric6/ThirdParty/asttokens/asttokens/LICENSE",
+      "eric6/UI/data/documentViewerStyle-dark.css",
+      "eric6/UI/data/documentViewerStyle-light.css",
+      "eric6/WebBrowser/Bookmarks/DefaultBookmarks.xbel",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/Amazoncom.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/Bing.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/DeEn_Beolingus.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/DuckDuckGo.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/Facebook.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/Google.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/Google_Im_Feeling_Lucky.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/LEO_DeuEng.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/LinuxMagazin.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/MetaGer_MetaGer2.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/PyPI.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/Qwant.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/Reddit.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/StartPage_de.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/StartPage_en.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/Wikia.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/Wikia_en.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/Wikipedia.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/Wiktionary.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/Yahoo.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/YouTube.xml",
+      "eric6/WebBrowser/OpenSearch/DefaultSearchEngines/searxme.xml",
+      "eric6/WebBrowser/UserAgent/UserAgentDefaults.xml",
+      "eric6/WebBrowser/data/html/adblockPage.html",
+      "eric6/WebBrowser/data/html/authenticationErrorPage.html",
+      "eric6/WebBrowser/data/html/ericErrorPage.html",
+      "eric6/WebBrowser/data/html/speeddialPage.html",
+      "eric6/WebBrowser/data/html/startPage.html",
+      "eric6/WebBrowser/data/html/tabCrashPage.html",
+      "eric6/WebBrowser/data/icons/adBlockPlus16.png",
+      "eric6/WebBrowser/data/icons/adBlockPlus64.png",
+      "eric6/WebBrowser/data/icons/box-border-small.png",
+      "eric6/WebBrowser/data/icons/brokenPage.png",
+      "eric6/WebBrowser/data/icons/close.png",
+      "eric6/WebBrowser/data/icons/edit.png",
+      "eric6/WebBrowser/data/icons/ericWeb16.png",
+      "eric6/WebBrowser/data/icons/ericWeb32.png",
+      "eric6/WebBrowser/data/icons/loading.gif",
+      "eric6/WebBrowser/data/icons/plus.png",
+      "eric6/WebBrowser/data/icons/reload.png",
+      "eric6/WebBrowser/data/icons/setting.png",
+      "eric6/WebBrowser/data/javascript/jquery-ui.js",
+      "eric6/WebBrowser/data/javascript/jquery.js",
+      "eric6/WebBrowser/data/javascript/qwebchannel.js",
+      "eric6/icons",
+      "eric6/pixmaps",
+      "linux/eric6.appdata.xml",
+      "linux/eric6.appdata.xml.in",
+      "linux/eric6.desktop",
+      "linux/eric6.desktop.in",
+      "linux/eric6_browser.desktop",
+      "linux/eric6_browser.desktop.in",
+      "others/default.e4k",
+      "others/default_Mac.e4k",
+      "others/pylint.rc"
+    ],
+    "TRANSLATIONS": [
+      "eric6/i18n/eric6_cs.qm",
+      "eric6/i18n/eric6_cs.ts",
+      "eric6/i18n/eric6_de.qm",
+      "eric6/i18n/eric6_de.ts",
+      "eric6/i18n/eric6_empty.ts",
+      "eric6/i18n/eric6_en.qm",
+      "eric6/i18n/eric6_en.ts",
+      "eric6/i18n/eric6_es.qm",
+      "eric6/i18n/eric6_es.ts",
+      "eric6/i18n/eric6_fr.qm",
+      "eric6/i18n/eric6_fr.ts",
+      "eric6/i18n/eric6_it.qm",
+      "eric6/i18n/eric6_it.ts",
+      "eric6/i18n/eric6_pt.qm",
+      "eric6/i18n/eric6_pt.ts",
+      "eric6/i18n/eric6_ru.qm",
+      "eric6/i18n/eric6_ru.ts",
+      "eric6/i18n/eric6_tr.qm",
+      "eric6/i18n/eric6_tr.ts",
+      "eric6/i18n/eric6_zh_CN.qm",
+      "eric6/i18n/eric6_zh_CN.ts"
+    ],
+    "TRANSLATIONEXCEPTIONS": [],
+    "TRANSLATIONPATTERN": "eric6/i18n/eric6_%language%.ts",
+    "TRANSLATIONSBINPATH": "",
+    "MAINSCRIPT": "eric6/eric6.py",
+    "VCS": "Mercurial",
+    "VCSOPTIONS": {
+      "global": [
+        ""
+      ],
+      "commit": [
+        ""
+      ],
+      "checkout": [
+        ""
+      ],
+      "update": [
+        ""
+      ],
+      "add": [
+        ""
+      ],
+      "remove": [
+        ""
+      ],
+      "diff": [
+        ""
+      ],
+      "log": [
+        ""
+      ],
+      "history": [
+        ""
+      ],
+      "status": [
+        ""
+      ],
+      "tag": [
+        ""
+      ],
+      "export": [
+        ""
+      ]
+    },
+    "VCSOTHERDATA": {},
+    "AUTHOR": "Detlev Offenbach",
+    "EMAIL": "detlev@die-offenbachs.de",
+    "HASH": "df7daa8781250f7664e6ecaeaf1361fa2efd39ee",
+    "PROGLANGUAGE": "Python3",
+    "MIXEDLANGUAGE": true,
+    "PROJECTTYPE": "PyQt5",
+    "SPELLLANGUAGE": "en_US",
+    "SPELLWORDS": "Dictionaries/words.dic",
+    "SPELLEXCLUDES": "Dictionaries/excludes.dic",
+    "FILETYPES": {
+      "*.idl": "INTERFACES",
+      "*.js": "OTHERS",
+      "*.py": "SOURCES",
+      "*.py3": "SOURCES",
+      "*.pyw": "SOURCES",
+      "*.pyw3": "SOURCES",
+      "*.qm": "TRANSLATIONS",
+      "*.qrc": "RESOURCES",
+      "*.rb": "SOURCES",
+      "*.ts": "TRANSLATIONS",
+      "*.ui": "FORMS",
+      "*.ui.h": "FORMS",
+      "Ui_*.py": "__IGNORE__",
+      "build": "__IGNORE__"
+    },
+    "LEXERASSOCS": {},
+    "PROJECTTYPESPECIFICDATA": {},
+    "CHECKERSPARMS": {
+      "Pep8Checker": {
+        "AnnotationsChecker": {
+          "MaximumComplexity": 3,
+          "MinimumCoverage": 75
+        },
+        "BlankLines": [
+          2,
+          1
+        ],
+        "BuiltinsChecker": {
+          "bytes": [
+            "unicode"
+          ],
+          "chr": [
+            "unichr"
+          ],
+          "str": [
+            "unicode"
+          ]
+        },
+        "CommentedCodeChecker": {
+          "Aggressive": false,
+          "WhiteList": [
+            "pylint",
+            "pyright",
+            "noqa",
+            "type:\\s*ignore",
+            "fmt:\\s*(on|off)",
+            "TODO",
+            "FIXME",
+            "WARNING",
+            "NOTE",
+            "TEST",
+            "DOCU",
+            "XXX",
+            "- "
+          ]
+        },
+        "CopyrightAuthor": "",
+        "CopyrightMinFileSize": 0,
+        "DocstringType": "eric",
+        "EnabledCheckerCategories": "C, D, E, M, N, W",
+        "ExcludeFiles": "*/ThirdParty/*, */coverage/*, */Ui_*.py, */Examples/*, */*_rc.py,*/pycodestyle.py,*/pyflakes/checker.py,*/mccabe.py,*/eradicate.py",
+        "ExcludeMessages": "C101,E265,E266,E305,E402,M201,M301,M302,M303,M304,M305,M306,M307,M308,M311,M312,M313,M314,M315,M321,M701,M702,M811,M834,N802,N803,N807,N808,N821,W293,W504",
+        "FixCodes": "",
+        "FixIssues": false,
+        "FutureChecker": "",
+        "HangClosing": false,
+        "IncludeMessages": "",
+        "LineComplexity": 25,
+        "LineComplexityScore": 10,
+        "MaxCodeComplexity": 10,
+        "MaxDocLineLength": 79,
+        "MaxLineLength": 79,
+        "NoFixCodes": "E501",
+        "RepeatMessages": true,
+        "SecurityChecker": {
+          "CheckTypedException": false,
+          "HardcodedTmpDirectories": [
+            "/tmp",
+            "/var/tmp",
+            "/dev/shm",
+            "~/tmp"
+          ],
+          "InsecureHashes": [
+            "md4",
+            "md5",
+            "sha",
+            "sha1"
+          ],
+          "InsecureSslProtocolVersions": [
+            "PROTOCOL_SSLv2",
+            "SSLv2_METHOD",
+            "SSLv23_METHOD",
+            "PROTOCOL_SSLv3",
+            "PROTOCOL_TLSv1",
+            "SSLv3_METHOD",
+            "TLSv1_METHOD"
+          ],
+          "WeakKeySizeDsaHigh": "1024",
+          "WeakKeySizeDsaMedium": "2048",
+          "WeakKeySizeEcHigh": "160",
+          "WeakKeySizeEcMedium": "224",
+          "WeakKeySizeRsaHigh": "1024",
+          "WeakKeySizeRsaMedium": "2048"
+        },
+        "ShowIgnored": false,
+        "ValidEncodings": "latin-1, utf-8"
+      },
+      "SyntaxChecker": {
+        "ExcludeFiles": "*/coverage/*, */ThirdParty/*, */Examples/*"
+      },
+      "Tabnanny": {
+        "ExcludeFiles": "*/coverage/*, */ThirdParty/*, */Examples/*"
+      },
+      "Vulture": {
+        "ExcludeFiles": "*/ThirdParty/*, */coverage/*, Ui_*.py, */Examples/*",
+        "SlotsAreUsed": true,
+        "WhiteLists": {
+          "__patterns__": [
+            "visit_*",
+            "on_*",
+            "*Completer",
+            "visit*"
+          ],
+          "attribute": [],
+          "class": [],
+          "function": [
+            "getOpenEditorsCount",
+            "_vcsRemove",
+            "getType",
+            "getImport",
+            "readPlistFromBytes",
+            "vcsSetData",
+            "_getglobal"
+          ],
+          "property": [],
+          "slot": [],
+          "variable": [
+            "Complexity_Weak",
+            "Complexity_Good",
+            "Complexity_Strong"
+          ]
+        }
+      }
+    },
+    "PACKAGERSPARMS": {},
+    "DOCUMENTATIONPARMS": {
+      "ERIC4API": {
+        "ignoreDirectories": [
+          "CSSs",
+          "DTDs",
+          "DesignerTemplates",
+          "Documentation",
+          "Examples",
+          "ThirdParty",
+          "corbatests",
+          "i18n",
+          "icons",
+          "pixmaps",
+          "tests",
+          "unittests",
+          "Styles",
+          "CodeTemplates",
+          ".ropeproject",
+          "patches",
+          "Dictionaries",
+          "coverage",
+          ".eric5project",
+          "_eric5project",
+          "_ropeproject",
+          ".hg",
+          "_hg",
+          ".directory",
+          ".issues",
+          "data",
+          "pyflakes",
+          ".eric6project",
+          "_eric6project"
+        ],
+        "ignoreFilePatterns": [
+          "Ui_*"
+        ],
+        "languages": [
+          "Python3"
+        ],
+        "outputFile": "eric6/APIs/%L/eric6.api",
+        "useRecursion": true
+      },
+      "ERIC4DOC": {
+        "CFBgColor": "#4fa4ff",
+        "CFColor": "#ffffff",
+        "Level1HeaderBgColor": "#4fa4ff",
+        "Level1HeaderColor": "#ffffff",
+        "Level2HeaderBgColor": "#00557f",
+        "Level2HeaderColor": "#ffffff",
+        "LinkColor": "#aa5500",
+        "cssFile": "eric6/CSSs/default.css",
+        "ignoreDirectories": [
+          "CSSs",
+          "DTDs",
+          "DesignerTemplates",
+          "Documentation",
+          "Examples",
+          "ThirdParty",
+          "corbatests",
+          "i18n",
+          "icons",
+          "pixmaps",
+          "tests",
+          "unittests",
+          "rb_tests",
+          "Styles",
+          "CodeTemplates",
+          ".ropeproject",
+          "patches",
+          "Dictionaries",
+          "coverage",
+          ".eric5project",
+          "_eric5project",
+          "_ropeproject",
+          ".hg",
+          "_hg",
+          ".directory",
+          ".issues",
+          "pyflakes",
+          ".eric6project",
+          "_eric6project"
+        ],
+        "ignoreFilePatterns": [
+          "Ui_*",
+          "*_rc.py"
+        ],
+        "outputDirectory": "eric6/Documentation/Source",
+        "qtHelpEnabled": true,
+        "qtHelpFilterAttributes": "eric6:ide",
+        "qtHelpFilterName": "eric6",
+        "qtHelpNamespace": "org.eric6.ide",
+        "qtHelpOutputDirectory": "eric6/Documentation/Help",
+        "qtHelpTitle": "The eric6 IDE",
+        "qtHelpVirtualFolder": "eric6",
+        "useRecursion": true
+      }
+    },
+    "OTHERTOOLSPARMS": {
+      "CodeMetrics": {
+        "ExcludeFiles": "*/ThirdParty/*, */coverage/*, Ui_*.py"
+      },
+      "RadonCodeMetrics": {
+        "ExcludeFiles": "*/ThirdParty/*, */coverage/*, Ui_*.py, *_rc.py"
+      }
+    },
+    "MAKEPARAMS": {
+      "MakeEnabled": false,
+      "MakeExecutable": "",
+      "MakeFile": "",
+      "MakeTarget": "",
+      "MakeParameters": "",
+      "MakeTestOnly": true
+    },
+    "IDLPARAMS": {
+      "IncludeDirs": [],
+      "DefinedNames": [],
+      "UndefinedNames": []
+    },
+    "UICPARAMS": {
+      "Package": "",
+      "PackagesRoot": "eric6",
+      "RcSuffix": ""
+    },
+    "RCCPARAMS": {
+      "CompressionThreshold": 70,
+      "CompressLevel": 0,
+      "CompressionDisable": false,
+      "PathPrefix": ""
+    },
+    "EOL": 1,
+    "DOCSTRING": ""
+  }
+}
\ No newline at end of file
--- a/eric6/Debugger/BreakPointModel.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Debugger/BreakPointModel.py	Mon Feb 01 13:25:37 2021 +0100
@@ -7,6 +7,8 @@
 Module implementing the Breakpoint model.
 """
 
+import copy
+
 from PyQt5.QtCore import pyqtSignal, Qt, QAbstractItemModel, QModelIndex
 
 
@@ -227,6 +229,19 @@
         self.breakpoints.append(bp)
         self.endInsertRows()
     
+    def addBreakPoints(self, breakpoints):
+        """
+        Public method to add multiple breakpoints to the list.
+        
+        @param breakpoints list of breakpoints with file name, line number,
+            condition, temporary flag, enabled flag and ignore count each
+        @type list of (str, int, str, bool, bool, int)
+        """
+        cnt = len(self.breakpoints)
+        self.beginInsertRows(QModelIndex(), cnt, cnt + len(breakpoints) - 1)
+        self.breakpoints += breakpoints
+        self.endInsertRows()
+    
     def setBreakPointByIndex(self, index, fn, line, properties):
         """
         Public method to set the values of a breakpoint given by index.
@@ -321,7 +336,16 @@
             return self.breakpoints[index.row()][:]  # return a copy
         else:
             return []
-
+    
+    def getAllBreakpoints(self):
+        """
+        Public method to get a copy of the breakpoints.
+        
+        @return list of breakpoints
+        @rtype list of list of [str, int, str, bool, bool, int]
+        """
+        return copy.deepcopy(self.breakpoints)
+    
     def getBreakPointIndex(self, fn, lineno):
         """
         Public method to get the index of a breakpoint given by filename and
--- a/eric6/Debugger/WatchPointModel.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Debugger/WatchPointModel.py	Mon Feb 01 13:25:37 2021 +0100
@@ -7,6 +7,8 @@
 Module implementing the Watch expression model.
 """
 
+import copy
+
 from PyQt5.QtCore import pyqtSignal, Qt, QAbstractItemModel, QModelIndex
 
 
@@ -169,11 +171,13 @@
         """
         Public method to add a new watch expression to the list.
         
-        @param cond expression of the watch expression (string)
-        @param special special condition of the watch expression (string)
+        @param cond expression of the watch expression
+        @type str
+        @param special special condition of the watch expression
+        @type str
         @param properties properties of the watch expression
-            (tuple of temporary flag (bool), enabled flag (bool),
-            ignore count (integer))
+            (tuple of temporary flag, enabled flag, ignore count)
+        @type tuple of (bool, bool, int)
         """
         wp = [cond, special] + list(properties)
         cnt = len(self.watchpoints)
@@ -181,6 +185,19 @@
         self.watchpoints.append(wp)
         self.endInsertRows()
     
+    def addWatchPoints(self, watchpoints):
+        """
+        Public method to add multiple watch expressions to the list.
+        
+        @param watchpoints list of watch expressions with expression, special
+            condition, temporary flag, enabled flag and ignore count each
+        @type list of (str, str, bool, bool, int)
+        """
+        cnt = len(self.watchpoints)
+        self.beginInsertRows(QModelIndex(), cnt, cnt + len(watchpoints) - 1)
+        self.watchpoints += watchpoints
+        self.endInsertRows()
+    
     def setWatchPointByIndex(self, index, cond, special, properties):
         """
         Public method to set the values of a watch expression given by index.
@@ -198,10 +215,7 @@
             index2 = self.createIndex(
                 row, len(self.watchpoints[row]), self.watchpoints[row])
             self.dataAboutToBeChanged.emit(index1, index2)
-            i = 0
-            for value in [cond, special] + list(properties):
-                self.watchpoints[row][i] = value
-                i += 1
+            self.watchpoints[row] = [cond, special] + list(properties)
             self.dataChanged.emit(index1, index2)
 
     def setWatchPointEnabledByIndex(self, index, enabled):
@@ -265,14 +279,23 @@
         
         @param index index of the watch expression (QModelIndex)
         @return watch expression (list of six values (expression,
-            special condition, temporary flag, enabled flag, ignore count,
-            index))
+            special condition, temporary flag, enabled flag, ignore count))
+        @rtype tuple of (str, str, bool, bool, int)
         """
         if index.isValid():
             return self.watchpoints[index.row()][:]  # return a copy
         else:
             return []
-
+    
+    def getAllWatchpoints(self):
+        """
+        Public method to get the list of watchpoints.
+        
+        @return list of watchpoints
+        @rtype list of list of [str, str, bool, bool, int]
+        """
+        return copy.deepcopy(self.watchpoints)
+    
     def getWatchPointIndex(self, cond, special=""):
         """
         Public method to get the index of a watch expression given by
--- a/eric6/E5XML/DebuggerPropertiesWriter.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/E5XML/DebuggerPropertiesWriter.py	Mon Feb 01 13:25:37 2021 +0100
@@ -52,7 +52,7 @@
                 self.name))
         self.writeComment(
             " This file was generated automatically, do not edit. ")
-        if Preferences.getProject("XMLTimestamp"):
+        if Preferences.getProject("TimestampFile"):
             self.writeComment(
                 " Saved: {0} ".format(time.strftime('%Y-%m-%d, %H:%M:%S')))
         
--- a/eric6/E5XML/HighlightingStylesReader.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/E5XML/HighlightingStylesReader.py	Mon Feb 01 13:25:37 2021 +0100
@@ -8,8 +8,6 @@
 Module implementing a class for reading a highlighting styles XML file.
 """
 
-from PyQt5.QtGui import QColor, QFont
-
 from .Config import highlightingStylesFileFormatVersion
 from .XMLStreamReaderBase import XMLStreamReaderBase
 
@@ -25,7 +23,8 @@
         Constructor
         
         @param device reference to the I/O device to read from (QIODevice)
-        @param lexers list of lexer objects for which to export the styles
+        @param lexers dictionary of lexer objects for which to import the
+            styles
         """
         XMLStreamReaderBase.__init__(self, device)
         
@@ -37,6 +36,8 @@
         """
         Public method to read and parse the XML document.
         """
+        self.__lexersList = []
+        
         while not self.atEnd():
             self.readNext()
             if self.isStartElement():
@@ -52,12 +53,18 @@
                     self.raiseUnexpectedStartTag(self.name())
         
         self.showErrorMessage()
+        
+        return self.__lexersList
     
     def __readLexer(self):
         """
         Private method to read the lexer info.
         """
         language = self.attribute("name")
+        self.__lexersList.append({
+            "name": language,
+            "styles": [],
+        })
         if language and language in self.lexers:
             lexer = self.lexers[language]
         else:
@@ -87,31 +94,34 @@
                 substyle = int(self.attribute("substyle", "-1"))
                 # -1 is default for base styles
                 
-                # add sub-style if not already there
-                if not lexer.hasStyle(style, substyle):
-                    substyle = lexer.addSubstyle(style)
+                styleDict = {
+                    "style": style,
+                    "substyle": substyle,
+                }
                 
                 color = self.attribute("color")
                 if color:
-                    color = QColor(color)
+                    styleDict["color"] = color
                 else:
-                    color = lexer.defaultColor(style, substyle)
-                lexer.setColor(color, style, substyle)
+                    styleDict["color"] = (
+                        lexer.defaultColor(style, substyle).name()
+                    )
                 
                 paper = self.attribute("paper")
                 if paper:
-                    paper = QColor(paper)
+                    styleDict["paper"] = paper
                 else:
-                    paper = lexer.defaultPaper(style, substyle)
-                lexer.setPaper(paper, style, substyle)
+                    styleDict["paper"] = (
+                        lexer.defaultPaper(style, substyle).name()
+                    )
                 
                 fontStr = self.attribute("font")
                 if fontStr:
-                    font = QFont()
-                    font.fromString(fontStr)
+                    styleDict["font"] = fontStr
                 else:
-                    font = lexer.defaultFont(style, substyle)
-                lexer.setFont(font, style, substyle)
+                    styleDict["font"] = (
+                        lexer.defaultFont(style, substyle).toString()
+                    )
                 
                 eolfill = self.attribute("eolfill")
                 if eolfill:
@@ -120,26 +130,29 @@
                         eolfill = lexer.defaulEolFill(style, substyle)
                 else:
                     eolfill = lexer.defaulEolFill(style, substyle)
-                lexer.setEolFill(eolfill, style, substyle)
+                styleDict["eolfill"] = eolfill
         
                 while not self.atEnd():
                     self.readNext()
                     if self.isStartElement():
-                        if self.name() == "Description" and substyle >= 0:
-                            # description can only be set for sub-styles
+                        if self.name() == "Description":
                             description = self.readElementText().strip()
                             if not description:
                                 description = lexer.defaultDescription(
                                     style, substyle)
-                            lexer.setDescription(description, style, substyle)
-                        elif self.name() == "Words" and substyle >= 0:
-                            # words can only be set for sub-styles
+                            styleDict["description"] = description
+                        elif self.name() == "Words":
                             words = self.readElementText().strip()
                             if not words:
                                 words = lexer.defaultWords(style, substyle)
-                            lexer.setWords(words, style, substyle)
+                            styleDict["words"] = words
                     
                     if self.isEndElement() and self.name() == "Style":
+                        if "description" not in styleDict:
+                            styleDict["description"] = ""
+                        if "words" not in styleDict:
+                            styleDict["words"] = ""
+                        self.__lexersList[-1]["styles"].append(styleDict)
                         return
         
         while not self.atEnd():
--- a/eric6/E5XML/MultiProjectWriter.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/E5XML/MultiProjectWriter.py	Mon Feb 01 13:25:37 2021 +0100
@@ -47,7 +47,7 @@
         # add some generation comments
         self.writeComment(" eric multi project file for multi project {0} "
                           .format(self.name))
-        if Preferences.getMultiProject("XMLTimestamp"):
+        if Preferences.getMultiProject("TimestampFile"):
             self.writeComment(
                 " Saved: {0} ".format(time.strftime('%Y-%m-%d, %H:%M:%S')))
             self.writeComment(
--- a/eric6/E5XML/ProjectWriter.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/E5XML/ProjectWriter.py	Mon Feb 01 13:25:37 2021 +0100
@@ -67,7 +67,7 @@
         # add some generation comments
         self.writeComment(
             " eric project file for project {0} ".format(self.name))
-        if Preferences.getProject("XMLTimestamp"):
+        if Preferences.getProject("TimestampFile"):
             self.writeComment(
                 " Saved: {0} ".format(time.strftime('%Y-%m-%d, %H:%M:%S')))
         self.writeComment(" Copyright (C) {0} {1}, {2} ".format(
--- a/eric6/E5XML/SessionWriter.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/E5XML/SessionWriter.py	Mon Feb 01 13:25:37 2021 +0100
@@ -58,7 +58,7 @@
                 " eric session file for project {0} ".format(self.name))
         self.writeComment(
             " This file was generated automatically, do not edit. ")
-        if Preferences.getProject("XMLTimestamp") or isGlobal:
+        if Preferences.getProject("TimestampFile") or isGlobal:
             self.writeComment(
                 " Saved: {0} ".format(time.strftime('%Y-%m-%d, %H:%M:%S')))
         
@@ -110,7 +110,7 @@
         self.writeEndElement()
         
         aw = self.vm.getActiveName()
-        if aw and self.project.isProjectFile(aw):
+        if aw and (isGlobal or self.project.isProjectFile(aw)):
             ed = self.vm.getOpenEditor(aw)
             line, index = ed.getCursorPosition()
             self.writeStartElement("ActiveWindow")
--- a/eric6/E5XML/TasksReader.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/E5XML/TasksReader.py	Mon Feb 01 13:25:37 2021 +0100
@@ -68,7 +68,7 @@
                 elif self.name() == "ProjectScanFilter":
                     scanFilter = self.readElementText()
                     if self.forProject:
-                        self.viewer.projectTasksScanFilter = scanFilter
+                        self.viewer.setTasksScanFilter(scanFilter)
                 else:
                     self.raiseUnexpectedStartTag(self.name())
         
--- a/eric6/E5XML/TasksWriter.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/E5XML/TasksWriter.py	Mon Feb 01 13:25:37 2021 +0100
@@ -48,7 +48,7 @@
         if self.forProject:
             self.writeComment(
                 " eric tasks file for project {0} ".format(self.name))
-            if Preferences.getProject("XMLTimestamp"):
+            if Preferences.getProject("TimestampFile"):
                 self.writeComment(" Saved: {0} ".format(
                     time.strftime('%Y-%m-%d, %H:%M:%S')))
         else:
@@ -64,7 +64,7 @@
         if self.forProject:
             self.writeTextElement(
                 "ProjectScanFilter",
-                e5App().getObject("TaskViewer").projectTasksScanFilter.strip())
+                e5App().getObject("TaskViewer").getTasksScanFilter())
         
         # do the tasks
         if self.forProject:
--- a/eric6/E5XML/UserProjectWriter.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/E5XML/UserProjectWriter.py	Mon Feb 01 13:25:37 2021 +0100
@@ -49,7 +49,7 @@
         # add some generation comments
         self.writeComment(
             " eric user project file for project {0} ".format(self.name))
-        if Preferences.getProject("XMLTimestamp"):
+        if Preferences.getProject("TimestampFile"):
             self.writeComment(
                 " Saved: {0} ".format(time.strftime('%Y-%m-%d, %H:%M:%S')))
             self.writeComment(" Copyright (C) {0} {1}, {2} ".format(
--- a/eric6/MultiProject/MultiProject.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/MultiProject/MultiProject.py	Mon Feb 01 13:25:37 2021 +0100
@@ -27,6 +27,8 @@
 import Preferences
 import Utilities
 
+from .MultiProjectFile import MultiProjectFile
+
 
 class MultiProject(QObject):
     """
@@ -75,6 +77,8 @@
         
         self.__initData()
         
+        self.__multiProjectFile = MultiProjectFile(self)
+        
         self.recent = []
         self.__loadRecent()
         
@@ -217,43 +221,49 @@
     
     def __readMultiProject(self, fn):
         """
-        Private method to read in a multi project (.e4m, .e5m) file.
+        Private method to read in a multi project (.emj, .e4m, .e5m) file.
         
         @param fn filename of the multi project file to be read (string)
         @return flag indicating success
         """
-        f = QFile(fn)
-        if f.open(QIODevice.ReadOnly):
+        if os.path.splitext(fn)[1] == ".emj":
+            # new JSON based format
             with E5OverrideCursor():
-                from E5XML.MultiProjectReader import MultiProjectReader
-                reader = MultiProjectReader(f, self)
-                reader.readXML()
-                f.close()
-            if reader.hasError():
-                return False
+                res = self.__multiProjectFile.readFile(fn)
         else:
-            E5MessageBox.critical(
-                self.ui,
-                self.tr("Read multiproject file"),
-                self.tr(
-                    "<p>The multiproject file <b>{0}</b> could not be"
-                    " read.</p>").format(fn))
-            return False
-            
-        self.pfile = os.path.abspath(fn)
-        self.ppath = os.path.abspath(os.path.dirname(fn))
+            # old XML based format
+            f = QFile(fn)
+            if f.open(QIODevice.ReadOnly):
+                with E5OverrideCursor():
+                    from E5XML.MultiProjectReader import MultiProjectReader
+                    reader = MultiProjectReader(f, self)
+                    reader.readXML()
+                    f.close()
+                res = not reader.hasError()
+            else:
+                E5MessageBox.critical(
+                    self.ui,
+                    self.tr("Read Multi Project File"),
+                    self.tr(
+                        "<p>The multi project file <b>{0}</b> could not be"
+                        " read.</p>").format(fn))
+                res = False
         
-        self.__extractCategories()
-        
-        # insert filename into list of recently opened multi projects
-        self.__syncRecent()
+        if res:
+            self.pfile = os.path.abspath(fn)
+            self.ppath = os.path.abspath(os.path.dirname(fn))
+            
+            self.__extractCategories()
+            
+            # insert filename into list of recently opened multi projects
+            self.__syncRecent()
+            
+            self.name = os.path.splitext(os.path.basename(fn))[0]
+            
+            # check, if the files of the multi project still exist
+            self.__checkFilesExist()
         
-        self.name = os.path.splitext(os.path.basename(fn))[0]
-        
-        # check, if the files of the multi project still exist
-        self.__checkFilesExist()
-        
-        return True
+        return res
 
     def __writeMultiProject(self, fn=None):
         """
@@ -269,22 +279,27 @@
         if fn is None:
             fn = self.pfile
         
-        f = QFile(fn)
-        if f.open(QIODevice.WriteOnly):
-            from E5XML.MultiProjectWriter import MultiProjectWriter
-            MultiProjectWriter(
-                f,
-                self, os.path.splitext(os.path.basename(fn))[0]
-            ).writeXML()
-            res = True
+        if os.path.splitext(fn)[1] == ".emj":
+            # new JSON based format
+            res = self.__multiProjectFile.writeFile(fn)
         else:
-            E5MessageBox.critical(
-                self.ui,
-                self.tr("Save multiproject file"),
-                self.tr(
-                    "<p>The multiproject file <b>{0}</b> could not be "
-                    "written.</p>").format(fn))
-            res = False
+            # old XML based format
+            f = QFile(fn)
+            if f.open(QIODevice.WriteOnly):
+                from E5XML.MultiProjectWriter import MultiProjectWriter
+                MultiProjectWriter(
+                    f,
+                    self, os.path.splitext(os.path.basename(fn))[0]
+                ).writeXML()
+                res = True
+            else:
+                E5MessageBox.critical(
+                    self.ui,
+                    self.tr("Save Multi Project File"),
+                    self.tr(
+                        "<p>The multi project file <b>{0}</b> could not be "
+                        "written.</p>").format(fn))
+                res = False
         
         if res:
             self.pfile = os.path.abspath(fn)
@@ -531,9 +546,11 @@
         Public slot to open a multi project.
         
         @param fn optional filename of the multi project file to be
-            read (string)
+            read
+        @type str
         @param openMaster flag indicating, that the master project
-            should be opened depending on the configuration (boolean)
+            should be opened depending on the configuration
+        @rtype bool
         """
         if not self.checkDirty():
             return
@@ -541,10 +558,11 @@
         if fn is None:
             fn = E5FileDialog.getOpenFileName(
                 self.parent(),
-                self.tr("Open multiproject"),
+                self.tr("Open Multi Project"),
                 Preferences.getMultiProject("Workspace") or
                 Utilities.getHomeDir(),
-                self.tr("Multiproject Files (*.e5m *.e4m)"))
+                self.tr("Multi Project Files (*.emj);;"
+                        "XML Multi Project Files (*.e5m *.e4m)"))
             
             if fn == "":
                 fn = None
@@ -572,12 +590,15 @@
         """
         Public slot to save the current multi project.
         
-        @return flag indicating success (boolean)
+        @return flag indicating success
+        @rtype bool
         """
         if self.isDirty():
             if len(self.pfile) > 0:
-                if self.pfile.endswith(".e4m"):
-                    self.pfile = self.pfile.replace(".e4m", ".e5m")
+                if self.pfile.endswith((".e4m", ".e5m")):
+                    self.pfile = (self.pfile
+                                  .replace(".e4m", ".emj")
+                                  .replace(".e5m", ".emj"))
                     self.__syncRecent()
                 ok = self.__writeMultiProject()
             else:
@@ -590,9 +611,10 @@
         """
         Public slot to save the current multi project to a different file.
         
-        @return flag indicating success (boolean)
+        @return flag indicating success
+        @rtype bool
         """
-        defaultFilter = self.tr("Multiproject Files (*.e5m)")
+        defaultFilter = self.tr("Multi Project Files (*.emj)")
         if self.ppath:
             defaultPath = self.ppath
         else:
@@ -604,7 +626,8 @@
             self.parent(),
             self.tr("Save multiproject as"),
             defaultPath,
-            self.tr("Multiproject Files (*.e5m)"),
+            self.tr("Multi Project Files (*.emj);;"
+                    "XML Multi Project Files (*.e5m)"),
             defaultFilter,
             E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))
         
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/MultiProject/MultiProjectFile.py	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,113 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class representing the multi project JSON file.
+"""
+
+import json
+import os
+import time
+import typing
+
+from PyQt5.QtCore import QObject
+
+from E5Gui import E5MessageBox
+from E5Gui.E5OverrideCursor import E5OverridenCursor
+
+import Preferences
+
+MultiProject = typing.TypeVar("MultiProject")
+
+
+class MultiProjectFile(QObject):
+    """
+    Class representing the multi project JSON file.
+    """
+    def __init__(self, multiProject: MultiProject, parent: QObject = None):
+        """
+        Constructor
+        
+        @param multiProject reference to the multi project object
+        @type MultiProject
+        @param parent reference to the parent object (defaults to None)
+        @type QObject (optional)
+        """
+        super(MultiProjectFile, self).__init__(parent)
+        self.__multiProject = multiProject
+    
+    def writeFile(self, filename: str) -> bool:
+        """
+        Public method to write the multi project data to a multi project
+        JSON file.
+        
+        @param filename name of the multi project file
+        @type str
+        @return flag indicating a successful write
+        @rtype bool
+        """
+        name = os.path.splitext(os.path.basename(filename))[0]
+        
+        multiProjectDict = {}
+        multiProjectDict["header"] = {
+            "comment": f"eric multi project file for multi project {name}",
+        }
+        
+        if Preferences.getMultiProject("TimestampFile"):
+            multiProjectDict["header"]["saved"] = (
+                time.strftime('%Y-%m-%d, %H:%M:%S')
+            )
+        
+        multiProjectDict["description"] = self.__multiProject.description
+        multiProjectDict["projects"] = list(self.__multiProject.getProjects())
+        
+        try:
+            jsonString = json.dumps(multiProjectDict, indent=2)
+            with open(filename, "w") as f:
+                f.write(jsonString)
+        except (TypeError, EnvironmentError) as err:
+            with E5OverridenCursor():
+                E5MessageBox.critical(
+                    None,
+                    self.tr("Save Multi Project File"),
+                    self.tr(
+                        "<p>The multi project file <b>{0}</b> could not be "
+                        "written.</p><p>Reason: {1}</p>"
+                    ).format(filename, str(err))
+                )
+                return False
+        
+        return True
+    
+    def readFile(self, filename: str) -> bool:
+        """
+        Public method to read the multi project data from a multi project
+        JSON file.
+        
+        @param filename name of the multi project file
+        @type str
+        @return flag indicating a successful read
+        @rtype bool
+        """
+        try:
+            with open(filename, "r") as f:
+                jsonString = f.read()
+            multiProjectDict = json.loads(jsonString)
+        except (EnvironmentError, json.JSONDecodeError) as err:
+            E5MessageBox.critical(
+                None,
+                self.tr("Read Multi Project File"),
+                self.tr(
+                    "<p>The multi project file <b>{0}</b> could not be "
+                    "read.</p><p>Reason: {1}</p>"
+                ).format(filename, str(err))
+            )
+            return False
+        
+        self.__multiProject.description = multiProjectDict["description"]
+        for project in multiProjectDict["projects"]:
+            self.__multiProject.addProject(project)
+        
+        return True
--- a/eric6/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Preferences/ConfigurationPages/EditorHighlightingStylesPage.py	Mon Feb 01 13:25:37 2021 +0100
@@ -7,8 +7,10 @@
 Module implementing the Editor Highlighting Styles configuration page.
 """
 
+import os
+
 from PyQt5.QtCore import pyqtSlot, Qt, QFileInfo, QFile, QIODevice
-from PyQt5.QtGui import QPalette, QFont
+from PyQt5.QtGui import QPalette, QFont, QColor
 from PyQt5.QtWidgets import (
     QColorDialog, QFontDialog, QInputDialog, QMenu, QTreeWidgetItem, QDialog
 )
@@ -116,9 +118,6 @@
         self.styleGroup.setEnabled(False)
         self.lexer = None
         
-        self.exportCurrentButton.setEnabled(language != "")
-        self.importCurrentButton.setEnabled(language != "")
-        
         if not language:
             return
         
@@ -490,47 +489,68 @@
     #######################################################################
     
     @pyqtSlot()
-    def on_importCurrentButton_clicked(self):
+    def on_importButton_clicked(self):
         """
-        Private slot to import the styles of the current lexer.
+        Private slot to import styles to be selected.
         """
-        self.__importStyles({self.lexer.language(): self.lexer})
+        self.__importStyles(importAll=False)
     
     @pyqtSlot()
-    def on_exportCurrentButton_clicked(self):
+    def on_exportButton_clicked(self):
         """
-        Private slot to export the styles of the current lexer.
+        Private slot to export styles to be selected.
         """
-        self.__exportStyles([self.lexer])
+        self.__exportStyles(exportAll=False)
     
     @pyqtSlot()
     def on_importAllButton_clicked(self):
         """
         Private slot to import the styles of all lexers.
         """
-        self.__importStyles(self.lexers)
+        self.__importStyles(importAll=True)
     
     @pyqtSlot()
     def on_exportAllButton_clicked(self):
         """
         Private slot to export the styles of all lexers.
         """
-        self.__exportStyles(list(self.lexers.values()))
+        self.__exportStyles(exportAll=True)
     
-    def __exportStyles(self, lexers):
+    def __exportStyles(self, exportAll=False):
         """
-        Private method to export the styles of the given lexers.
+        Private method to export the styles of selectable lexers.
         
-        @param lexers list of lexer objects for which to export the styles
+        @param exportAll flag indicating to export all styles without asking
+            (defaults to False)
+        @type bool (optional)
         """
         from eric6config import getConfig
         stylesDir = getConfig("ericStylesDir")
         
+        lexerNames = list(self.lexers.keys())
+        if not exportAll:
+            if self.lexer:
+                preselect = [self.lexer.language()]
+            else:
+                preselect = []
+            from .EditorHighlightingStylesSelectionDialog import (
+                EditorHighlightingStylesSelectionDialog)
+            dlg = EditorHighlightingStylesSelectionDialog(
+                lexerNames, forImport=False, preselect=preselect)
+            if dlg.exec() == QDialog.Accepted:
+                lexerNames = dlg.getLexerNames()
+            else:
+                # Cancelled by user
+                return
+        
+        lexers = [self.lexers[name] for name in lexerNames]
+        
         fn, selectedFilter = E5FileDialog.getSaveFileNameAndFilter(
             self,
             self.tr("Export Highlighting Styles"),
             stylesDir,
-            self.tr("Highlighting styles file (*.e6h)"),
+            self.tr("Highlighting Styles File (*.ehj);;"
+                    "XML Highlighting Styles File (*.e6h)"),
             "",
             E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))
         
@@ -543,27 +563,46 @@
             if ex:
                 fn += ex
         
-        f = QFile(fn)
-        if f.open(QIODevice.WriteOnly):
-            from E5XML.HighlightingStylesWriter import HighlightingStylesWriter
-            HighlightingStylesWriter(f, lexers).writeXML()
-            f.close()
-        else:
-            E5MessageBox.critical(
+        if os.path.exists(fn):
+            ok = E5MessageBox.yesNo(
                 self,
                 self.tr("Export Highlighting Styles"),
-                self.tr(
-                    """<p>The highlighting styles could not be exported"""
-                    """ to file <b>{0}</b>.</p><p>Reason: {1}</p>""")
-                .format(fn, f.errorString())
-            )
+                self.tr("""<p>The highlighting styles file <b>{0}</b> exists"""
+                        """ already. Overwrite it?</p>""").format(fn))
+        else:
+            ok = True
+        
+        if ok:
+            if fn.endswith(".ehj"):
+                from Preferences.HighlightingStylesFile import (
+                    HighlightingStylesFile
+                )
+                highlightingStylesFile = HighlightingStylesFile()
+                highlightingStylesFile.writeFile(fn, lexers)
+            else:
+                f = QFile(fn)
+                if f.open(QIODevice.WriteOnly):
+                    from E5XML.HighlightingStylesWriter import (
+                        HighlightingStylesWriter
+                    )
+                    HighlightingStylesWriter(f, lexers).writeXML()
+                    f.close()
+                else:
+                    E5MessageBox.critical(
+                        self,
+                        self.tr("Export Highlighting Styles"),
+                        self.tr("<p>The highlighting styles file <b>{0}</b>"
+                                " could not be written.</p><p>Reason: {1}</p>")
+                        .format(fn, f.errorString())
+                    )
     
-    def __importStyles(self, lexers):
+    def __importStyles(self, importAll=False):
         """
-        Private method to import the styles of the given lexers.
+        Private method to import the styles of lexers to be selected.
         
-        @param lexers dictionary of lexer objects for which to import the
-            styles
+        @param importAll flag indicating to import all styles without asking
+            (defaults to False)
+        @type bool (optional)
         """
         from eric6config import getConfig
         stylesDir = getConfig("ericStylesDir")
@@ -572,31 +611,91 @@
             self,
             self.tr("Import Highlighting Styles"),
             stylesDir,
-            self.tr("Highlighting styles file (*.e6h *.e4h)"))
+            self.tr("Highlighting Styles File (*.ehj);;"
+                    "XML Highlighting Styles File (*.e6h *.e4h)"))
         
         if not fn:
             return
         
-        f = QFile(fn)
-        if f.open(QIODevice.ReadOnly):
-            from E5XML.HighlightingStylesReader import HighlightingStylesReader
-            reader = HighlightingStylesReader(f, lexers)
-            reader.readXML()
-            f.close()
+        if fn.endswith(".ehj"):
+            # new JSON based file
+            from Preferences.HighlightingStylesFile import (
+                HighlightingStylesFile
+            )
+            highlightingStylesFile = HighlightingStylesFile()
+            styles = highlightingStylesFile.readFile(fn)
+            if not styles:
+                return
         else:
-            E5MessageBox.critical(
-                self,
-                self.tr("Import Highlighting Styles"),
-                self.tr(
-                    """<p>The highlighting styles could not be read"""
-                    """ from file <b>{0}</b>.</p><p>Reason: {1}</p>""")
-                .format(fn, f.errorString())
-            )
-            return
+            # old XML based file
+            f = QFile(fn)
+            if f.open(QIODevice.ReadOnly):
+                from E5XML.HighlightingStylesReader import (
+                    HighlightingStylesReader
+                )
+                reader = HighlightingStylesReader(f, self.lexers)
+                styles = reader.readXML()
+                f.close()
+                if not styles:
+                    return
+            else:
+                E5MessageBox.critical(
+                    self,
+                    self.tr("Import Highlighting Styles"),
+                    self.tr(
+                        "<p>The highlighting styles file <b>{0}</b> could not"
+                        " be read.</p><p>Reason: {1}</p>"
+                    ).format(fn, f.errorString())
+                )
+                return
         
+        self.__applyStyles(styles, importAll=importAll)
         self.on_lexerLanguageComboBox_activated(
             self.lexerLanguageComboBox.currentText())
     
+    def __applyStyles(self, stylesList, importAll=False):
+        """
+        Private method to apply the imported styles to this dialog.
+        
+        @param stylesList list of imported lexer styles
+        @type list of dict
+        @param importAll flag indicating to import all styles without asking
+            (defaults to False)
+        @type bool (optional)
+        """
+        lexerNames = [d["name"]
+                      for d in stylesList
+                      if d["name"] in self.lexers]
+        
+        if not importAll:
+            from .EditorHighlightingStylesSelectionDialog import (
+                EditorHighlightingStylesSelectionDialog)
+            dlg = EditorHighlightingStylesSelectionDialog(
+                lexerNames, forImport=True)
+            if dlg.exec() == QDialog.Accepted:
+                lexerNames = dlg.getLexerNames()
+            else:
+                # Cancelled by user
+                return
+        
+        for lexerDict in stylesList:
+            if lexerDict["name"] in lexerNames:
+                lexer = self.lexers[lexerDict["name"]]
+                for styleDict in lexerDict["styles"]:
+                    style = styleDict["style"]
+                    substyle = styleDict["substyle"]
+                    lexer.setColor(QColor(styleDict["color"]), style, substyle)
+                    lexer.setPaper(QColor(styleDict["paper"]), style, substyle)
+                    font = QFont()
+                    font.fromString(styleDict["font"])
+                    lexer.setFont(font, style, substyle)
+                    lexer.setEolFill(styleDict["eolfill"], style, substyle)
+                    if substyle >= 0:
+                        # description and words can only be set for sub-styles
+                        lexer.setDescription(styleDict["description"],
+                                             style, substyle)
+                        lexer.setWords(styleDict["words"], style, substyle)
+    
     #######################################################################
     ## Methods to save and restore the state
     #######################################################################
--- a/eric6/Preferences/ConfigurationPages/EditorHighlightingStylesPage.ui	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Preferences/ConfigurationPages/EditorHighlightingStylesPage.ui	Mon Feb 01 13:25:37 2021 +0100
@@ -348,12 +348,9 @@
    <item>
     <layout class="QHBoxLayout" name="horizontalLayout">
      <item>
-      <widget class="QPushButton" name="importCurrentButton">
-       <property name="enabled">
-        <bool>false</bool>
-       </property>
+      <widget class="QPushButton" name="importButton">
        <property name="toolTip">
-        <string>Imports all styles of the currently selected language</string>
+        <string>Imports all styles of languages to be selected</string>
        </property>
        <property name="text">
         <string>Import styles</string>
@@ -361,12 +358,9 @@
       </widget>
      </item>
      <item>
-      <widget class="QPushButton" name="exportCurrentButton">
-       <property name="enabled">
-        <bool>false</bool>
-       </property>
+      <widget class="QPushButton" name="exportButton">
        <property name="toolTip">
-        <string>Exports all styles of the currently selected language</string>
+        <string>Exports all styles of languages to be selected</string>
        </property>
        <property name="text">
         <string>Export styles</string>
@@ -415,8 +409,8 @@
   <tabstop>allFontsButton</tabstop>
   <tabstop>allEolFillButton</tabstop>
   <tabstop>allDefaultButton</tabstop>
-  <tabstop>importCurrentButton</tabstop>
-  <tabstop>exportCurrentButton</tabstop>
+  <tabstop>importButton</tabstop>
+  <tabstop>exportButton</tabstop>
   <tabstop>importAllButton</tabstop>
   <tabstop>exportAllButton</tabstop>
  </tabstops>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Preferences/ConfigurationPages/EditorHighlightingStylesSelectionDialog.py	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,117 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a dialog to select the styles to be imported/exported.
+"""
+
+from PyQt5.QtCore import pyqtSlot, Qt
+from PyQt5.QtWidgets import (
+    QDialog, QDialogButtonBox, QListWidgetItem, QAbstractButton
+)
+
+from .Ui_EditorHighlightingStylesSelectionDialog import (
+    Ui_EditorHighlightingStylesSelectionDialog
+)
+
+
+class EditorHighlightingStylesSelectionDialog(
+    QDialog, Ui_EditorHighlightingStylesSelectionDialog
+):
+    """
+    Class implementing a dialog to select the styles to be imported/exported.
+    """
+    def __init__(self, lexerNames, forImport, preselect=None, parent=None):
+        """
+        Constructor
+        
+        @param lexerNames list of lexer names to select from
+        @type list of str
+        @param forImport flag indicating a dialog for importing styles
+        @type bool
+        @param preselect list of lexer names to be preselected
+        @type list of str
+        @param parent reference to the parent widget
+        @type QWidget
+        """
+        super(EditorHighlightingStylesSelectionDialog, self).__init__(parent)
+        self.setupUi(self)
+        
+        self.__selectAllButton = self.buttonBox.addButton(
+            self.tr("Select All"), QDialogButtonBox.ActionRole)
+        
+        if forImport:
+            self.setWindowTitle(self.tr("Import Highlighting Styles"))
+            self.infoLabel.setText(self.tr(
+                "Select the highlighting styles to be imported"))
+        else:
+            self.setWindowTitle(self.tr("Export Highlighting Styles"))
+            self.infoLabel.setText(self.tr(
+                "Select the highlighting styles to be exported"))
+        
+        if preselect is None:
+            preselect = []
+        
+        for name in lexerNames:
+            itm = QListWidgetItem(name, self.lexersList)
+            itm.setFlags(Qt.ItemIsUserCheckable | Qt.ItemIsEnabled)
+            if name in preselect:
+                itm.setCheckState(Qt.Checked)
+            else:
+                itm.setCheckState(Qt.Unchecked)
+        
+        self.__updateOkButton()
+    
+    @pyqtSlot()
+    def __updateOkButton(self):
+        """
+        Private slot to update the state of the OK button.
+        """
+        for row in range(self.lexersList.count()):
+            itm = self.lexersList.item(row)
+            if itm.checkState() == Qt.Checked:
+                enable = True
+                break
+        else:
+            enable = False
+        self.buttonBox.button(QDialogButtonBox.Ok).setEnabled(enable)
+    
+    @pyqtSlot(QListWidgetItem)
+    def on_lexersList_itemChanged(self, item):
+        """
+        Private slot to react on changes in check state.
+        
+        @param item reference to the changed item
+        @type QListWidgetItem
+        """
+        self.__updateOkButton()
+    
+    @pyqtSlot(QAbstractButton)
+    def on_buttonBox_clicked(self, button):
+        """
+        Private slot to handle the user pressing a button.
+        
+        @param button reference to the button pressed
+        @type QAbstractButton
+        """
+        if button is self.__selectAllButton:
+            for row in range(self.lexersList.count()):
+                itm = self.lexersList.item(row)
+                itm.setCheckState(Qt.Checked)
+    
+    def getLexerNames(self):
+        """
+        Public method to get the selected lexer names.
+        
+        @return list of selected lexer names
+        @rtype list of str
+        """
+        lexerNames = []
+        for row in range(self.lexersList.count()):
+            itm = self.lexersList.item(row)
+            if itm.checkState() == Qt.Checked:
+                lexerNames.append(itm.text())
+        
+        return lexerNames
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Preferences/ConfigurationPages/EditorHighlightingStylesSelectionDialog.ui	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>EditorHighlightingStylesSelectionDialog</class>
+ <widget class="QDialog" name="EditorHighlightingStylesSelectionDialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>500</height>
+   </rect>
+  </property>
+  <property name="sizeGripEnabled">
+   <bool>true</bool>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout">
+   <item>
+    <widget class="QLabel" name="infoLabel">
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QListWidget" name="lexersList">
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <property name="sortingEnabled">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>EditorHighlightingStylesSelectionDialog</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>EditorHighlightingStylesSelectionDialog</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>
--- a/eric6/Preferences/ConfigurationPages/MultiProjectPage.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Preferences/ConfigurationPages/MultiProjectPage.py	Mon Feb 01 13:25:37 2021 +0100
@@ -34,7 +34,7 @@
         self.openMasterAutomaticallyCheckBox.setChecked(
             Preferences.getMultiProject("OpenMasterAutomatically"))
         self.multiProjectTimestampCheckBox.setChecked(
-            Preferences.getMultiProject("XMLTimestamp"))
+            Preferences.getMultiProject("TimestampFile"))
         self.multiProjectRecentSpinBox.setValue(
             Preferences.getMultiProject("RecentNumber"))
         self.workspacePicker.setText(
@@ -50,7 +50,7 @@
             "OpenMasterAutomatically",
             self.openMasterAutomaticallyCheckBox.isChecked())
         Preferences.setMultiProject(
-            "XMLTimestamp",
+            "TimestampFile",
             self.multiProjectTimestampCheckBox.isChecked())
         Preferences.setMultiProject(
             "RecentNumber",
--- a/eric6/Preferences/ConfigurationPages/MultiProjectPage.ui	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Preferences/ConfigurationPages/MultiProjectPage.ui	Mon Feb 01 13:25:37 2021 +0100
@@ -78,16 +78,16 @@
    <item>
     <widget class="QGroupBox" name="groupBox_6">
      <property name="title">
-      <string>XML</string>
+      <string>Files</string>
      </property>
      <layout class="QVBoxLayout">
       <item>
        <widget class="QCheckBox" name="multiProjectTimestampCheckBox">
         <property name="toolTip">
-         <string>Select, if a timestamp should be written to all multiproject related XML files</string>
+         <string>Select, if a timestamp should be written to all Multi Project files</string>
         </property>
         <property name="text">
-         <string>Include timestamp in multiproject related XML files</string>
+         <string>Include timestamp in Multi Project files</string>
         </property>
        </widget>
       </item>
--- a/eric6/Preferences/ConfigurationPages/ProjectPage.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Preferences/ConfigurationPages/ProjectPage.py	Mon Feb 01 13:25:37 2021 +0100
@@ -49,7 +49,7 @@
         self.projectAutoMakeCheckBox.setChecked(
             Preferences.getProject("AutoExecuteMake"))
         self.projectTimestampCheckBox.setChecked(
-            Preferences.getProject("XMLTimestamp"))
+            Preferences.getProject("TimestampFile"))
         self.projectRecentSpinBox.setValue(
             Preferences.getProject("RecentNumber"))
         self.pythonVariantCheckBox.setChecked(
@@ -99,7 +99,7 @@
             "AutoExecuteMake",
             self.projectAutoMakeCheckBox.isChecked())
         Preferences.setProject(
-            "XMLTimestamp",
+            "TimestampFile",
             self.projectTimestampCheckBox.isChecked())
         Preferences.setProject(
             "RecentNumber",
--- a/eric6/Preferences/ConfigurationPages/ProjectPage.ui	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Preferences/ConfigurationPages/ProjectPage.ui	Mon Feb 01 13:25:37 2021 +0100
@@ -34,16 +34,16 @@
    <item>
     <widget class="QGroupBox" name="groupBox_6">
      <property name="title">
-      <string>XML</string>
+      <string>Files</string>
      </property>
      <layout class="QVBoxLayout">
       <item>
        <widget class="QCheckBox" name="projectTimestampCheckBox">
         <property name="toolTip">
-         <string>Select, if a timestamp should be written to all project related XML files</string>
+         <string>Select, if a timestamp should be written to all Project files</string>
         </property>
         <property name="text">
-         <string>Include timestamp in project related XML files</string>
+         <string>Include timestamp in Project files</string>
         </property>
        </widget>
       </item>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Preferences/HighlightingStylesFile.py	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,117 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class representing the highlighting styles JSON file.
+"""
+
+import json
+import time
+
+from PyQt5.QtCore import QObject
+
+from E5Gui import E5MessageBox
+from E5Gui.E5OverrideCursor import E5OverridenCursor
+
+import Preferences
+
+
+class HighlightingStylesFile(QObject):
+    """
+    Class representing the highlighting styles JSON file.
+    """
+    def __init__(self, parent: QObject = None):
+        """
+        Constructor
+        
+        @param parent reference to the parent object (defaults to None)
+        @type QObject (optional)
+        """
+        super(HighlightingStylesFile, self).__init__(parent)
+    
+    def writeFile(self, filename: str, lexers: list) -> bool:
+        """
+        Public method to write the highlighting styles data to a highlighting
+        styles JSON file.
+        
+        @param filename name of the highlighting styles file
+        @type str
+        @param lexers list of lexers for which to export the styles
+        @type list of PreferencesLexer
+        @return flag indicating a successful write
+        @rtype bool
+        """
+        stylesDict = {}
+        # step 0: header
+        stylesDict["header"] = {
+            "comment": "eric highlighting styles file",
+            "saved": time.strftime('%Y-%m-%d, %H:%M:%S'),
+            "author": Preferences.getUser("Email"),
+        }
+        
+        # step 1: add the lexer style data
+        stylesDict["lexers"] = []
+        for lexer in lexers:
+            lexerDict = {
+                "name": lexer.language(),
+                "styles": [],
+            }
+            for description, style, substyle in lexer.getStyles():
+                lexerDict["styles"].append({
+                    "description": description,
+                    "style": style,
+                    "substyle": substyle,
+                    "color": lexer.color(style, substyle).name(),
+                    "paper": lexer.paper(style, substyle).name(),
+                    "font": lexer.font(style, substyle).toString(),
+                    "eolfill": lexer.eolFill(style, substyle),
+                    "words": lexer.words(style, substyle).strip(),
+                })
+            stylesDict["lexers"].append(lexerDict)
+        
+        try:
+            jsonString = json.dumps(stylesDict, indent=2)
+            with open(filename, "w") as f:
+                f.write(jsonString)
+        except (TypeError, EnvironmentError) as err:
+            with E5OverridenCursor():
+                E5MessageBox.critical(
+                    None,
+                    self.tr("Export Highlighting Styles"),
+                    self.tr(
+                        "<p>The highlighting styles file <b>{0}</b> could not"
+                        " be written.</p><p>Reason: {1}</p>"
+                    ).format(filename, str(err))
+                )
+                return False
+        
+        return True
+    
+    def readFile(self, filename: str) -> list:
+        """
+        Public method to read the highlighting styles data from a highlighting
+        styles JSON file.
+        
+        @param filename name of the highlighting styles file
+        @type str
+        @return list of read lexer style definitions
+        @rtype list of dict
+        """
+        try:
+            with open(filename, "r") as f:
+                jsonString = f.read()
+            stylesDict = json.loads(jsonString)
+        except (EnvironmentError, json.JSONDecodeError) as err:
+            E5MessageBox.critical(
+                None,
+                self.tr("Import Highlighting Styles"),
+                self.tr(
+                    "<p>The highlighting styles file <b>{0}</b> could not be"
+                    " read.</p><p>Reason: {1}</p>"
+                ).format(filename, str(err))
+            )
+            return []
+        
+        return stylesDict["lexers"]
--- a/eric6/Preferences/Shortcuts.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Preferences/Shortcuts.py	Mon Feb 01 13:25:37 2021 +0100
@@ -200,76 +200,100 @@
     """
     Module function to export the keyboard shortcuts for the defined QActions.
     
-    @param fn filename of the export file (string)
+    @param fn filename of the export file
+    @type str
     @param helpViewer reference to the help window object
+    @type WebBrowserWindow
     """
     # let the plugin manager create on demand plugin objects
     pm = e5App().getObject("PluginManager")
     pm.initOnDemandPlugins()
     
-    f = QFile(fn)
-    if f.open(QIODevice.WriteOnly):
-        from E5XML.ShortcutsWriter import ShortcutsWriter
-        ShortcutsWriter(f).writeXML(helpViewer=helpViewer)
-        f.close()
+    if fn.endswith(".ekj"):
+        # new JSON based file
+        from .ShortcutsFile import ShortcutsFile
+        shortcutsFile = ShortcutsFile()
+        shortcutsFile.writeFile(fn, helpViewer)
     else:
-        E5MessageBox.critical(
-            None,
-            QCoreApplication.translate(
-                "Shortcuts", "Export Keyboard Shortcuts"),
-            QCoreApplication.translate(
-                "Shortcuts",
-                "<p>The keyboard shortcuts could not be written to file"
-                " <b>{0}</b>.</p>")
-            .format(fn))
+        # old XML based file
+        f = QFile(fn)
+        if f.open(QIODevice.WriteOnly):
+            from E5XML.ShortcutsWriter import ShortcutsWriter
+            ShortcutsWriter(f).writeXML(helpViewer=helpViewer)
+            f.close()
+        else:
+            E5MessageBox.critical(
+                None,
+                QCoreApplication.translate(
+                    "Shortcuts", "Export Keyboard Shortcuts"),
+                QCoreApplication.translate(
+                    "Shortcuts",
+                    "<p>The keyboard shortcuts file <b>{0}</b> could not"
+                    " be written.</p>")
+                .format(fn))
 
 
 def importShortcuts(fn, helpViewer=None):
     """
-    Module function to import the keyboard shortcuts for the defined E5Actions.
+    Module function to import the keyboard shortcuts for the defined actions.
     
-    @param fn filename of the import file (string)
+    @param fn filename of the import file
+    @type str
     @param helpViewer reference to the help window object
+    @type WebBrowserWindow
     """
     # let the plugin manager create on demand plugin objects
     pm = e5App().getObject("PluginManager")
     pm.initOnDemandPlugins()
     
-    f = QFile(fn)
-    if f.open(QIODevice.ReadOnly):
-        from E5XML.ShortcutsReader import ShortcutsReader
-        reader = ShortcutsReader(f)
-        reader.readXML()
-        f.close()
-        if not reader.hasError():
-            shortcuts = reader.getShortcuts()
+    if fn.endswith(".ekj"):
+        # new JSON based file
+        from .ShortcutsFile import ShortcutsFile
+        shortcutsFile = ShortcutsFile()
+        shortcuts = shortcutsFile.readFile(fn)
+        if shortcuts:
             setActions(shortcuts, helpViewer=helpViewer)
             saveShortcuts()
             syncPreferences()
     else:
-        E5MessageBox.critical(
-            None,
-            QCoreApplication.translate(
-                "Shortcuts", "Import Keyboard Shortcuts"),
-            QCoreApplication.translate(
-                "Shortcuts",
-                "<p>The keyboard shortcuts could not be read from file"
-                " <b>{0}</b>.</p>")
-            .format(fn))
-        return
+        # old XML based file
+        f = QFile(fn)
+        if f.open(QIODevice.ReadOnly):
+            from E5XML.ShortcutsReader import ShortcutsReader
+            reader = ShortcutsReader(f)
+            reader.readXML()
+            f.close()
+            if not reader.hasError():
+                shortcuts = reader.getShortcuts()
+                setActions(shortcuts, helpViewer=helpViewer)
+                saveShortcuts()
+                syncPreferences()
+        else:
+            E5MessageBox.critical(
+                None,
+                QCoreApplication.translate(
+                    "Shortcuts", "Import Keyboard Shortcuts"),
+                QCoreApplication.translate(
+                    "Shortcuts",
+                    "<p>The keyboard shortcuts file <b>{0}</b> could not be"
+                    " read.</p>")
+                .format(fn))
 
 
-def __setAction(actions, sdict):
+def __setAction(actions, shortcutsDict):
     """
-    Private function to write a single keyboard shortcut to the settings.
+    Private function to set a single keyboard shortcut category shortcuts.
     
-    @param actions list of actions to set (list of E5Action)
-    @param sdict dictionary containg accelerator information for one category
+    @param actions list of actions to set
+    @type list of E5Action
+    @param shortcutsDict dictionary containing accelerator information for
+        one category
+    @type dict
     """
     for act in actions:
         if act.objectName():
             try:
-                accel, altAccel = sdict[act.objectName()]
+                accel, altAccel = shortcutsDict[act.objectName()]
                 act.setShortcut(QKeySequence(accel))
                 act.setAlternateShortcut(QKeySequence(altAccel),
                                          removeEmpty=True)
@@ -279,11 +303,13 @@
 
 def setActions(shortcuts, helpViewer=None):
     """
-    Module function to set actions based on new format shortcuts file.
+    Module function to set actions based on the imported shortcuts file.
     
     @param shortcuts dictionary containing the accelerator information
-        read from a XML file
+        read from a JSON or XML file
+    @type dict
     @param helpViewer reference to the help window object
+    @type WebBrowserWindow
     """
     if helpViewer is None:
         if "Project" in shortcuts:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Preferences/ShortcutsFile.py	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,206 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class representing the shortcuts JSON file.
+"""
+
+import json
+import time
+import typing
+
+from PyQt5.QtCore import QObject
+
+from E5Gui import E5MessageBox
+from E5Gui.E5OverrideCursor import E5OverridenCursor
+from E5Gui.E5Application import e5App
+
+import Preferences
+
+HelpViewer = typing.TypeVar("WebBrowserWindow")
+
+
+class ShortcutsFile(QObject):
+    """
+    Class representing the shortcuts JSON file.
+    """
+    def __init__(self, parent: QObject = None):
+        """
+        Constructor
+        
+        @param parent reference to the parent object (defaults to None)
+        @type QObject (optional)
+        """
+        super(ShortcutsFile, self).__init__(parent)
+    
+    def __addActionsToDict(self, category: str, actions: list,
+                           actionsDict: dict):
+        """
+        Private method to add a list of actions to the actions dictionary.
+        
+        @param category category of the actions
+        @type str
+        @param actions list of actions
+        @type list of QAction
+        @param actionsDict reference to the actions dictionary to be modified
+        @type dict
+        """
+        if actions:
+            if category not in actionsDict:
+                actionsDict[category] = {}
+            for act in actions:
+                if act.objectName():
+                    # shortcuts are only exported, if their objectName is set
+                    actionsDict[category][act.objectName()] = (
+                        act.shortcut().toString(),
+                        act.alternateShortcut().toString()
+                    )
+    
+    def writeFile(self, filename: str, helpViewer: HelpViewer = None) -> bool:
+        """
+        Public method to write the shortcuts data to a shortcuts JSON file.
+        
+        @param filename name of the shortcuts file
+        @type str
+        @param helpViewer reference to the help window object
+        @type WebBrowserWindow
+        @return flag indicating a successful write
+        @rtype bool
+        """
+        actionsDict = {}
+        
+        # step 1: collect all the shortcuts
+        if helpViewer is None:
+            self.__addActionsToDict(
+                "Project",
+                e5App().getObject("Project").getActions(),
+                actionsDict
+            )
+            self.__addActionsToDict(
+                "General",
+                e5App().getObject("UserInterface").getActions('ui'),
+                actionsDict
+            )
+            self.__addActionsToDict(
+                "Wizards",
+                e5App().getObject("UserInterface").getActions('wizards'),
+                actionsDict
+            )
+            self.__addActionsToDict(
+                "Debug",
+                e5App().getObject("DebugUI").getActions(),
+                actionsDict
+            )
+            self.__addActionsToDict(
+                "Edit",
+                e5App().getObject("ViewManager").getActions('edit'),
+                actionsDict
+            )
+            self.__addActionsToDict(
+                "File",
+                e5App().getObject("ViewManager").getActions('file'),
+                actionsDict
+            )
+            self.__addActionsToDict(
+                "Search",
+                e5App().getObject("ViewManager").getActions('search'),
+                actionsDict
+            )
+            self.__addActionsToDict(
+                "View",
+                e5App().getObject("ViewManager").getActions('view'),
+                actionsDict
+            )
+            self.__addActionsToDict(
+                "Macro",
+                e5App().getObject("ViewManager").getActions('macro'),
+                actionsDict
+            )
+            self.__addActionsToDict(
+                "Bookmarks",
+                e5App().getObject("ViewManager").getActions('bookmark'),
+                actionsDict
+            )
+            self.__addActionsToDict(
+                "Spelling",
+                e5App().getObject("ViewManager").getActions('spelling'),
+                actionsDict
+            )
+            self.__addActionsToDict(
+                "Window",
+                e5App().getObject("ViewManager").getActions('window'),
+                actionsDict
+            )
+            
+            for category, ref in e5App().getPluginObjects():
+                if hasattr(ref, "getActions"):
+                    self.__addActionsToDict(
+                        category, ref.getActions(), actionsDict
+                    )
+        
+        else:
+            self.__addActionsToDict(
+                helpViewer.getActionsCategory(),
+                helpViewer.getActions(),
+                actionsDict
+            )
+        
+        # step 2: assemble the data structure to be written
+        shortcutsDict = {}
+        # step 2.0: header
+        shortcutsDict["header"] = {
+            "comment": "eric keyboard shortcuts file",
+            "saved": time.strftime('%Y-%m-%d, %H:%M:%S'),
+            "author": Preferences.getUser("Email"),
+        }
+        # step 2.1: keyboard shortcuts
+        shortcutsDict["shortcuts"] = actionsDict
+        
+        try:
+            jsonString = json.dumps(shortcutsDict, indent=2)
+            with open(filename, "w") as f:
+                f.write(jsonString)
+        except (TypeError, EnvironmentError) as err:
+            with E5OverridenCursor():
+                E5MessageBox.critical(
+                    None,
+                    self.tr("Export Keyboard Shortcuts"),
+                    self.tr(
+                        "<p>The keyboard shortcuts file <b>{0}</b> could not"
+                        " be written.</p><p>Reason: {1}</p>"
+                    ).format(filename, str(err))
+                )
+                return False
+        
+        return True
+    
+    def readFile(self, filename: str) -> bool:
+        """
+        Public method to read the shortcuts data from a shortcuts JSON file.
+        
+        @param filename name of the shortcuts file
+        @type str
+        @return Dictionary of dictionaries of shortcuts. The keys of the
+            dictionary are the shortcuts categories, the values are
+            dictionaries. These dictionaries have the shortcut name as their
+            key and a tuple of accelerators as their value.
+        @rtype dict
+        """
+        try:
+            with open(filename, "r") as f:
+                jsonString = f.read()
+            shortcutsDict = json.loads(jsonString)
+        except (EnvironmentError, json.JSONDecodeError) as err:
+            E5MessageBox.critical(
+                None,
+                self.tr("Import Keyboard Shortcuts"),
+                self.tr(
+                    "<p>The keyboard shortcuts file <b>{0}</b> could not be"
+                    " read.</p><p>Reason: {1}</p>"
+                ).format(filename, str(err))
+            )
+            return {}
+        
+        return shortcutsDict["shortcuts"]
--- a/eric6/Preferences/__init__.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Preferences/__init__.py	Mon Feb 01 13:25:37 2021 +0100
@@ -782,7 +782,7 @@
         "AutoLoadSession": False,
         "AutoSaveSession": False,
         "SessionAllBreakpoints": False,
-        "XMLTimestamp": True,
+        "TimestampFile": True,
         "AutoCompileForms": False,
         "AutoCompileResources": False,
         "AutoExecuteMake": False,
@@ -804,7 +804,7 @@
     # defaults for the multi project settings
     multiProjectDefaults = {
         "OpenMasterAutomatically": True,
-        "XMLTimestamp": True,
+        "TimestampFile": True,
         "RecentNumber": 9,
         "Workspace": "",
     }
@@ -2644,7 +2644,7 @@
     if key in ["RecentNumber"]:
         return int(prefClass.settings.value(
             "MultiProject/" + key, prefClass.multiProjectDefaults[key]))
-    elif key in ["OpenMasterAutomatically", "XMLTimestamp"]:
+    elif key in ["OpenMasterAutomatically", "TimestampFile"]:
         return toBool(prefClass.settings.value(
             "MultiProject/" + key, prefClass.multiProjectDefaults[key]))
     else:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Project/DebuggerPropertiesFile.py	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class representing the project debugger properties
+JSON file.
+"""
+
+import json
+import time
+import typing
+
+from PyQt5.QtCore import QObject
+
+from E5Gui import E5MessageBox
+from E5Gui.E5OverrideCursor import E5OverridenCursor
+
+import Preferences
+
+Project = typing.TypeVar("Project")
+
+
+class DebuggerPropertiesFile(QObject):
+    """
+    Class representing the project debugger properties JSON file.
+    """
+    def __init__(self, project: Project, parent: QObject = None):
+        """
+        Constructor
+        
+        @param project reference to the project object
+        @type Project
+        @param parent reference to the parent object (defaults to None)
+        @type QObject (optional)
+        """
+        super(DebuggerPropertiesFile, self).__init__(parent)
+        self.__project = project
+    
+    def writeFile(self, filename: str) -> bool:
+        """
+        Public method to write the project debugger properties data to a
+        project debugger properties JSON file.
+        
+        @param filename name of the user project file
+        @type str
+        @return flag indicating a successful write
+        @rtype bool
+        """
+        debuggerPropertiesDict = {}
+        debuggerPropertiesDict["header"] = {
+            "comment": "eric debugger properties file for project {0}".format(
+                self.__project.getProjectName()),
+            "warning": "This file was generated automatically, do not edit.",
+        }
+        
+        if Preferences.getProject("TimestampFile"):
+            debuggerPropertiesDict["header"]["saved"] = (
+                time.strftime('%Y-%m-%d, %H:%M:%S')
+            )
+        
+        debuggerPropertiesDict["debug_properties"] = (
+            self.__project.debugProperties
+        )
+        
+        try:
+            jsonString = json.dumps(debuggerPropertiesDict, indent=2)
+            with open(filename, "w") as f:
+                f.write(jsonString)
+        except (TypeError, EnvironmentError) as err:
+            with E5OverridenCursor():
+                E5MessageBox.critical(
+                    None,
+                    self.tr("Save Debugger Properties"),
+                    self.tr(
+                        "<p>The project debugger properties file"
+                        " <b>{0}</b> could not be written.</p>"
+                        "<p>Reason: {1}</p>"
+                    ).format(filename, str(err))
+                )
+                return False
+        
+        return True
+    
+    def readFile(self, filename: str) -> bool:
+        """
+        Public method to read the project debugger properties data from a
+        project debugger properties JSON file.
+        
+        @param filename name of the project file
+        @type str
+        @return flag indicating a successful read
+        @rtype bool
+        """
+        try:
+            with open(filename, "r") as f:
+                jsonString = f.read()
+            debuggerPropertiesDict = json.loads(jsonString)
+        except (EnvironmentError, json.JSONDecodeError) as err:
+            E5MessageBox.critical(
+                None,
+                self.tr("Read Debugger Properties"),
+                self.tr(
+                    "<p>The project debugger properties file <b>{0}</b>"
+                    " could not be read.</p><p>Reason: {1}</p>"
+                ).format(filename, str(err))
+            )
+            return False
+        
+        self.__project.debugProperties = (
+            debuggerPropertiesDict["debug_properties"]
+        )
+        
+        return True
--- a/eric6/Project/Project.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Project/Project.py	Mon Feb 01 13:25:37 2021 +0100
@@ -41,6 +41,14 @@
 import Preferences
 import Utilities
 
+from .ProjectFile import ProjectFile
+from .UserProjectFile import UserProjectFile
+from .DebuggerPropertiesFile import DebuggerPropertiesFile
+
+from Sessions.SessionFile import SessionFile
+
+from Tasks.TasksFile import TasksFile
+
 
 class Project(QObject):
     """
@@ -184,6 +192,12 @@
         
         self.__initData()
         
+        self.__projectFile = ProjectFile(self)
+        self.__userProjectFile = UserProjectFile(self)
+        self.__debuggerPropertiesFile = DebuggerPropertiesFile(self)
+        self.__sessionFile = SessionFile(False)
+        self.__tasksFile = TasksFile(False)
+        
         self.recent = []
         self.__loadRecent()
         
@@ -582,6 +596,7 @@
             "README": "OTHERS",
             "README.*": "OTHERS",
             "*.e4p": "OTHERS",
+            "*.epj": "OTHERS",
             "GNUmakefile": "OTHERS",
             "makefile": "OTHERS",
             "Makefile": "OTHERS",
@@ -787,34 +802,50 @@
         
     def __readProject(self, fn):
         """
-        Private method to read in a project (.e4p) file.
+        Private method to read in a project (.epj or .e4p) file.
         
         @param fn filename of the project file to be read (string)
         @return flag indicating success
         """
-        f = QFile(fn)
-        if f.open(QIODevice.ReadOnly):
-            from E5XML.ProjectReader import ProjectReader
-            reader = ProjectReader(f, self)
-            reader.readXML()
-            res = not reader.hasError()
-            f.close()
+        if os.path.splitext(fn)[1] == ".epj":
+            # new JSON based format
+            with E5OverrideCursor():
+                res = self.__projectFile.readFile(fn)
         else:
-            E5MessageBox.critical(
-                self.ui,
-                self.tr("Read project file"),
-                self.tr(
-                    "<p>The project file <b>{0}</b> could not be read.</p>")
-                .format(fn))
-            return False
-        
-        self.pfile = os.path.abspath(fn)
-        self.ppath = os.path.abspath(os.path.dirname(fn))
-        
-        # insert filename into list of recently opened projects
-        self.__syncRecent()
+            # old XML based format
+            f = QFile(fn)
+            if f.open(QIODevice.ReadOnly):
+                from E5XML.ProjectReader import ProjectReader
+                reader = ProjectReader(f, self)
+                reader.readXML()
+                res = not reader.hasError()
+                f.close()
+                
+                # create hash value, if it doesn't have one
+                if reader.version.startswith("5.") and not self.pdata["HASH"]:
+                    hashStr = str(QCryptographicHash.hash(
+                        QByteArray(self.ppath.encode("utf-8")),
+                        QCryptographicHash.Sha1).toHex(),
+                        encoding="utf-8")
+                    self.pdata["HASH"] = hashStr
+                    self.setDirty(True)
+            else:
+                E5MessageBox.critical(
+                    self.ui,
+                    self.tr("Read Project File"),
+                    self.tr(
+                        "<p>The project file <b>{0}</b> could not be read."
+                        "</p>")
+                    .format(fn))
+                res = False
         
         if res:
+            self.pfile = os.path.abspath(fn)
+            self.ppath = os.path.abspath(os.path.dirname(fn))
+            
+            # insert filename into list of recently opened projects
+            self.__syncRecent()
+            
             if self.pdata["TRANSLATIONPATTERN"]:
                 self.translationsRoot = self.pdata["TRANSLATIONPATTERN"].split(
                     "%language%")[0]
@@ -859,15 +890,6 @@
                 if dn not in self.otherssubdirs:
                     self.otherssubdirs.append(dn)
             
-            # create hash value, if it doesn't have one
-            if reader.version.startswith("5.") and not self.pdata["HASH"]:
-                hashStr = str(QCryptographicHash.hash(
-                    QByteArray(self.ppath.encode("utf-8")),
-                    QCryptographicHash.Sha1).toHex(),
-                    encoding="utf-8")
-                self.pdata["HASH"] = hashStr
-                self.setDirty(True)
-            
         return res
 
     def __writeProject(self, fn=None):
@@ -896,20 +918,26 @@
         if fn is None:
             fn = self.pfile
         
-        f = QFile(fn)
-        if f.open(QIODevice.WriteOnly):
-            from E5XML.ProjectWriter import ProjectWriter
-            ProjectWriter(f, os.path.splitext(
-                os.path.basename(fn))[0]).writeXML()
-            res = True
+        if os.path.splitext(fn)[1] == ".epj":
+            # new JSON based format
+            with E5OverrideCursor():
+                res = self.__projectFile.writeFile(fn)
         else:
-            E5MessageBox.critical(
-                self.ui,
-                self.tr("Save project file"),
-                self.tr(
-                    "<p>The project file <b>{0}</b> could not be"
-                    " written.</p>").format(fn))
-            res = False
+            # old XML based format
+            f = QFile(fn)
+            if f.open(QIODevice.WriteOnly):
+                from E5XML.ProjectWriter import ProjectWriter
+                ProjectWriter(f, os.path.splitext(
+                    os.path.basename(fn))[0]).writeXML()
+                res = True
+            else:
+                E5MessageBox.critical(
+                    self.ui,
+                    self.tr("Save Project File"),
+                    self.tr(
+                        "<p>The project file <b>{0}</b> could not be"
+                        " written.</p>").format(fn))
+                res = False
         
         if res:
             self.pfile = os.path.abspath(fn)
@@ -924,52 +952,50 @@
         
     def __readUserProperties(self):
         """
-        Private method to read in the user specific project file (.e4q).
+        Private method to read in the user specific project file (.eqj or
+        .e4q).
+        """
+        if self.pfile is None:
+            return
+        
+        fn1, ext = os.path.splitext(os.path.basename(self.pfile))
+        fn = os.path.join(self.getProjectManagementDir(),
+                          '{0}.eqj'.format(fn1))
+        if os.path.exists(fn):
+            # try the new JSON based format first
+            self.__userProjectFile.readFile(fn)
+        else:
+            # try the old XML based format second
+            fn = os.path.join(self.getProjectManagementDir(),
+                              '{0}.e4q'.format(fn1))
+            if os.path.exists(fn):
+                f = QFile(fn)
+                if f.open(QIODevice.ReadOnly):
+                    from E5XML.UserProjectReader import UserProjectReader
+                    reader = UserProjectReader(f, self)
+                    reader.readXML()
+                    f.close()
+                else:
+                    E5MessageBox.critical(
+                        self.ui,
+                        self.tr("Read User Project Properties"),
+                        self.tr(
+                            "<p>The user specific project properties file"
+                            " <b>{0}</b> could not be read.</p>").format(fn))
+        
+    def __writeUserProperties(self):
+        """
+        Private method to write the user specific project data to a JSON file.
         """
         if self.pfile is None:
             return
         
         fn, ext = os.path.splitext(os.path.basename(self.pfile))
-        fn = os.path.join(self.getProjectManagementDir(), '{0}.e4q'.format(fn))
-        if os.path.exists(fn):
-            f = QFile(fn)
-            if f.open(QIODevice.ReadOnly):
-                from E5XML.UserProjectReader import UserProjectReader
-                reader = UserProjectReader(f, self)
-                reader.readXML()
-                f.close()
-            else:
-                E5MessageBox.critical(
-                    self.ui,
-                    self.tr("Read user project properties"),
-                    self.tr(
-                        "<p>The user specific project properties file"
-                        " <b>{0}</b> could not be read.</p>").format(fn))
-        
-    def __writeUserProperties(self):
-        """
-        Private method to write the project data to an XML file.
-        """
-        if self.pfile is None:
-            return
-        
-        fn, ext = os.path.splitext(os.path.basename(self.pfile))
-        fn = os.path.join(self.getProjectManagementDir(), '{0}.e4q'.format(fn))
-        
-        f = QFile(fn)
-        if f.open(QIODevice.WriteOnly):
-            from E5XML.UserProjectWriter import UserProjectWriter
-            UserProjectWriter(
-                f, os.path.splitext(os.path.basename(fn))[0]).writeXML()
-            f.close()
-        else:
-            E5MessageBox.critical(
-                self.ui,
-                self.tr("Save user project properties"),
-                self.tr(
-                    "<p>The user specific project properties file <b>{0}</b>"
-                    " could not be written.</p>").format(fn))
-        
+        fn = os.path.join(self.getProjectManagementDir(), '{0}.eqj'.format(fn))
+        
+        with E5OverrideCursor():
+            self.__userProjectFile.writeFile(fn)
+    
     def __showContextMenuSession(self):
         """
         Private slot called before the Session menu is shown.
@@ -980,9 +1006,9 @@
         else:
             fn, ext = os.path.splitext(os.path.basename(self.pfile))
             fn_new = os.path.join(self.getProjectManagementDir(),
-                                  '{0}.e5s'.format(fn))
+                                  '{0}.esj'.format(fn))
             fn_old = os.path.join(self.getProjectManagementDir(),
-                                  '{0}.e4s'.format(fn))
+                                  '{0}.e5s'.format(fn))
             enable = os.path.exists(fn_new) or os.path.exists(fn_old)
         self.sessActGrp.findChild(
             QAction, "project_load_session").setEnabled(enable)
@@ -992,46 +1018,7 @@
     @pyqtSlot()
     def __readSession(self, quiet=False, indicator=""):
         """
-        Private method to read in the project session file (.e5s or .e4s).
-        
-        @param quiet flag indicating quiet operations.
-                If this flag is true, no errors are reported.
-        @param indicator indicator string (string)
-        """
-        if self.pfile is None:
-            if not quiet:
-                E5MessageBox.critical(
-                    self.ui,
-                    self.tr("Read project session"),
-                    self.tr("Please save the project first."))
-            return
-            
-        fn1, ext = os.path.splitext(os.path.basename(self.pfile))
-        fn = os.path.join(self.getProjectManagementDir(),
-                          '{0}{1}.e5s'.format(fn1, indicator))
-        if not os.path.exists(fn):
-            fn = os.path.join(self.getProjectManagementDir(),
-                              '{0}{1}.e4s'.format(fn1, indicator))
-        
-        f = QFile(fn)
-        if f.open(QIODevice.ReadOnly):
-            from E5XML.SessionReader import SessionReader
-            reader = SessionReader(f, False)
-            reader.readXML(quiet=quiet)
-            f.close()
-        else:
-            if not quiet:
-                E5MessageBox.critical(
-                    self.ui,
-                    self.tr("Read project session"),
-                    self.tr(
-                        "<p>The project session file <b>{0}</b> could not be"
-                        " read.</p>").format(fn))
-        
-    @pyqtSlot()
-    def __writeSession(self, quiet=False, indicator=""):
-        """
-        Private method to write the session data to an XML file (.e5s).
+        Private method to read in the project session file (.esj or .e5s).
         
         @param quiet flag indicating quiet operations.
                 If this flag is true, no errors are reported.
@@ -1041,29 +1028,59 @@
             if not quiet:
                 E5MessageBox.critical(
                     self.ui,
-                    self.tr("Save project session"),
+                    self.tr("Read Project Session"),
+                    self.tr("Please save the project first."))
+            return
+            
+        fn1, ext = os.path.splitext(os.path.basename(self.pfile))
+        fn = os.path.join(self.getProjectManagementDir(),
+                          '{0}{1}.esj'.format(fn1, indicator))
+        if os.path.exists(fn):
+            # try the new JSON based format first
+            self.__sessionFile.readFile(fn)
+        else:
+            # try the old XML based format second
+            fn = os.path.join(self.getProjectManagementDir(),
+                              '{0}{1}.e5s'.format(fn1, indicator))
+            if os.path.exists(fn):
+                f = QFile(fn)
+                if f.open(QIODevice.ReadOnly):
+                    from E5XML.SessionReader import SessionReader
+                    reader = SessionReader(f, False)
+                    reader.readXML(quiet=quiet)
+                    f.close()
+                else:
+                    if not quiet:
+                        E5MessageBox.critical(
+                            self.ui,
+                            self.tr("Read project session"),
+                            self.tr(
+                                "<p>The project session file <b>{0}</b> could"
+                                " not be read.</p>").format(fn))
+        
+    @pyqtSlot()
+    def __writeSession(self, quiet=False, indicator=""):
+        """
+        Private method to write the session data to an XML file (.esj).
+        
+        @param quiet flag indicating quiet operations.
+            If this flag is true, no errors are reported.
+        @param indicator indicator string (string)
+        """
+        if self.pfile is None:
+            if not quiet:
+                E5MessageBox.critical(
+                    self.ui,
+                    self.tr("Save Project Session"),
                     self.tr("Please save the project first."))
             return
         
         fn, ext = os.path.splitext(os.path.basename(self.pfile))
         fn = os.path.join(self.getProjectManagementDir(),
-                          '{0}{1}.e5s'.format(fn, indicator))
-        
-        f = QFile(fn)
-        if f.open(QIODevice.WriteOnly):
-            from E5XML.SessionWriter import SessionWriter
-            SessionWriter(
-                f, os.path.splitext(os.path.basename(fn))[0]).writeXML()
-            f.close()
-        else:
-            if not quiet:
-                E5MessageBox.critical(
-                    self.ui,
-                    self.tr("Save project session"),
-                    self.tr(
-                        "<p>The project session file <b>{0}</b> could not be"
-                        " written.</p>").format(fn))
-        
+                          '{0}{1}.esj'.format(fn, indicator))
+        
+        self.__sessionFile.writeFile(fn)
+    
     def __deleteSession(self):
         """
         Private method to delete the session file.
@@ -1071,88 +1088,76 @@
         if self.pfile is None:
             E5MessageBox.critical(
                 self.ui,
-                self.tr("Delete project session"),
+                self.tr("Delete Project Session"),
                 self.tr("Please save the project first."))
             return
             
         fname, ext = os.path.splitext(os.path.basename(self.pfile))
         
-        for fn in [
-            os.path.join(
-                self.getProjectManagementDir(), "{0}.e5s".format(fname)),
-            os.path.join(
-                self.getProjectManagementDir(), "{0}.e4s".format(fname))]:
+        for ext in (".esj", ".e5s", ".e4s"):
+            fn = os.path.join(
+                self.getProjectManagementDir(), "{0}{1}".format(fname, ext)),
             if os.path.exists(fn):
                 try:
                     os.remove(fn)
                 except OSError:
                     E5MessageBox.critical(
                         self.ui,
-                        self.tr("Delete project session"),
+                        self.tr("Delete Project Session"),
                         self.tr(
                             "<p>The project session file <b>{0}</b> could"
                             " not be deleted.</p>").format(fn))
         
     def __readTasks(self):
         """
-        Private method to read in the project tasks file (.e6t).
+        Private method to read in the project tasks file (.etj or .e6t).
         """
         if self.pfile is None:
             E5MessageBox.critical(
                 self.ui,
-                self.tr("Read tasks"),
+                self.tr("Read Tasks"),
                 self.tr("Please save the project first."))
             return
-            
+        
         base, ext = os.path.splitext(os.path.basename(self.pfile))
         fn = os.path.join(self.getProjectManagementDir(),
-                          '{0}.e6t'.format(base))
-        if not os.path.exists(fn):
-            # try again with the old extension
+                          '{0}.etj'.format(base))
+        if os.path.exists(fn):
+            # try new style JSON file first
+            self.__tasksFile.readFile(fn)
+        else:
+            # try old style XML file second
             fn = os.path.join(self.getProjectManagementDir(),
-                              '{0}.e4t'.format(base))
-            if not os.path.exists(fn):
-                return
-        f = QFile(fn)
-        if f.open(QIODevice.ReadOnly):
-            from E5XML.TasksReader import TasksReader
-            reader = TasksReader(f, True)
-            reader.readXML()
-            f.close()
-        else:
-            E5MessageBox.critical(
-                self.ui,
-                self.tr("Read tasks"),
-                self.tr(
-                    "<p>The tasks file <b>{0}</b> could not be read.</p>")
-                .format(fn))
+                              '{0}.e6t'.format(base))
+            if os.path.exists(fn):
+                f = QFile(fn)
+                if f.open(QIODevice.ReadOnly):
+                    from E5XML.TasksReader import TasksReader
+                    reader = TasksReader(f, True)
+                    reader.readXML()
+                    f.close()
+                else:
+                    E5MessageBox.critical(
+                        self.ui,
+                        self.tr("Read Tasks"),
+                        self.tr(
+                            "<p>The tasks file <b>{0}</b> could not be read."
+                            "</p>")
+                        .format(fn))
         
     def writeTasks(self):
         """
-        Public method to write the tasks data to an XML file (.e6t).
+        Public method to write the tasks data to a JSON file (.etj).
         """
         if self.pfile is None:
             return
             
         fn, ext = os.path.splitext(os.path.basename(self.pfile))
         
-        fn = os.path.join(self.getProjectManagementDir(), '{0}.e6t'.format(fn))
-        f = QFile(fn)
-        ok = f.open(QIODevice.WriteOnly)
-        if not ok:
-            E5MessageBox.critical(
-                self.ui,
-                self.tr("Save tasks"),
-                self.tr(
-                    "<p>The tasks file <b>{0}</b> could not be written.</p>")
-                .format(fn))
-            return
-        
-        from E5XML.TasksWriter import TasksWriter
-        TasksWriter(
-            f, True, os.path.splitext(os.path.basename(fn))[0]).writeXML()
-        f.close()
-        
+        fn = os.path.join(self.getProjectManagementDir(),
+                          '{0}.etj'.format(fn))
+        self.__tasksFile.writeFile(fn)
+    
     def __showContextMenuDebugger(self):
         """
         Private slot called before the Debugger menu is shown.
@@ -1173,43 +1178,54 @@
     @pyqtSlot()
     def __readDebugProperties(self, quiet=False):
         """
-        Private method to read in the project debugger properties file (.e4d).
+        Private method to read in the project debugger properties file
+        (.edj or .e4d).
         
         @param quiet flag indicating quiet operations.
-                If this flag is true, no errors are reported.
+            If this flag is true, no errors are reported.
         """
         if self.pfile is None:
             if not quiet:
                 E5MessageBox.critical(
                     self.ui,
-                    self.tr("Read debugger properties"),
+                    self.tr("Read Debugger Properties"),
                     self.tr("Please save the project first."))
             return
+        
+        fn1, ext = os.path.splitext(os.path.basename(self.pfile))
+        fn = os.path.join(self.getProjectManagementDir(),
+                          '{0}.edj'.format(fn1))
+        if os.path.exists(fn):
+            # try the new JSON based format first
+            self.__debuggerPropertiesFile.readFile(fn)
+        else:
+            # try the old XML based format second
+            fn = os.path.join(self.getProjectManagementDir(),
+                              '{0}.e4d'.format(fn1))
             
-        fn, ext = os.path.splitext(os.path.basename(self.pfile))
-        fn = os.path.join(self.getProjectManagementDir(), '{0}.e4d'.format(fn))
-        
-        f = QFile(fn)
-        if f.open(QIODevice.ReadOnly):
-            from E5XML.DebuggerPropertiesReader import DebuggerPropertiesReader
-            reader = DebuggerPropertiesReader(f, self)
-            reader.readXML(quiet=quiet)
-            f.close()
-            self.debugPropertiesLoaded = True
-            self.debugPropertiesChanged = False
-        else:
-            if not quiet:
-                E5MessageBox.critical(
-                    self.ui,
-                    self.tr("Read debugger properties"),
-                    self.tr(
-                        "<p>The project debugger properties file <b>{0}</b>"
-                        " could not be read.</p>").format(fn))
-        
+            f = QFile(fn)
+            if f.open(QIODevice.ReadOnly):
+                from E5XML.DebuggerPropertiesReader import (
+                    DebuggerPropertiesReader
+                )
+                reader = DebuggerPropertiesReader(f, self)
+                reader.readXML(quiet=quiet)
+                f.close()
+                self.debugPropertiesLoaded = True
+                self.debugPropertiesChanged = False
+            else:
+                if not quiet:
+                    E5MessageBox.critical(
+                        self.ui,
+                        self.tr("Read Debugger Properties"),
+                        self.tr(
+                            "<p>The project debugger properties file"
+                            " <b>{0}</b> could not be read.</p>").format(fn))
+    
     @pyqtSlot()
     def __writeDebugProperties(self, quiet=False):
         """
-        Private method to write the project debugger properties file (.e4d).
+        Private method to write the project debugger properties file (.edj).
         
         @param quiet flag indicating quiet operations.
                 If this flag is true, no errors are reported.
@@ -1218,51 +1234,40 @@
             if not quiet:
                 E5MessageBox.critical(
                     self.ui,
-                    self.tr("Save debugger properties"),
+                    self.tr("Save Debugger Properties"),
                     self.tr("Please save the project first."))
             return
-            
+        
         fn, ext = os.path.splitext(os.path.basename(self.pfile))
-        fn = os.path.join(self.getProjectManagementDir(), '{0}.e4d'.format(fn))
-        
-        f = QFile(fn)
-        if f.open(QIODevice.WriteOnly):
-            from E5XML.DebuggerPropertiesWriter import DebuggerPropertiesWriter
-            DebuggerPropertiesWriter(
-                f, os.path.splitext(os.path.basename(fn))[0]).writeXML()
-            f.close()
-            self.debugPropertiesChanged = False
-        else:
-            if not quiet:
-                E5MessageBox.critical(
-                    self.ui,
-                    self.tr("Save debugger properties"),
-                    self.tr(
-                        "<p>The project debugger properties file <b>{0}</b>"
-                        " could not be written.</p>").format(fn))
-        
+        fn = os.path.join(self.getProjectManagementDir(), '{0}.edj'.format(fn))
+        
+        with E5OverrideCursor():
+            self.__debuggerPropertiesFile.writeFile(fn)
+    
     def __deleteDebugProperties(self):
         """
-        Private method to delete the project debugger properties file (.e4d).
+        Private method to delete the project debugger properties file
+        (.edj or .e4d).
         """
         if self.pfile is None:
             E5MessageBox.critical(
                 self.ui,
-                self.tr("Delete debugger properties"),
+                self.tr("Delete Debugger Properties"),
                 self.tr("Please save the project first."))
             return
             
         fname, ext = os.path.splitext(os.path.basename(self.pfile))
         
-        for fn in [os.path.join(self.getProjectManagementDir(),
-                                "{0}.e4d".format(fname))]:
+        for ext in (".edj", ".e4d"):
+            fn = os.path.join(self.getProjectManagementDir(),
+                              "{0}{1}".format(fname, ext))
             if os.path.exists(fn):
                 try:
                     os.remove(fn)
                 except OSError:
                     E5MessageBox.critical(
                         self.ui,
-                        self.tr("Delete debugger properties"),
+                        self.tr("Delete Debugger Properties"),
                         self.tr(
                             "<p>The project debugger properties file"
                             " <b>{0}</b> could not be deleted.</p>")
@@ -2940,7 +2945,7 @@
                 self.tr("Open project"),
                 Preferences.getMultiProject("Workspace") or
                 Utilities.getHomeDir(),
-                self.tr("Project Files (*.e4p)"))
+                self.tr("Project Files (*.epj);;XML Project Files (*.e4p)"))
         
         QApplication.processEvents()
         
@@ -3110,6 +3115,9 @@
         """
         if self.isDirty():
             if len(self.pfile) > 0:
+                if self.pfile.endswith(".e4p"):
+                    self.pfile = self.pfile.replace(".e4p", ".epj")
+                    self.__syncRecent()
                 ok = self.__writeProject()
             else:
                 ok = self.saveProjectAs()
@@ -3125,7 +3133,7 @@
         
         @return flag indicating success (boolean)
         """
-        defaultFilter = self.tr("Project Files (*.e4p)")
+        defaultFilter = self.tr("Project Files (*.epj)")
         if self.ppath:
             defaultPath = self.ppath
         else:
@@ -3137,7 +3145,8 @@
             self.parent(),
             self.tr("Save project as"),
             defaultPath,
-            self.tr("Project Files (*.e4p)"),
+            self.tr("Project Files (*.epj);;"
+                    "XML Project Files (*.e4p)"),
             defaultFilter,
             E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))
         
@@ -4031,9 +4040,9 @@
         self.filetypesAct = E5Action(
             self.tr('Filetype Associations'),
             self.tr('Filetype Associations...'), 0, 0,
-            self, 'project_filetype_associatios')
+            self, 'project_filetype_associations')
         self.filetypesAct.setStatusTip(
-            self.tr('Show the project filetype associations'))
+            self.tr('Show the project file type associations'))
         self.filetypesAct.setWhatsThis(self.tr(
             """<b>Filetype Associations...</b>"""
             """<p>This shows a dialog to edit the file type associations of"""
@@ -4049,7 +4058,7 @@
         self.lexersAct = E5Action(
             self.tr('Lexer Associations'),
             self.tr('Lexer Associations...'), 0, 0,
-            self, 'project_lexer_associatios')
+            self, 'project_lexer_associations')
         self.lexersAct.setStatusTip(self.tr(
             'Show the project lexer associations (overriding defaults)'))
         self.lexersAct.setWhatsThis(self.tr(
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Project/ProjectFile.py	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,110 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class representing the project JSON file.
+"""
+
+import json
+import time
+import typing
+
+from PyQt5.QtCore import QObject
+
+from E5Gui import E5MessageBox
+from E5Gui.E5OverrideCursor import E5OverridenCursor
+
+import Preferences
+
+Project = typing.TypeVar("Project")
+
+
+class ProjectFile(QObject):
+    """
+    Class representing the project JSON file.
+    """
+    def __init__(self, project: Project, parent: QObject = None):
+        """
+        Constructor
+        
+        @param project reference to the project object
+        @type Project
+        @param parent reference to the parent object (defaults to None)
+        @type QObject (optional)
+        """
+        super(ProjectFile, self).__init__(parent)
+        self.__project = project
+    
+    def writeFile(self, filename: str) -> bool:
+        """
+        Public method to write the project data to a project JSON file.
+        
+        @param filename name of the project file
+        @type str
+        @return flag indicating a successful write
+        @rtype bool
+        """
+        projectDict = {}
+        projectDict["header"] = {
+            "comment": "eric project file for project {0}".format(
+                self.__project.getProjectName()),
+            "copyright": "Copyright (C) {0} {1}, {2}".format(
+                time.strftime('%Y'),
+                self.__project.pdata["AUTHOR"],
+                self.__project.pdata["EMAIL"])
+        }
+        
+        if Preferences.getProject("TimestampFile"):
+            projectDict["header"]["saved"] = (
+                time.strftime('%Y-%m-%d, %H:%M:%S')
+            )
+        
+        projectDict["project"] = self.__project.pdata
+        
+        try:
+            jsonString = json.dumps(projectDict, indent=2)
+            with open(filename, "w") as f:
+                f.write(jsonString)
+        except (TypeError, EnvironmentError) as err:
+            with E5OverridenCursor():
+                E5MessageBox.critical(
+                    None,
+                    self.tr("Save Project File"),
+                    self.tr(
+                        "<p>The project file <b>{0}</b> could not be "
+                        "written.</p><p>Reason: {1}</p>"
+                    ).format(filename, str(err))
+                )
+                return False
+        
+        return True
+    
+    def readFile(self, filename: str) -> bool:
+        """
+        Public method to read the project data from a project JSON file.
+        
+        @param filename name of the project file
+        @type str
+        @return flag indicating a successful read
+        @rtype bool
+        """
+        try:
+            with open(filename, "r") as f:
+                jsonString = f.read()
+            projectDict = json.loads(jsonString)
+        except (EnvironmentError, json.JSONDecodeError) as err:
+            E5MessageBox.critical(
+                None,
+                self.tr("Read Project File"),
+                self.tr(
+                    "<p>The project file <b>{0}</b> could not be "
+                    "read.</p><p>Reason: {1}</p>"
+                ).format(filename, str(err))
+            )
+            return False
+        
+        self.__project.pdata = projectDict["project"]
+        
+        return True
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Project/UserProjectFile.py	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,109 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class representing the user project JSON file.
+"""
+
+import json
+import time
+import typing
+
+from PyQt5.QtCore import QObject
+
+from E5Gui import E5MessageBox
+from E5Gui.E5OverrideCursor import E5OverridenCursor
+
+import Preferences
+
+Project = typing.TypeVar("Project")
+
+
+class UserProjectFile(QObject):
+    """
+    Class representing the user project JSON file.
+    """
+    def __init__(self, project: Project, parent: QObject = None):
+        """
+        Constructor
+        
+        @param project reference to the project object
+        @type Project
+        @param parent reference to the parent object (defaults to None)
+        @type QObject (optional)
+        """
+        super(UserProjectFile, self).__init__(parent)
+        self.__project = project
+    
+    def writeFile(self, filename: str) -> bool:
+        """
+        Public method to write the user project data to a user project
+        JSON file.
+        
+        @param filename name of the user project file
+        @type str
+        @return flag indicating a successful write
+        @rtype bool
+        """
+        userProjectDict = {}
+        userProjectDict["header"] = {
+            "comment": "eric user project file for project {0}".format(
+                self.__project.getProjectName()),
+        }
+        
+        if Preferences.getProject("TimestampFile"):
+            userProjectDict["header"]["saved"] = (
+                time.strftime('%Y-%m-%d, %H:%M:%S')
+            )
+        
+        userProjectDict["user_data"] = self.__project.pudata
+        
+        try:
+            jsonString = json.dumps(userProjectDict, indent=2)
+            with open(filename, "w") as f:
+                f.write(jsonString)
+        except (TypeError, EnvironmentError) as err:
+            with E5OverridenCursor():
+                E5MessageBox.critical(
+                    None,
+                    self.tr("Save User Project Properties"),
+                    self.tr(
+                        "<p>The user specific project properties file"
+                        " <b>{0}</b> could not be written.</p>"
+                        "<p>Reason: {1}</p>"
+                    ).format(filename, str(err))
+                )
+                return False
+        
+        return True
+    
+    def readFile(self, filename: str) -> bool:
+        """
+        Public method to read the user project data from a user project
+        JSON file.
+        
+        @param filename name of the project file
+        @type str
+        @return flag indicating a successful read
+        @rtype bool
+        """
+        try:
+            with open(filename, "r") as f:
+                jsonString = f.read()
+            userProjectDict = json.loads(jsonString)
+        except (EnvironmentError, json.JSONDecodeError) as err:
+            E5MessageBox.critical(
+                None,
+                self.tr("Read User Project Properties"),
+                self.tr(
+                    "<p>The user specific project properties file <b>{0}</b>"
+                    " could not be read.</p><p>Reason: {1}</p>"
+                ).format(filename, str(err))
+            )
+            return False
+        
+        self.__project.pudata = userProjectDict["user_data"]
+        
+        return True
--- a/eric6/QScintilla/Lexers/LexerPygments.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/QScintilla/Lexers/LexerPygments.py	Mon Feb 01 13:25:37 2021 +0100
@@ -187,9 +187,12 @@
         if name.startswith("Pygments|"):
             self.__forcedPygmentsName = True
             self.__pygmentsName = name.replace("Pygments|", "")
-        else:
+        elif name:
             self.__pygmentsName = name
             self.__forcedPygmentsName = True
+        else:
+            self.__pygmentsName = ""
+            self.__forcedPygmentsName = False
         
         self.descriptions = {
             PYGMENTS_DEFAULT: self.tr("Default"),
@@ -317,10 +320,7 @@
         @return language of the lexer (string)
         """
         if self.__pygmentsName:
-            if self.__forcedPygmentsName:
-                return "Guessed"
-            else:
-                return self.__pygmentsName
+            return self.__pygmentsName
         else:
             return "Guessed"
     
--- a/eric6/QScintilla/Lexers/__init__.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/QScintilla/Lexers/__init__.py	Mon Feb 01 13:25:37 2021 +0100
@@ -80,85 +80,123 @@
         (string, string, string)
     """
     supportedLanguages = {
-        "Bash": [QCoreApplication.translate('Lexers', "Bash"), 'dummy.sh',
-                 "lexerBash"],
-        "Batch": [QCoreApplication.translate('Lexers', "Batch"), 'dummy.bat',
-                  "lexerBatch"],
-        "C++": [QCoreApplication.translate('Lexers', "C/C++"), 'dummy.cpp',
-                "lexerCPP"],
-        "C#": [QCoreApplication.translate('Lexers', "C#"), 'dummy.cs',
-               "lexerCsharp"],
-        "CMake": [QCoreApplication.translate('Lexers', "CMake"), 'dummy.cmake',
-                  "lexerCMake"],
-        "CSS": [QCoreApplication.translate('Lexers', "CSS"), 'dummy.css',
-                "lexerCSS"],
-        "Cython": [QCoreApplication.translate('Lexers', "Cython"), 'dummy.pyx',
-                   "lexerCython"],
-        "D": [QCoreApplication.translate('Lexers', "D"), 'dummy.d',
-              "lexerD"],
-        "Diff": [QCoreApplication.translate('Lexers', "Diff"), 'dummy.diff',
-                 "lexerDiff"],
-        "Fortran": [QCoreApplication.translate('Lexers', "Fortran"),
-                    'dummy.f95', "lexerFortran"],
-        "Fortran77": [QCoreApplication.translate('Lexers', "Fortran77"),
-                      'dummy.f', "lexerFortran"],
-        "HTML": [QCoreApplication.translate('Lexers', "HTML/PHP/XML"),
-                 'dummy.html', "lexerHTML"],
-        "IDL": [QCoreApplication.translate('Lexers', "IDL"), 'dummy.idl',
-                "lexerIDL"],
-        "Java": [QCoreApplication.translate('Lexers', "Java"), 'dummy.java',
-                 "lexerJava"],
-        "JavaScript": [QCoreApplication.translate('Lexers', "JavaScript"),
-                       'dummy.js', "lexerJavaScript"],
-        "Lua": [QCoreApplication.translate('Lexers', "Lua"), 'dummy.lua',
-                "lexerLua"],
-        "Makefile": [QCoreApplication.translate('Lexers', "Makefile"),
-                     'dummy.mak', "lexerMakefile"],
-        "Matlab": [QCoreApplication.translate('Lexers', "Matlab"),
-                   'dummy.m.matlab', "lexerMatlab"],
-        "Octave": [QCoreApplication.translate('Lexers', "Octave"),
-                   'dummy.m.octave', "lexerOctave"],
-        "Pascal": [QCoreApplication.translate('Lexers', "Pascal"), 'dummy.pas',
-                   "lexerPascal"],
-        "Perl": [QCoreApplication.translate('Lexers', "Perl"), 'dummy.pl',
-                 "lexerPerl"],
-        "PostScript": [QCoreApplication.translate('Lexers', "PostScript"),
-                       'dummy.ps', "lexerPostscript"],
-        "Povray": [QCoreApplication.translate('Lexers', "Povray"), 'dummy.pov',
-                   "lexerPOV"],
-        "Properties": [QCoreApplication.translate('Lexers', "Properties"),
-                       'dummy.ini', "lexerProperties"],
-        "Protocol": [QCoreApplication.translate('Lexers',
-                                                "Protocol (protobuf)"),
-                     'dummy.proto', "protobuf"],
-        "Python3": [QCoreApplication.translate('Lexers', "Python3"),
-                    'dummy.py', "lexerPython3"],
-        "MicroPython": [QCoreApplication.translate('Lexers', "MicroPython"),
-                        'dummy.py', "micropython"],
-        "QSS": [QCoreApplication.translate('Lexers', "QSS"), 'dummy.qss',
-                "lexerCSS"],
-        "Ruby": [QCoreApplication.translate('Lexers', "Ruby"), 'dummy.rb',
-                 "lexerRuby"],
-        "SQL": [QCoreApplication.translate('Lexers', "SQL"), 'dummy.sql',
-                "lexerSQL"],
-        "TCL": [QCoreApplication.translate('Lexers', "TCL"), 'dummy.tcl',
-                "lexerTCL"],
-        "TeX": [QCoreApplication.translate('Lexers', "TeX"), 'dummy.tex',
-                "lexerTeX"],
-        "VHDL": [QCoreApplication.translate('Lexers', "VHDL"), 'dummy.vhd',
-                 "lexerVHDL"],
-        "XML": [QCoreApplication.translate('Lexers', "XML"), 'dummy.xml',
-                "lexerXML"],
-        "YAML": [QCoreApplication.translate('Lexers', "YAML"), 'dummy.yml',
-                 "lexerYAML"],
-        "Gettext": [QCoreApplication.translate('Lexers', "Gettext"),
-                    'dummy.po', "lexerGettext"],
-        "CoffeeScript": [QCoreApplication.translate('Lexers', "CoffeeScript"),
-                         'dummy.coffee', "lexerCoffeeScript"],
-        "JSON": [QCoreApplication.translate('Lexers', "JSON"), 'dummy.json',
-                 "lexerJSON"],
-        "Markdown": [QCoreApplication.translate('Lexers', "Markdown"),
-                     'dummy.md', "lexerMarkdown"],
+        "Bash":
+            [QCoreApplication.translate('Lexers', "Bash"), 'dummy.sh',
+             "lexerBash"],
+        "Batch":
+            [QCoreApplication.translate('Lexers', "Batch"), 'dummy.bat',
+             "lexerBatch"],
+        "C++":
+            [QCoreApplication.translate('Lexers', "C/C++"), 'dummy.cpp',
+             "lexerCPP"],
+        "C#":
+            [QCoreApplication.translate('Lexers', "C#"), 'dummy.cs',
+             "lexerCsharp"],
+        "CMake":
+            [QCoreApplication.translate('Lexers', "CMake"), 'dummy.cmake',
+             "lexerCMake"],
+        "CSS":
+            [QCoreApplication.translate('Lexers', "CSS"), 'dummy.css',
+             "lexerCSS"],
+        "Cython":
+            [QCoreApplication.translate('Lexers', "Cython"), 'dummy.pyx',
+             "lexerCython"],
+        "D":
+            [QCoreApplication.translate('Lexers', "D"), 'dummy.d',
+             "lexerD"],
+        "Diff":
+            [QCoreApplication.translate('Lexers', "Diff"), 'dummy.diff',
+             "lexerDiff"],
+        "Fortran":
+            [QCoreApplication.translate('Lexers', "Fortran"), 'dummy.f95',
+             "lexerFortran"],
+        "Fortran77":
+            [QCoreApplication.translate('Lexers', "Fortran77"), 'dummy.f',
+             "lexerFortran"],
+        "HTML":
+            [QCoreApplication.translate('Lexers', "HTML/PHP/XML"),
+             'dummy.html', "lexerHTML"],
+        "IDL":
+            [QCoreApplication.translate('Lexers', "IDL"), 'dummy.idl',
+             "lexerIDL"],
+        "Java":
+            [QCoreApplication.translate('Lexers', "Java"), 'dummy.java',
+             "lexerJava"],
+        "JavaScript":
+            [QCoreApplication.translate('Lexers', "JavaScript"), 'dummy.js',
+             "lexerJavaScript"],
+        "Lua":
+            [QCoreApplication.translate('Lexers', "Lua"), 'dummy.lua',
+             "lexerLua"],
+        "Makefile":
+            [QCoreApplication.translate('Lexers', "Makefile"), 'dummy.mak',
+             "lexerMakefile"],
+        "Matlab":
+            [QCoreApplication.translate('Lexers', "Matlab"), 'dummy.m.matlab',
+             "lexerMatlab"],
+        "Octave":
+            [QCoreApplication.translate('Lexers', "Octave"), 'dummy.m.octave',
+             "lexerOctave"],
+        "Pascal":
+            [QCoreApplication.translate('Lexers', "Pascal"), 'dummy.pas',
+             "lexerPascal"],
+        "Perl":
+            [QCoreApplication.translate('Lexers', "Perl"), 'dummy.pl',
+             "lexerPerl"],
+        "PostScript":
+            [QCoreApplication.translate('Lexers', "PostScript"), 'dummy.ps',
+             "lexerPostscript"],
+        "Povray":
+            [QCoreApplication.translate('Lexers', "Povray"), 'dummy.pov',
+             "lexerPOV"],
+        "Properties":
+            [QCoreApplication.translate('Lexers', "Properties"), 'dummy.ini',
+             "lexerProperties"],
+        "Protocol Buffer": [
+            QCoreApplication.translate('Lexers', "Protocol Buffer (protobuf)"),
+            'dummy.proto', "protobuf"],
+        "Python3":
+            [QCoreApplication.translate('Lexers', "Python3"), 'dummy.py',
+             "lexerPython3"],
+        "MicroPython":
+            [QCoreApplication.translate('Lexers', "MicroPython"), 'dummy.py',
+             "micropython"],
+        "QSS":
+            [QCoreApplication.translate('Lexers', "QSS"), 'dummy.qss',
+             "lexerCSS"],
+        "Ruby":
+            [QCoreApplication.translate('Lexers', "Ruby"), 'dummy.rb',
+             "lexerRuby"],
+        "SQL":
+            [QCoreApplication.translate('Lexers', "SQL"), 'dummy.sql',
+             "lexerSQL"],
+        "TCL":
+            [QCoreApplication.translate('Lexers', "TCL"), 'dummy.tcl',
+             "lexerTCL"],
+        "TeX":
+            [QCoreApplication.translate('Lexers', "TeX"), 'dummy.tex',
+             "lexerTeX"],
+        "VHDL":
+            [QCoreApplication.translate('Lexers', "VHDL"), 'dummy.vhd',
+             "lexerVHDL"],
+        "XML":
+            [QCoreApplication.translate('Lexers', "XML"), 'dummy.xml',
+             "lexerXML"],
+        "YAML":
+            [QCoreApplication.translate('Lexers', "YAML"), 'dummy.yml',
+             "lexerYAML"],
+        "Gettext":
+            [QCoreApplication.translate('Lexers', "Gettext"), 'dummy.po',
+             "lexerGettext"],
+        "CoffeeScript":
+            [QCoreApplication.translate('Lexers', "CoffeeScript"),
+             'dummy.coffee', "lexerCoffeeScript"],
+        "JSON":
+            [QCoreApplication.translate('Lexers', "JSON"), 'dummy.json',
+             "lexerJSON"],
+        "Markdown":
+            [QCoreApplication.translate('Lexers', "Markdown"), 'dummy.md',
+             "lexerMarkdown"],
     }
     
     for name in LexerRegistry:
@@ -214,7 +252,7 @@
     @param language language of the lexer (string)
     @param parent reference to the parent object (QObject)
     @param pyname name of the pygments lexer to use (string)
-    @return reference to the instanciated lexer object (QsciLexer)
+    @return reference to the instantiated lexer object (QsciLexer)
     """
     if not pyname:
         try:
@@ -329,7 +367,7 @@
                 from .LexerMarkdown import LexerMarkdown
                 return LexerMarkdown(parent)
             
-            elif language == "Protocol":
+            elif language == "Protocol Buffer":
                 return __getPygmentsLexer(parent, name="Protocol Buffer")
             
             elif language in LexerRegistry:
@@ -393,7 +431,7 @@
             'IDL Files (*.idl)'),
         QCoreApplication.translate(
             'Lexers',
-            'Protocol Files (*.proto)'),
+            'Protocol Buffer Files (*.proto)'),
         QCoreApplication.translate(
             'Lexers',
             'C Files (*.h *.c)'),
@@ -569,7 +607,7 @@
             "IDL Files (*.idl)"),
         QCoreApplication.translate(
             'Lexers',
-            'Protocol Files (*.proto)'),
+            'Protocol Buffer Files (*.proto)'),
         QCoreApplication.translate(
             'Lexers',
             "C Files (*.c)"),
@@ -842,6 +880,7 @@
         '*.m': "Matlab",
         '*.m.matlab': "Matlab",
         '*.m.octave': "Octave",
+        '*.e4c': "XML",
         '*.e4d': "XML",
         '*.e4k': "XML",
         '*.e4m': "XML",
@@ -863,7 +902,16 @@
         '*.e6q': "XML",
         '*.e6s': "XML",
         '*.e6t': "XML",
-        '*.proto': "Protocol",
+        '*.ecj': "JSON",
+        '*.edj': "JSON",
+        '*.ehj': "JSON",
+        '*.ekj': "JSON",
+        '*.emj': "JSON",
+        '*.epj': "JSON",
+        '*.eqj': "JSON",
+        '*.esj': "JSON",
+        '*.etj': "JSON",
+        '*.proto': "Protocol Buffer",
         '*.po': "Gettext",
         '*.coffee': "CoffeeScript",
         '*.json': "JSON",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Sessions/SessionFile.py	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,364 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class representing the session JSON file.
+"""
+
+import json
+import time
+
+from PyQt5.QtCore import QObject
+
+from E5Gui import E5MessageBox
+from E5Gui.E5OverrideCursor import E5OverridenCursor
+from E5Gui.E5Application import e5App
+
+import Preferences
+
+
+class SessionFile(QObject):
+    """
+    Class representing the session JSON file.
+    """
+    def __init__(self, isGlobal: bool, parent: QObject = None):
+        """
+        Constructor
+        
+        @param isGlobal flag indicating a file for a global session
+        @type bool
+        @param parent reference to the parent object (defaults to None)
+        @type QObject (optional)
+        """
+        super(SessionFile, self).__init__(parent)
+        
+        self.__isGlobal = isGlobal
+    
+    def writeFile(self, filename: str) -> bool:
+        """
+        Public method to write the session data to a session JSON file.
+        
+        @param filename name of the session file
+        @type str
+        @return flag indicating a successful write
+        @rtype bool
+        """
+        # get references to objects we need
+        project = e5App().getObject("Project")
+        projectBrowser = e5App().getObject("ProjectBrowser")
+        multiProject = e5App().getObject("MultiProject")
+        vm = e5App().getObject("ViewManager")
+        dbg = e5App().getObject("DebugUI")
+        dbs = e5App().getObject("DebugServer")
+        
+        # prepare the session data dictionary
+        # step 0: header
+        sessionDict = {}
+        sessionDict["header"] = {}
+        if not self.__isGlobal:
+            sessionDict["header"]["comment"] = (
+                "eric session file for project {0}"
+                .format(project.getProjectName())
+            )
+        sessionDict["header"]["warning"] = (
+            "This file was generated automatically, do not edit."
+        )
+        
+        if Preferences.getProject("TimestampFile") or self.__isGlobal:
+            sessionDict["header"]["saved"] = (
+                time.strftime('%Y-%m-%d, %H:%M:%S')
+            )
+        
+        # step 1: open multi project and project for global session
+        sessionDict["MultiProject"] = ""
+        sessionDict["Project"] = ""
+        if self.__isGlobal:
+            if multiProject.isOpen():
+                sessionDict["MultiProject"] = (
+                    multiProject.getMultiProjectFile()
+                )
+            if project.isOpen():
+                sessionDict["Project"] = project.getProjectFile()
+        
+        # step 2: all open (project) filenames and the active editor
+        if vm.canSplit():
+            sessionDict["ViewManagerSplits"] = {
+                "Count": vm.splitCount(),
+                "Orientation": vm.getSplitOrientation(),
+            }
+        else:
+            sessionDict["ViewManagerSplits"] = {
+                "Count": 0,
+                "Orientation": 1,
+            }
+        
+        editorsDict = {}    # remember editors by file name to detect clones
+        sessionDict["Editors"] = []
+        allOpenEditorLists = vm.getOpenEditorsForSession()
+        for splitIndex, openEditorList in enumerate(allOpenEditorLists):
+            for editorIndex, editor in enumerate(openEditorList):
+                fileName = editor.getFileName()
+                if self.__isGlobal or project.isProjectFile(fileName):
+                    if fileName in editorsDict:
+                        isClone = editorsDict[fileName].isClone(editor)
+                    else:
+                        isClone = False
+                        editorsDict[fileName] = editor
+                    editorDict = {
+                        "Filename": fileName,
+                        "Cursor": editor.getCursorPosition(),
+                        "Folds": editor.contractedFolds(),
+                        "Zoom": editor.getZoom(),
+                        "Clone": isClone,
+                        "Splitindex": splitIndex,
+                        "Editorindex": editorIndex,
+                    }
+                    sessionDict["Editors"].append(editorDict)
+        
+        aw = vm.getActiveName()
+        sessionDict["ActiveWindow"] = {}
+        if aw and (self.__isGlobal or project.isProjectFile(aw)):
+            ed = vm.getOpenEditor(aw)
+            sessionDict["ActiveWindow"] = {
+                "Filename": aw,
+                "Cursor": ed.getCursorPosition(),
+            }
+        
+        # step 3: breakpoints
+        allBreaks = Preferences.getProject("SessionAllBreakpoints")
+        projectFiles = project.getSources(True)
+        bpModel = dbs.getBreakPointModel()
+        if self.__isGlobal or allBreaks:
+            sessionDict["Breakpoints"] = bpModel.getAllBreakpoints()
+        else:
+            sessionDict["Breakpoints"] = [
+                bp
+                for bp in bpModel.getAllBreakpoints()
+                if bp[0] in projectFiles
+            ]
+        
+        # step 4: watch expressions
+        wpModel = dbs.getWatchPointModel()
+        sessionDict["Watchpoints"] = wpModel.getAllWatchpoints()
+        
+        # step 5: debug info
+        if self.__isGlobal:
+            if len(dbg.argvHistory):
+                dbgCmdline = dbg.argvHistory[0]
+            else:
+                dbgCmdline = ""
+            if len(dbg.wdHistory):
+                dbgWd = dbg.wdHistory[0]
+            else:
+                dbgWd = ""
+            if len(dbg.envHistory):
+                dbgEnv = dbg.envHistory[0]
+            else:
+                dbgEnv = ""
+            if len(dbg.multiprocessNoDebugHistory):
+                dbgMultiprocessNoDebug = (
+                    dbg.multiprocessNoDebugHistory[0]
+                )
+            else:
+                dbgMultiprocessNoDebug = ""
+            sessionDict["DebugInfo"] = {
+                "VirtualEnv": dbg.lastUsedVenvName,
+                "CommandLine": dbgCmdline,
+                "WorkingDirectory": dbgWd,
+                "Environment": dbgEnv,
+                "ReportExceptions": dbg.exceptions,
+                "Exceptions": dbg.excList,
+                "IgnoredExceptions": dbg.excIgnoreList,
+                "AutoClearShell": dbg.autoClearShell,
+                "TracePython": dbg.tracePython,
+                "AutoContinue": dbg.autoContinue,
+                "EnableMultiprocess": dbg.enableMultiprocess,
+                "MultiprocessNoDebug": dbgMultiprocessNoDebug
+            }
+        else:
+            sessionDict["DebugInfo"] = {
+                "VirtualEnv": project.dbgVirtualEnv,
+                "CommandLine": project.dbgCmdline,
+                "WorkingDirectory": project.dbgWd,
+                "Environment": project.dbgEnv,
+                "ReportExceptions": project.dbgReportExceptions,
+                "Exceptions": project.dbgExcList,
+                "IgnoredExceptions": project.dbgExcIgnoreList,
+                "AutoClearShell": project.dbgAutoClearShell,
+                "TracePython": project.dbgTracePython,
+                "AutoContinue": project.dbgAutoContinue,
+                "EnableMultiprocess": project.dbgEnableMultiprocess,
+                "MultiprocessNoDebug": project.dbgMultiprocessNoDebug,
+            }
+        
+        # step 6: bookmarks
+        bookmarksList = []
+        for fileName in editorsDict:
+            if self.__isGlobal or project.isProjectFile(fileName):
+                editor = editorsDict[fileName]
+                bookmarks = editor.getBookmarks()
+                if bookmarks:
+                    bookmarksList.append({
+                        "Filename": fileName,
+                        "Lines": bookmarks,
+                    })
+        sessionDict["Bookmarks"] = bookmarksList
+        
+        # step 7: state of the various project browsers
+        browsersList = []
+        for browserName in projectBrowser.getProjectBrowserNames():
+            expandedItems = (
+                projectBrowser.getProjectBrowser(browserName)
+                .getExpandedItemNames()
+            )
+            if expandedItems:
+                browsersList.append({
+                    "Name": browserName,
+                    "ExpandedItems": expandedItems,
+                })
+        sessionDict["ProjectBrowserStates"] = browsersList
+        
+        try:
+            jsonString = json.dumps(sessionDict, indent=2)
+            with open(filename, "w") as f:
+                f.write(jsonString)
+        except (TypeError, EnvironmentError) as err:
+            with E5OverridenCursor():
+                E5MessageBox.critical(
+                    None,
+                    self.tr("Save Session"),
+                    self.tr(
+                        "<p>The session file <b>{0}</b> could not be"
+                        " written.</p><p>Reason: {1}</p>"
+                    ).format(filename, str(err))
+                )
+                return False
+        
+        return True
+    
+    def readFile(self, filename: str) -> bool:
+        """
+        Public method to read the session data from a session JSON file.
+        
+        @param filename name of the project file
+        @type str
+        @return flag indicating a successful read
+        @rtype bool
+        """
+        try:
+            with open(filename, "r") as f:
+                jsonString = f.read()
+            sessionDict = json.loads(jsonString)
+        except (EnvironmentError, json.JSONDecodeError) as err:
+            E5MessageBox.critical(
+                None,
+                self.tr("Read Session"),
+                self.tr(
+                    "<p>The session file <b>{0}</b> could not be read.</p>"
+                    "<p>Reason: {1}</p>"
+                ).format(filename, str(err))
+            )
+            return False
+        
+        # get references to objects we need
+        project = e5App().getObject("Project")
+        projectBrowser = e5App().getObject("ProjectBrowser")
+        multiProject = e5App().getObject("MultiProject")
+        vm = e5App().getObject("ViewManager")
+        dbg = e5App().getObject("DebugUI")
+        dbs = e5App().getObject("DebugServer")
+        
+        # step 1: multi project and project
+        if sessionDict["MultiProject"]:
+            multiProject.openMultiProject(sessionDict["MultiProject"], False)
+        if sessionDict["Project"]:
+            project.openProject(sessionDict["Project"], False)
+        
+        # step 2: (project) filenames and the active editor
+        vm.setSplitOrientation(sessionDict["ViewManagerSplits"]["Orientation"])
+        vm.setSplitCount(sessionDict["ViewManagerSplits"]["Count"])
+        
+        editorsDict = {}
+        for editorDict in sessionDict["Editors"]:
+            if editorDict["Clone"] and editorDict["Filename"] in editorsDict:
+                editor = editorsDict[editorDict["Filename"]]
+                ed = vm.newEditorView(
+                    editorDict["Filename"], editor, editor.getFileType(),
+                    indexes=(editorDict["Splitindex"],
+                             editorDict["Editorindex"])
+                )
+            else:
+                ed = vm.openSourceFile(
+                    editorDict["Filename"],
+                    indexes=(editorDict["Splitindex"],
+                             editorDict["Editorindex"])
+                )
+                editorsDict[editorDict["Filename"]] = ed
+            if ed is not None:
+                ed.zoomTo(editorDict["Zoom"])
+                if editorDict["Folds"]:
+                    ed.recolor()
+                    ed.setContractedFolds(editorDict["Folds"])
+                    ed.setCursorPosition(*editorDict["Cursor"])
+        
+        # step 3: breakpoints
+        bpModel = dbs.getBreakPointModel()
+        bpModel.addBreakPoints(sessionDict["Breakpoints"])
+        
+        # step 4: watch expressions
+        wpModel = dbs.getWatchPointModel()
+        wpModel.addWatchPoints(sessionDict["Watchpoints"])
+        
+        # step 5: debug info
+        debugInfoDict = sessionDict["DebugInfo"]
+        dbg.lastUsedVenvName = debugInfoDict["VirtualEnv"]
+        dbg.setArgvHistory(debugInfoDict["CommandLine"])
+        dbg.setWdHistory(debugInfoDict["WorkingDirectory"])
+        dbg.setEnvHistory(debugInfoDict["Environment"])
+        dbg.setExceptionReporting(debugInfoDict["ReportExceptions"])
+        dbg.setExcList(debugInfoDict["Exceptions"])
+        dbg.setExcIgnoreList(debugInfoDict["IgnoredExceptions"])
+        dbg.setAutoClearShell(debugInfoDict["AutoClearShell"])
+        dbg.setTracePython(debugInfoDict["TracePython"])
+        dbg.setAutoContinue(debugInfoDict["AutoContinue"])
+        dbg.setEnableMultiprocess(debugInfoDict["EnableMultiprocess"])
+        dbg.setMultiprocessNoDebugHistory(debugInfoDict["MultiprocessNoDebug"])
+        if not self.__isGlobal:
+            project.setDbgInfo(
+                debugInfoDict["VirtualEnv"],
+                debugInfoDict["CommandLine"],
+                debugInfoDict["WorkingDirectory"],
+                debugInfoDict["Environment"],
+                debugInfoDict["ReportExceptions"],
+                debugInfoDict["Exceptions"],
+                debugInfoDict["IgnoredExceptions"],
+                debugInfoDict["AutoClearShell"],
+                debugInfoDict["TracePython"],
+                debugInfoDict["AutoContinue"],
+                debugInfoDict["EnableMultiprocess"],
+                debugInfoDict["MultiprocessNoDebug"]
+            )
+        
+        # step 6: bookmarks
+        for bookmark in sessionDict["Bookmarks"]:
+            editor = vm.getOpenEditor(bookmark["Filename"])
+            if editor is not None:
+                for lineno in bookmark["Lines"]:
+                    editor.toggleBookmark(lineno)
+        
+        # step 7: state of the various project browsers
+        for browserState in sessionDict["ProjectBrowserStates"]:
+            browser = projectBrowser.getProjectBrowser(browserState["Name"])
+            if browser is not None:
+                browser.expandItemsByName(browserState["ExpandedItems"])
+        
+        # step 8: active window
+        vm.openFiles(sessionDict["ActiveWindow"]["Filename"])
+        ed = vm.getOpenEditor(sessionDict["ActiveWindow"]["Filename"])
+        if ed is not None:
+            ed.setCursorPosition(*sessionDict["ActiveWindow"]["Cursor"])
+            ed.ensureCursorVisible()
+        
+        return True
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Sessions/__init__.py	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,8 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Package containing session related modules.
+"""
--- a/eric6/Tasks/Task.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Tasks/Task.py	Mon Feb 01 13:25:37 2021 +0100
@@ -292,3 +292,24 @@
         @return flag indicating a project file task (boolean)
         """
         return self._isProjectTask and self.filename != ""
+    
+    def toDict(self):
+        """
+        Public method to convert the task data to a dictionary.
+        
+        @return dictionary containing the task data
+        @rtype dict
+        """
+        return {
+            "summary": self.summary.strip(),
+            "description": self.description.strip(),
+            "priority": self.priority,
+            "lineno": self.lineno,
+            "completed": self.completed,
+            "created": self.created,
+            "type": self.taskType,
+            "uid": self.uid,
+            "parent_uid": self.parentUid,
+            "expanded": self.isExpanded(),
+            "filename": self.getFilename(),
+        }
--- a/eric6/Tasks/TaskViewer.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Tasks/TaskViewer.py	Mon Feb 01 13:25:37 2021 +0100
@@ -71,7 +71,7 @@
         self.copyTask = None
         self.projectOpen = False
         self.project = project
-        self.projectTasksScanFilter = ""
+        self.__projectTasksScanFilter = ""
         
         from .TaskFilter import TaskFilter
         self.taskFilter = TaskFilter()
@@ -337,13 +337,24 @@
             Task.TypeWarning, Task.TypeNote)
         @param description explanatory text of the task (string)
         @param uid unique id of the task (string)
-        @param parentTask reference to the parent task item (Task)
+        @param parentTask reference to the parent task item (Task) or the
+            UID of the parent task
         @return reference to the task item (Task)
         """
-        if parentTask:
-            parentUid = parentTask.getUuid()
+        if isinstance(parentTask, str):
+            # UID of parent task
+            if parentTask == "":
+                parentUid = ""
+                parentTask = None
+            else:
+                parentUid = parentTask
+                parentTask = self.findParentTask(parentUid)
         else:
-            parentUid = ""
+            # parent task item
+            if parentTask:
+                parentUid = parentTask.getUuid()
+            else:
+                parentUid = ""
         task = Task(summary, priority, filename, lineno, completed,
                     _time, isProjectTask, taskType,
                     self.project, description, uid, parentUid)
@@ -681,9 +692,9 @@
             self.tr("Enter filename patterns of files"
                     " to be excluded separated by a comma:"),
             QLineEdit.Normal,
-            self.projectTasksScanFilter)
+            self.__projectTasksScanFilter)
         if ok:
-            self.projectTasksScanFilter = scanFilter
+            self.__projectTasksScanFilter = scanFilter
     
     def regenerateProjectTasks(self, quiet=False):
         """
@@ -699,7 +710,7 @@
         files = self.project.pdata["SOURCES"]
         
         # apply file filter
-        filterList = [f.strip() for f in self.projectTasksScanFilter.split(",")
+        filterList = [f.strip() for f in self.__projectTasksScanFilter.split(",")
                       if f.strip()]
         if filterList:
             for scanFilter in filterList:
@@ -785,6 +796,24 @@
         """
         self.__projectTaskExtractionThread.requestInterrupt()
         self.__projectTaskExtractionThread.wait()
+    
+    def getTasksScanFilter(self) -> str:
+        """
+        Public method to get the project scan filter.
+        
+        @return project scan filter
+        @rtype str
+        """
+        return self.__projectTasksScanFilter.strip()
+    
+    def setTasksScanFilter(self, filter: str):
+        """
+        Public method to set the project scan filter.
+        
+        @param filter project scan filter
+        @type str
+        """
+        self.__projectTasksScanFilter = filter
 
 
 class ProjectTaskExtractionThread(QThread):
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Tasks/TasksFile.py	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,149 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class representing the tasks JSON file.
+"""
+
+import json
+import time
+
+from PyQt5.QtCore import QObject
+
+from E5Gui import E5MessageBox
+from E5Gui.E5OverrideCursor import E5OverridenCursor
+from E5Gui.E5Application import e5App
+
+import Preferences
+
+
+class TasksFile(QObject):
+    """
+    Class representing the tasks JSON file.
+    """
+    def __init__(self, isGlobal: bool, parent: QObject = None):
+        """
+        Constructor
+        
+        @param isGlobal flag indicating a file for global tasks
+        @type bool
+        @param parent reference to the parent object (defaults to None)
+        @type QObject (optional)
+        """
+        super(TasksFile, self).__init__(parent)
+        self.__isGlobal = isGlobal
+    
+    def writeFile(self, filename: str) -> bool:
+        """
+        Public method to write the tasks data to a tasks JSON file.
+        
+        @param filename name of the tasks file
+        @type str
+        @return flag indicating a successful write
+        @rtype bool
+        """
+        # prepare the tasks data dictionary
+        # step 0: header
+        tasksDict = {}
+        if self.__isGlobal:
+            tasksDict["header"] = {
+                "comment": "eric tasks file",
+                "saved": time.strftime('%Y-%m-%d, %H:%M:%S'),
+                "warning": (
+                    "This file was generated automatically, do not edit."
+                ),
+            }
+            # step 1: project scan filter
+            tasksDict["ProjectScanFilter"] = ""
+            
+            # step 2: tasks
+            tasksDict["Tasks"] = [
+                task.toDict()
+                for task in e5App().getObject("TaskViewer").getGlobalTasks()
+            ]
+        else:
+            tasksDict["header"] = {
+                "comment": "eric tasks file for project {0}".format(
+                    e5App().getObject("Project").getProjectName()),
+                "warning": (
+                    "This file was generated automatically, do not edit."
+                ),
+            }
+            if Preferences.getProject("TimestampFile"):
+                tasksDict["header"]["saved"] = (
+                    time.strftime('%Y-%m-%d, %H:%M:%S')
+                )
+            # step 1: project scan filter
+            tasksDict["ProjectScanFilter"] = (
+                e5App().getObject("TaskViewer").getTasksScanFilter()
+            )
+            
+            # step 2: tasks
+            tasksDict["Tasks"] = [
+                task.toDict()
+                for task in e5App().getObject("TaskViewer").getProjectTasks()
+            ]
+        
+        try:
+            jsonString = json.dumps(tasksDict, indent=2)
+            with open(filename, "w") as f:
+                f.write(jsonString)
+        except (TypeError, EnvironmentError) as err:
+            with E5OverridenCursor():
+                E5MessageBox.critical(
+                    None,
+                    self.tr("Save Tasks"),
+                    self.tr(
+                        "<p>The tasks file <b>{0}</b> could not be"
+                        " written.</p><p>Reason: {1}</p>"
+                    ).format(filename, str(err))
+                )
+                return False
+        
+        return True
+    
+    def readFile(self, filename: str) -> bool:
+        """
+        Public method to read the tasks data from a task JSON file.
+        
+        @param filename name of the project file
+        @type str
+        @return flag indicating a successful read
+        @rtype bool
+        """
+        try:
+            with open(filename, "r") as f:
+                jsonString = f.read()
+            tasksDict = json.loads(jsonString)
+        except (EnvironmentError, json.JSONDecodeError) as err:
+            E5MessageBox.critical(
+                None,
+                self.tr("Read Tasks"),
+                self.tr(
+                    "<p>The tasks file <b>{0}</b> could not be read.</p>"
+                    "<p>Reason: {1}</p>"
+                ).format(filename, str(err))
+            )
+            return False
+        
+        viewer = e5App().getObject("TaskViewer")
+        if tasksDict["ProjectScanFilter"]:
+            viewer.setTasksScanFilter(tasksDict["ProjectScanFilter"])
+        
+        addedTasks = []
+        for task in tasksDict["Tasks"]:
+            addedTask = viewer.addTask(
+                task["summary"], priority=task["priority"],
+                filename=task["filename"], lineno=task["lineno"],
+                completed=task["completed"], _time=task["created"],
+                isProjectTask=not self.__isGlobal, taskType=task["type"],
+                description=task["description"], uid=task["uid"],
+                parentTask=task["parent_uid"])
+            addedTasks.append((addedTask, task["expanded"]))
+        
+        for task, expanded in addedTasks:
+            task.setExpanded(expanded)
+        
+        return True
--- a/eric6/Templates/TemplateViewer.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/Templates/TemplateViewer.py	Mon Feb 01 13:25:37 2021 +0100
@@ -24,6 +24,8 @@
 import UI.PixmapCache
 import Utilities
 
+from .TemplatesFile import TemplatesFile
+
 
 class TemplateGroup(QTreeWidgetItem):
     """
@@ -432,6 +434,8 @@
         self.__activating = False
         self.__dirty = False
         
+        self.__templatesFile = TemplatesFile(self)
+        
         self.setContextMenuPolicy(Qt.CustomContextMenu)
         self.customContextMenuRequested.connect(self.__showContextMenu)
         self.itemActivated.connect(self.__templateItemActivated)
@@ -563,7 +567,9 @@
             self,
             self.tr("Import Templates"),
             "",
-            self.tr("Templates Files (*.e4c);; All Files (*)"))
+            self.tr("Templates Files (*.ecj);;"
+                    "XML Templates Files (*.e4c);;"
+                    "All Files (*)"))
         
         if fn:
             self.readTemplates(fn)
@@ -577,7 +583,9 @@
             self,
             self.tr("Export Templates"),
             "",
-            self.tr("Templates Files (*.e4c);; All Files (*)"),
+            self.tr("Templates Files (*.ecj);;"
+                    "XML Templates Files (*.e4c);;"
+                    "All Files (*)"),
             "",
             E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))
         
@@ -587,7 +595,17 @@
                 ex = selectedFilter.split("(*")[1].split(")")[0]
                 if ex:
                     fn += ex
-            self.writeTemplates(fn)
+            if os.path.exists(fn):
+                ok = E5MessageBox.yesNo(
+                    self,
+                    self.tr("Export Templates"),
+                    self.tr("""<p>The templates file <b>{0}</b> exists"""
+                            """ already. Overwrite it?</p>""").format(fn))
+            else:
+                ok = True
+            
+            if ok:
+                self.writeTemplates(fn)
     
     def __reload(self):
         """
@@ -948,60 +966,78 @@
         tmpl.setDescription(description)
         tmpl.setTemplateText(template)
         self.__resort()
-
+    
     def writeTemplates(self, filename=None):
         """
-        Public method to write the templates data to an XML file (.e4c).
+        Public method to write the templates data to a JSON file (.ecj).
         
-        @param filename name of a templates file to read (string)
-        @return flag indicating success (boolean)
+        @param filename name of a templates file to write
+        @type str
+        @return flag indicating success
+        @rtype bool
         """
         if filename is None:
             filename = os.path.join(
-                Utilities.getConfigDir(), "eric6templates.e4c")
-        f = QFile(filename)
-        ok = f.open(QIODevice.WriteOnly)
-        if not ok:
-            E5MessageBox.critical(
-                self,
-                self.tr("Save templates"),
-                self.tr(
-                    "<p>The templates file <b>{0}</b> could not be"
-                    " written.</p>")
-                .format(filename))
-            return False
+                Utilities.getConfigDir(), "eric6templates.ecj")
+        if filename.endswith(".ecj"):
+            # new JSON based file
+            res = self.__templatesFile.writeFile(filename)
+        else:
+            # old XML based file
+            f = QFile(filename)
+            ok = f.open(QIODevice.WriteOnly)
+            if not ok:
+                E5MessageBox.critical(
+                    self,
+                    self.tr("Save Templates"),
+                    self.tr(
+                        "<p>The templates file <b>{0}</b> could not be"
+                        " written.</p>")
+                    .format(filename))
+                res = False
+            else:
+                from E5XML.TemplatesWriter import TemplatesWriter
+                TemplatesWriter(f, self).writeXML()
+                f.close()
+                res = True
         
-        from E5XML.TemplatesWriter import TemplatesWriter
-        TemplatesWriter(f, self).writeXML()
-        f.close()
-        
-        return True
+        return res
     
     def readTemplates(self, filename=None):
         """
         Public method to read in the templates file (.e4c).
         
-        @param filename name of a templates file to read (string)
+        @param filename name of a templates file to read
+        @type str
         """
         if filename is None:
+            # new JSON based file first
             filename = os.path.join(
-                Utilities.getConfigDir(), "eric6templates.e4c")
+                Utilities.getConfigDir(), "eric6templates.ecj")
             if not os.path.exists(filename):
-                return
+                # old XML based file second
+                filename = os.path.join(
+                    Utilities.getConfigDir(), "eric6templates.e4c")
+                if not os.path.exists(filename):
+                    return
         
-        f = QFile(filename)
-        if f.open(QIODevice.ReadOnly):
-            from E5XML.TemplatesReader import TemplatesReader
-            reader = TemplatesReader(f, viewer=self)
-            reader.readXML()
-            f.close()
+        if filename.endswith(".ecj"):
+            self.__templatesFile.readFile(filename)
         else:
-            E5MessageBox.critical(
-                self,
-                self.tr("Read templates"),
-                self.tr(
-                    "<p>The templates file <b>{0}</b> could not be read.</p>")
-                .format(filename))
+            f = QFile(filename)
+            if f.open(QIODevice.ReadOnly):
+                from E5XML.TemplatesReader import TemplatesReader
+                reader = TemplatesReader(f, viewer=self)
+                reader.readXML()
+                f.close()
+            else:
+                E5MessageBox.critical(
+                    self,
+                    self.tr("Read Templates"),
+                    self.tr(
+                        "<p>The templates file <b>{0}</b> could not be read."
+                        "</p>")
+                    .format(filename))
     
     def __configure(self):
         """
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eric6/Templates/TemplatesFile.py	Mon Feb 01 13:25:37 2021 +0100
@@ -0,0 +1,127 @@
+# -*- coding: utf-8 -*-
+
+# Copyright (c) 2021 Detlev Offenbach <detlev@die-offenbachs.de>
+#
+
+"""
+Module implementing a class representing the templates JSON file.
+"""
+
+import json
+import time
+import typing
+
+from PyQt5.QtCore import QObject
+
+from E5Gui import E5MessageBox
+from E5Gui.E5OverrideCursor import E5OverridenCursor
+
+
+TemplateViewer = typing.TypeVar("TemplateViewer")
+
+
+class TemplatesFile(QObject):
+    """
+    Class representing the templates JSON file.
+    """
+    def __init__(self, viewer: TemplateViewer, parent: QObject = None):
+        """
+        Constructor
+        
+        @param viewer reference to the template viewer object
+        @type TemplateViewer
+        @param parent reference to the parent object (defaults to None)
+        @type QObject (optional)
+        """
+        super(TemplatesFile, self).__init__(parent)
+        self.__viewer = viewer
+    
+    def writeFile(self, filename: str) -> bool:
+        """
+        Public method to write the templates data to a templates JSON file.
+        
+        @param filename name of the templates file
+        @type str
+        @return flag indicating a successful write
+        @rtype bool
+        """
+        templatesDict = {}
+        # step 0: header
+        templatesDict["header"] = {
+            "comment": "eric templates file",
+            "saved": time.strftime('%Y-%m-%d, %H:%M:%S'),
+            "warning": (
+                "This file was generated automatically, do not edit."
+            ),
+        }
+        
+        # step 1: template groups and templates
+        templateGroups = []
+        for group in self.__viewer.getAllGroups():
+            templates = []
+            for template in group.getAllEntries():
+                templates.append({
+                    "name": template.getName(),
+                    "description": template.getDescription().strip(),
+                    "text": template.getTemplateText()
+                })
+            templateGroups.append({
+                "name": group.getName(),
+                "language": group.getLanguage(),
+                "templates": templates,
+            })
+        templatesDict["template_groups"] = templateGroups
+        
+        try:
+            jsonString = json.dumps(templatesDict, indent=2)
+            with open(filename, "w") as f:
+                f.write(jsonString)
+        except (TypeError, EnvironmentError) as err:
+            with E5OverridenCursor():
+                E5MessageBox.critical(
+                    None,
+                    self.tr("Save Templates"),
+                    self.tr(
+                        "<p>The templates file <b>{0}</b> could not be"
+                        " written.</p><p>Reason: {1}</p>"
+                    ).format(filename, str(err))
+                )
+                return False
+        
+        return True
+    
+    def readFile(self, filename: str) -> bool:
+        """
+        Public method to read the templates data from a templates JSON file.
+        
+        @param filename name of the templates file
+        @type str
+        @return flag indicating a successful read
+        @rtype bool
+        """
+        try:
+            with open(filename, "r") as f:
+                jsonString = f.read()
+            templatesDict = json.loads(jsonString)
+        except (EnvironmentError, json.JSONDecodeError) as err:
+            E5MessageBox.critical(
+                None,
+                self.tr("Read Templates"),
+                self.tr(
+                    "<p>The templates file <b>{0}</b> could not be read.</p>"
+                    "<p>Reason: {1}</p>"
+                ).format(filename, str(err))
+            )
+            return False
+        
+        for templateGroup in templatesDict["template_groups"]:
+            self.__viewer.addGroup(templateGroup["name"],
+                                   templateGroup["language"])
+            for template in templateGroup["templates"]:
+                self.__viewer.addEntry(templateGroup["name"],
+                                       template["name"],
+                                       template["description"],
+                                       template["text"],
+                                       quiet=True)
+        
+        return True
--- a/eric6/UI/UserInterface.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/UI/UserInterface.py	Mon Feb 01 13:25:37 2021 +0100
@@ -51,6 +51,10 @@
 
 import UI.PixmapCache
 
+from Sessions.SessionFile import SessionFile
+
+from Tasks.TasksFile import TasksFile
+
 from E5Network.E5NetworkProxyFactory import (
     E5NetworkProxyFactory, proxyAuthenticationRequired
 )
@@ -610,6 +614,10 @@
         self.__inVersionCheck = False
         self.__versionCheckProgress = None
         
+        # create the various JSON file interfaces
+        self.__sessionFile = SessionFile(True)
+        self.__tasksFile = TasksFile(True)
+        
         # Initialize the actions, menus, toolbars and statusbar
         splash.showMessage(self.tr("Initializing Actions..."))
         self.__initActions()
@@ -6288,7 +6296,8 @@
             None,
             self.tr("Export Keyboard Shortcuts"),
             "",
-            self.tr("Keyboard shortcut file (*.e4k)"),
+            self.tr("Keyboard Shortcuts File (*.ekj);;"
+                    "XML Keyboard Shortcuts File (*.e4k)"),
             "",
             E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))
         
@@ -6301,8 +6310,18 @@
             if ex:
                 fn += ex
         
-        from Preferences import Shortcuts
-        Shortcuts.exportShortcuts(fn)
+        if os.path.exists(fn):
+            ok = E5MessageBox.yesNo(
+                self,
+                self.tr("Export Keyboard Shortcuts"),
+                self.tr("""<p>The keyboard shortcuts file <b>{0}</b> exists"""
+                        """ already. Overwrite it?</p>""").format(fn))
+        else:
+            ok = True
+        
+        if ok:
+            from Preferences import Shortcuts
+            Shortcuts.exportShortcuts(fn)
 
     def __importShortcuts(self):
         """
@@ -6312,7 +6331,8 @@
             None,
             self.tr("Import Keyboard Shortcuts"),
             "",
-            self.tr("Keyboard shortcut file (*.e4k)"))
+            self.tr("Keyboard Shortcuts File (*.ekj);;"
+                    "XML Keyboard shortcut file (*.e4k)"))
         
         if fn:
             from Preferences import Shortcuts
@@ -6472,51 +6492,41 @@
     
     def __writeTasks(self):
         """
-        Private slot to write the tasks data to an XML file (.e6t).
-        """
-        fn = os.path.join(Utilities.getConfigDir(), "eric6tasks.e6t")
-        f = QFile(fn)
-        ok = f.open(QIODevice.WriteOnly)
-        if not ok:
-            E5MessageBox.critical(
-                self,
-                self.tr("Save tasks"),
-                self.tr(
-                    "<p>The tasks file <b>{0}</b> could not be written.</p>")
-                .format(fn))
-            return
-        
-        from E5XML.TasksWriter import TasksWriter
-        TasksWriter(f, False).writeXML()
-        f.close()
-        
+        Private slot to write the tasks data to a JSON file (.etj).
+        """
+        fn = os.path.join(Utilities.getConfigDir(), "eric6tasks.etj")
+        self.__tasksFile.writeFile(fn)
+    
     def __readTasks(self):
         """
-        Private slot to read in the tasks file (.e6t).
-        """
-        fn = os.path.join(Utilities.getConfigDir(), "eric6tasks.e6t")
-        if not os.path.exists(fn):
-            # try again with the old extension
-            fn = os.path.join(Utilities.getConfigDir(), "eric6tasks.e4t")
-            if not os.path.exists(fn):
-                return
-        f = QFile(fn)
-        if f.open(QIODevice.ReadOnly):
-            from E5XML.TasksReader import TasksReader
-            reader = TasksReader(f, viewer=self.taskViewer)
-            reader.readXML()
-            f.close()
+        Private slot to read in the tasks file (.etj or .e6t).
+        """
+        fn = os.path.join(Utilities.getConfigDir(), "eric6tasks.etj")
+        if os.path.exists(fn):
+            # try new style JSON file first
+            self.__tasksFile.readFile(fn)
         else:
-            E5MessageBox.critical(
-                self,
-                self.tr("Read tasks"),
-                self.tr(
-                    "<p>The tasks file <b>{0}</b> could not be read.</p>")
-                .format(fn))
+            # try old style XML file second
+            fn = os.path.join(Utilities.getConfigDir(), "eric6tasks.e6t")
+            if os.path.exists(fn):
+                f = QFile(fn)
+                if f.open(QIODevice.ReadOnly):
+                    from E5XML.TasksReader import TasksReader
+                    reader = TasksReader(f, viewer=self.taskViewer)
+                    reader.readXML()
+                    f.close()
+                else:
+                    E5MessageBox.critical(
+                        self,
+                        self.tr("Read Tasks"),
+                        self.tr(
+                            "<p>The tasks file <b>{0}</b> could not be"
+                            " read.</p>")
+                        .format(fn))
         
     def __writeSession(self, filename="", crashSession=False):
         """
-        Private slot to write the session data to an XML file (.e5s).
+        Private slot to write the session data to a JSON file (.esj).
         
         @param filename name of a session file to write
         @type str
@@ -6525,33 +6535,38 @@
         @return flag indicating success
         @rtype bool
         """
-        res = False
         if filename:
             fn = filename
         elif crashSession:
             fn = os.path.join(Utilities.getConfigDir(),
-                              "eric6_crash_session.e5s")
+                              "eric6_crash_session.esj")
         else:
             fn = os.path.join(Utilities.getConfigDir(),
-                              "eric6session.e5s")
-        f = QFile(fn)
-        if f.open(QIODevice.WriteOnly):
-            from E5XML.SessionWriter import SessionWriter
-            SessionWriter(f, None).writeXML()
-            f.close()
-            res = True
+                              "eric6session.esj")
+        
+        if fn.endswith(".esj"):
+            res = self.__sessionFile.writeFile(fn)
         else:
-            E5MessageBox.critical(
-                self,
-                self.tr("Save session"),
-                self.tr("<p>The session file <b>{0}</b> could not be"
-                        " written.</p>")
-                .format(fn))
+            f = QFile(fn)
+            if f.open(QIODevice.WriteOnly):
+                from E5XML.SessionWriter import SessionWriter
+                SessionWriter(f, None).writeXML()
+                f.close()
+                res = True
+            else:
+                E5MessageBox.critical(
+                    self,
+                    self.tr("Save Session"),
+                    self.tr("<p>The session file <b>{0}</b> could not be"
+                            " written.</p>")
+                    .format(fn))
+                res = False
+        
         return res
-        
+    
     def __readSession(self, filename=""):
         """
-        Private slot to read in the session file (.e5s or .e4s).
+        Private slot to read in the session file (.esj or .e5s).
         
         @param filename name of a session file to read
         @type str
@@ -6562,14 +6577,14 @@
             fn = filename
         else:
             fn = os.path.join(Utilities.getConfigDir(),
-                              "eric6session.e5s")
+                              "eric6session.esj")
             if not os.path.exists(fn):
                 fn = os.path.join(Utilities.getConfigDir(),
-                                  "eric6session.e4s")
+                                  "eric6session.e5s")
                 if not os.path.exists(fn):
                     E5MessageBox.critical(
                         self,
-                        self.tr("Read session"),
+                        self.tr("Read Session"),
                         self.tr("<p>The session file <b>{0}</b> could not"
                                 " be read.</p>")
                         .format(fn))
@@ -6577,22 +6592,29 @@
         
         res = False
         if fn:
-            f = QFile(fn)
-            if f.open(QIODevice.ReadOnly):
-                from E5XML.SessionReader import SessionReader
+            if fn.endswith(".esj"):
+                # new JSON based format
                 self.__readingSession = True
-                reader = SessionReader(f, True)
-                reader.readXML()
+                res = self.__sessionFile.readFile(fn)
                 self.__readingSession = False
-                f.close()
-                res = True
             else:
-                E5MessageBox.critical(
-                    self,
-                    self.tr("Read session"),
-                    self.tr("<p>The session file <b>{0}</b> could not be"
-                            " read.</p>")
-                    .format(fn))
+                # old XML based format
+                f = QFile(fn)
+                if f.open(QIODevice.ReadOnly):
+                    from E5XML.SessionReader import SessionReader
+                    self.__readingSession = True
+                    reader = SessionReader(f, True)
+                    reader.readXML()
+                    self.__readingSession = False
+                    f.close()
+                    res = True
+                else:
+                    E5MessageBox.critical(
+                        self,
+                        self.tr("Read session"),
+                        self.tr("<p>The session file <b>{0}</b> could not be"
+                                " read.</p>")
+                        .format(fn))
         
         # Write a crash session after a session was read.
         self.__writeCrashSession()
@@ -6605,9 +6627,10 @@
         """
         sessionFile, selectedFilter = E5FileDialog.getSaveFileNameAndFilter(
             self,
-            self.tr("Save session"),
+            self.tr("Save Session"),
             Utilities.getHomeDir(),
-            self.tr("eric Session Files (*.e5s)"),
+            self.tr("eric Session Files (*.esj);;"
+                    "eric XML Session Files (*.e5s)"),
             "")
         
         if not sessionFile:
@@ -6629,7 +6652,8 @@
             self,
             self.tr("Load session"),
             Utilities.getHomeDir(),
-            self.tr("eric Session Files (*.e5s)"))
+            self.tr("eric Session Files (*.esj);;"
+                    "eric XML Session Files (*.e5s)"))
         
         if not sessionFile:
             return
@@ -6640,14 +6664,15 @@
         """
         Private slot to delete the crash session file.
         """
-        fn = os.path.join(Utilities.getConfigDir(),
-                          "eric6_crash_session.e5s")
-        if os.path.exists(fn):
-            try:
-                os.remove(fn)
-            except OSError:
-                # ignore it silently
-                pass
+        for ext in (".esj", ".e5s"):
+            fn = os.path.join(Utilities.getConfigDir(),
+                              f"eric6_crash_session{ext}")
+            if os.path.exists(fn):
+                try:
+                    os.remove(fn)
+                except OSError:
+                    # ignore it silently
+                    pass
     
     def __writeCrashSession(self):
         """
@@ -6674,7 +6699,7 @@
             Preferences.getUI("OpenCrashSessionOnStartup")
         ):
             fn = os.path.join(Utilities.getConfigDir(),
-                              "eric6_crash_session.e5s")
+                              "eric6_crash_session.esj")
             if os.path.exists(fn):
                 yes = E5MessageBox.yesNo(
                     self,
--- a/eric6/WebBrowser/WebBrowserWindow.py	Mon Feb 01 10:06:11 2021 +0100
+++ b/eric6/WebBrowser/WebBrowserWindow.py	Mon Feb 01 13:25:37 2021 +0100
@@ -5019,7 +5019,8 @@
             None,
             self.tr("Export Keyboard Shortcuts"),
             "",
-            self.tr("Keyboard shortcut file (*.e4k)"),
+            self.tr("Keyboard Shortcuts File (*.ekj);;"
+                    "XML Keyboard Shortcuts File (*.e4k)"),
             "",
             E5FileDialog.Options(E5FileDialog.DontConfirmOverwrite))
         
@@ -5032,8 +5033,18 @@
             if ex:
                 fn += ex
         
-        from Preferences import Shortcuts
-        Shortcuts.exportShortcuts(fn, helpViewer=self)
+        if os.path.exists(fn):
+            ok = E5MessageBox.yesNo(
+                self,
+                self.tr("Export Keyboard Shortcuts"),
+                self.tr("""<p>The keyboard shortcuts file <b>{0}</b> exists"""
+                        """ already. Overwrite it?</p>""").format(fn))
+        else:
+            ok = True
+        
+        if ok:
+            from Preferences import Shortcuts
+            Shortcuts.exportShortcuts(fn, helpViewer=self)
 
     def __importShortcuts(self):
         """
@@ -5043,7 +5054,8 @@
             None,
             self.tr("Import Keyboard Shortcuts"),
             "",
-            self.tr("Keyboard shortcut file (*.e4k)"))
+            self.tr("Keyboard Shortcuts File (*.ekj);;"
+                    "XML Keyboard shortcut file (*.e4k)"))
         
         if fn:
             from Preferences import Shortcuts
--- a/others/default.e4k	Mon Feb 01 10:06:11 2021 +0100
+++ b/others/default.e4k	Mon Feb 01 13:25:37 2021 +0100
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE Shortcuts SYSTEM "Shortcuts-3.6.dtd">
-<!-- Eric6 keyboard shortcuts -->
-<!-- Saved: 2012-01-01, 15:38:59-->
+<!-- eric keyboard shortcuts -->
+<!-- Saved: 2021-01-28, 16:15:01-->
 <!-- Author: Detlev Offenbach <detlev@die-offenbachs.de> -->
 <Shortcuts version="3.6">
   <Shortcut category="Project">
@@ -50,6 +50,11 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Project">
+    <Name>project_search_project_file</Name>
+    <Accel>Ctrl+Alt+P</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Project">
     <Name>project_properties</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -60,12 +65,12 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Project">
-    <Name>project_filetype_associatios</Name>
+    <Name>project_filetype_associations</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Project">
-    <Name>project_lexer_associatios</Name>
+    <Name>project_lexer_associations</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
@@ -130,6 +135,11 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Project">
+    <Name>project_load_diagram</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Project">
     <Name>project_plugin_pkglist</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -145,7 +155,17 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Project">
-    <Name>packagers_cxfreeze</Name>
+    <Name>project_make_execute</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Project">
+    <Name>project_make_test</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Project">
+    <Name>project_check_pep8</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
@@ -160,7 +180,17 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Project">
-    <Name>project_check_pep8</Name>
+    <Name>project_show_radon_raw</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Project">
+    <Name>project_show_radon_mi</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Project">
+    <Name>project_show_radon_cc</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
@@ -170,7 +200,7 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Project">
-    <Name>project_check_indentations</Name>
+    <Name>project_check_vulture</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
@@ -180,6 +210,21 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
+    <Name>restart_eric</Name>
+    <Accel>Ctrl+Shift+Q</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>save_session_to_file</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>load_session_from_file</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
     <Name>new_window</Name>
     <Accel>Ctrl+Shift+N</Accel>
     <AltAccel></AltAccel>
@@ -195,93 +240,48 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>project_viewer</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="General">
     <Name>project_viewer_activate</Name>
     <Accel>Alt+Shift+P</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>multi_project_viewer</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="General">
     <Name>multi_project_viewer_activate</Name>
     <Accel>Alt+Shift+M</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>debug_viewer</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="General">
     <Name>debug_viewer_activate</Name>
     <Accel>Alt+Shift+D</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>interpreter_shell</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="General">
-    <Name>interprter_shell_activate</Name>
+    <Name>interpreter_shell_activate</Name>
     <Accel>Alt+Shift+S</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>terminal</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="General">
-    <Name>terminal_activate</Name>
-    <Accel>Alt+Shift+R</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="General">
-    <Name>file_browser</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="General">
     <Name>file_browser_activate</Name>
     <Accel>Alt+Shift+F</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>log_viewer</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="General">
     <Name>log_viewer_activate</Name>
     <Accel>Alt+Shift+G</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>task_viewer</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="General">
     <Name>task_viewer_activate</Name>
     <Accel>Alt+Shift+T</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>template_viewer</Name>
-    <Accel></Accel>
+    <Name>template_viewer_activate</Name>
+    <Accel>Alt+Shift+A</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>template_viewer_activate</Name>
-    <Accel>Alt+Shift+A</Accel>
+    <Name>vertical_toolbox</Name>
+    <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
@@ -300,12 +300,12 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>bottom_sidebar</Name>
+    <Name>right_sidebar</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>cooperation_viewer</Name>
+    <Name>bottom_sidebar</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
@@ -315,8 +315,8 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>symbols_viewer</Name>
-    <Accel></Accel>
+    <Name>irc_widget_activate</Name>
+    <Accel>Ctrl+Alt+Shift+I</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
@@ -325,13 +325,28 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>numbers_viewer</Name>
-    <Accel></Accel>
+    <Name>numbers_viewer_activate</Name>
+    <Accel>Alt+Shift+B</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>code_documentation_viewer_activate</Name>
+    <Accel>Ctrl+Alt+Shift+D</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>numbers_viewer_activate</Name>
-    <Accel>Alt+Shift+B</Accel>
+    <Name>pip_widget_activate</Name>
+    <Accel>Ctrl+Alt+Shift+P</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>conda_widget_activate</Name>
+    <Accel>Ctrl+Alt+Shift+C</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>micropython_widget_activate</Name>
+    <Accel>Ctrl+Alt+Shift+M</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
@@ -345,12 +360,22 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>qt4_documentation</Name>
+    <Name>qt5_documentation</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>pyqt4_documentation</Name>
+    <Name>qt6_documentation</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>pyqt5_documentation</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>pyqt6_documentation</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
@@ -360,17 +385,17 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>python2_documentation</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="General">
     <Name>eric_documentation</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
-    <Name>pyside_documentation</Name>
+    <Name>pyside2_documentation</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>pyside6_documentation</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
@@ -390,6 +415,16 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
+    <Name>show_error_log</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>show_install_info</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
     <Name>report_bug</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -465,6 +500,11 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
+    <Name>hex_editor</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
     <Name>web_browser</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -475,6 +515,11 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
+    <Name>snapshot</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
     <Name>preferences</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -525,6 +570,21 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
+    <Name>manage_ssl_certificates</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>manage_message_filters</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>clear_private_data</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
     <Name>viewmanager_activate</Name>
     <Accel>Alt+Shift+E</Accel>
     <AltAccel></AltAccel>
@@ -565,6 +625,16 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="General">
+    <Name>virtualenv_manager</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>virtualenv_configurator</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
     <Name>about_eric</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -574,12 +644,37 @@
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
+  <Shortcut category="General">
+    <Name>time_tracker_activate</Name>
+    <Accel>Alt+Shift+I</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="General">
+    <Name>translator_activate</Name>
+    <Accel>Alt+Shift+R</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Wizards">
+    <Name>wizards_datauriencoder</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Wizards">
+    <Name>wizards_dotdesktop</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
   <Shortcut category="Wizards">
     <Name>wizards_e5messagebox</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Wizards">
+    <Name>wizards_eric_plugin</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Wizards">
     <Name>wizards_python_re</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -595,6 +690,11 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Wizards">
+    <Name>wizards_e5filedialog</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Wizards">
     <Name>wizards_qfontdialog</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -614,6 +714,16 @@
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
+  <Shortcut category="Wizards">
+    <Name>wizards_qregularexpression</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Wizards">
+    <Name>wizards_setup_py</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
   <Shortcut category="Debug">
     <Name>dbg_run_script</Name>
     <Accel>F2</Accel>
@@ -675,6 +785,16 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Debug">
+    <Name>dbg_continue_until</Name>
+    <Accel>Ctrl+F6</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Debug">
+    <Name>dbg_jump_to_cursor</Name>
+    <Accel>F12</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Debug">
     <Name>dbg_single_step</Name>
     <Accel>F7</Accel>
     <AltAccel></AltAccel>
@@ -695,16 +815,6 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Debug">
-    <Name>dbg_evaluate</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Debug">
-    <Name>dbg_execute</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Debug">
     <Name>dbg_variables_filter</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -741,7 +851,7 @@
   </Shortcut>
   <Shortcut category="Debug">
     <Name>dbg_clear_breakpoint</Name>
-    <Accel>Ctrl+Shift+C</Accel>
+    <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Edit">
@@ -762,7 +872,7 @@
   <Shortcut category="Edit">
     <Name>vm_edit_cut</Name>
     <Accel>Ctrl+X</Accel>
-    <AltAccel>Shift+Del</AltAccel>
+    <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Edit">
     <Name>vm_edit_copy</Name>
@@ -796,7 +906,7 @@
   </Shortcut>
   <Shortcut category="Edit">
     <Name>vm_edit_smart_indent</Name>
-    <Accel>Ctrl+Alt+I</Accel>
+    <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Edit">
@@ -806,7 +916,7 @@
   </Shortcut>
   <Shortcut category="Edit">
     <Name>vm_edit_uncomment</Name>
-    <Accel>Ctrl+Alt+M</Accel>
+    <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Edit">
@@ -875,6 +985,21 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Edit">
+    <Name>vm_edit_codeinfo</Name>
+    <Accel>Ctrl+Alt+I</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Edit">
+    <Name>vm_edit_sort</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Edit">
+    <Name>vm_edit_generate_docstring</Name>
+    <Accel>Ctrl+Alt+D</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Edit">
     <Name>vm_edit_move_left_char</Name>
     <Accel>Left</Accel>
     <AltAccel></AltAccel>
@@ -1120,6 +1245,11 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Edit">
+    <Name>vm_edit_reverse selected_lines</Name>
+    <Accel>Meta+Alt+R</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Edit">
     <Name>vm_edit_cut_current_line</Name>
     <Accel>Alt+Shift+L</Accel>
     <AltAccel></AltAccel>
@@ -1135,16 +1265,6 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Edit">
-    <Name>vm_edit_convert_selection_lower</Name>
-    <Accel>Alt+Shift+U</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Edit">
-    <Name>vm_edit_convert_selection_upper</Name>
-    <Accel>Ctrl+Shift+U</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Edit">
     <Name>vm_edit_move_end_displayed_line</Name>
     <Accel>Alt+End</Accel>
     <AltAccel></AltAccel>
@@ -1329,6 +1449,16 @@
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
+  <Shortcut category="Edit">
+    <Name>vm_edit_convert_selection_lower</Name>
+    <Accel>Alt+Shift+U</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Edit">
+    <Name>vm_edit_convert_selection_upper</Name>
+    <Accel>Ctrl+Shift+U</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
   <Shortcut category="File">
     <Name>vm_file_new</Name>
     <Accel>Ctrl+N</Accel>
@@ -1360,6 +1490,11 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="File">
+    <Name>vm_file_save_copy</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="File">
     <Name>vm_file_save_all</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -1400,11 +1535,36 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Search">
+    <Name>vm_search_word_next</Name>
+    <Accel>Ctrl+.</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Search">
+    <Name>vm_search_word_previous</Name>
+    <Accel>Ctrl+,</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Search">
     <Name>vm_search_replace</Name>
     <Accel>Ctrl+R</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Search">
+    <Name>vm_replace_search</Name>
+    <Accel>Meta+R</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Search">
+    <Name>vm_replace_occurrence</Name>
+    <Accel>Meta+Ctrl+R</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Search">
+    <Name>vm_replace_all</Name>
+    <Accel>Meta+Shift+R</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Search">
     <Name>vm_quicksearch</Name>
     <Accel>Ctrl+Shift+K</Accel>
     <AltAccel></AltAccel>
@@ -1454,6 +1614,16 @@
     <Accel>Ctrl+Shift+R</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
+  <Shortcut category="Search">
+    <Name>vm_search_in_open_files</Name>
+    <Accel>Ctrl+Alt+Shift+F</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Search">
+    <Name>vm_replace_in_open_files</Name>
+    <Accel>Ctrl+Alt+Shift+R</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
   <Shortcut category="View">
     <Name>vm_view_zoom_in</Name>
     <Accel>Ctrl++</Accel>
@@ -1490,11 +1660,26 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="View">
+    <Name>vm_view_clear_all_folds</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="View">
     <Name>vm_view_unhighlight</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="View">
+    <Name>vm_view_new_document_view</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="View">
+    <Name>vm_view_new_document_split_view</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="View">
     <Name>vm_view_split_view</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -1516,7 +1701,7 @@
   </Shortcut>
   <Shortcut category="View">
     <Name>vm_previous_split</Name>
-    <Accel>Ctrl+Alt+P</Accel>
+    <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="View">
@@ -1524,6 +1709,16 @@
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
+  <Shortcut category="View">
+    <Name>vm_python_ast_viewer</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="View">
+    <Name>vm_python_dis_viewer</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
   <Shortcut category="Macro">
     <Name>vm_macro_start_recording</Name>
     <Accel></Accel>
@@ -1571,7 +1766,7 @@
   </Shortcut>
   <Shortcut category="Bookmarks">
     <Name>vm_bookmark_clear</Name>
-    <Accel>Ctrl+Alt+C</Accel>
+    <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Bookmarks">
@@ -1619,6 +1814,16 @@
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
+  <Shortcut category="Bookmarks">
+    <Name>vm_change_next</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Bookmarks">
+    <Name>vm_change_previous</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
   <Shortcut category="Spelling">
     <Name>vm_spelling_spellcheck</Name>
     <Accel>Shift+F7</Accel>
@@ -1629,151 +1834,6 @@
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_new</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_update</Name>
-    <Accel>Meta+Alt+U</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_commit</Name>
-    <Accel>Meta+Alt+O</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_add</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_remove</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_log</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_log_browser</Name>
-    <Accel>Meta+Alt+G</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_diff</Name>
-    <Accel>Meta+Alt+D</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_extendeddiff</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_urldiff</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_status</Name>
-    <Accel>Meta+Alt+S</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_tag</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_export</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_options</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_revert</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_merge</Name>
-    <Accel>Meta+Alt+M</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_switch</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_resolve</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_cleanup</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_command</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_list_tags</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_list_branches</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_contents</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_property_set</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_property_list</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_property_delete</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_relocate</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_repo_browser</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Subversion">
-    <Name>subversion_configure</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
   <Shortcut category="RefactoringRope">
     <Name>refactoring_rename</Name>
     <Accel></Accel>
@@ -1895,32 +1955,12 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="RefactoringRope">
-    <Name>refactoring_undo</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="RefactoringRope">
-    <Name>refactoring_redo</Name>
+    <Name>refactoring_show_project_history</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="RefactoringRope">
-    <Name>refactoring_show_project_undo_history</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="RefactoringRope">
-    <Name>refactoring_show_project_redo_history</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="RefactoringRope">
-    <Name>refactoring_show_file_undo_history</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="RefactoringRope">
-    <Name>refactoring_show_file_redo_history</Name>
+    <Name>refactoring_show_file_history</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
@@ -1964,153 +2004,433 @@
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_new</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_update</Name>
-    <Accel>Meta+Alt+U</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_commit</Name>
-    <Accel>Meta+Alt+O</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_add</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_remove</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_log</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_log_browser</Name>
-    <Accel>Meta+Alt+G</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_diff</Name>
-    <Accel>Meta+Alt+D</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_extendeddiff</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_urldiff</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_status</Name>
-    <Accel>Meta+Alt+S</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_repoinfo</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_tag</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_export</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_options</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_revert</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_merge</Name>
-    <Accel>Meta+Alt+M</Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_switch</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_resolve</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_cleanup</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_command</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_list_tags</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_list_branches</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_contents</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_property_set</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_property_list</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_property_delete</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_relocate</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_repo_browser</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="PySvn">
-    <Name>subversion_configure</Name>
+  <Shortcut category="Git">
+    <Name>git_new</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_fetch</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_pull</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_commit</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_push</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_export_repo</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_log_browser</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_reflog_browser</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_diff</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_extendeddiff</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_status</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_switch</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_tag</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_list_tags</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_describe_tag</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_list_branches</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_list_merged_branches</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_list_non_merged_branches</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_branch</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_delete_remote_branch</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_show_branch</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_revert</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_revert</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_merge</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_cancel_merge</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_commit_merge</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_cleanup</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_command</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_configure</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_show_remotes</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_show_remote_info</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_add_remote</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_remove_remote</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_prune_remote</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_rename_remote</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_change_remote_url</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_remote_credentials</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_cherrypick</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_cherrypick_continue</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_cherrypick_quit</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_cherrypick_abort</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_stash</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_stash_browser</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_stash_show</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_stash_apply</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_stash_pop</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_stash_branch</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_stash_delete</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_stash_delete_all</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_user_configure</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_repo_configure</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_create_ignore</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_show_config</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_verify</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_housekeeping</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_statistics</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_create_archive</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>mercurial_bundle_create</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>mercurial_bundle_verify</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>mercurial_bundle_list_heads</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>mercurial_bundle_apply_fetch</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>mercurial_bundle_apply_pull</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_bisect_start</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_bisect_start_extended</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_bisect_good</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_bisect_bad</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_bisect_skip</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_bisect_reset</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_bisect_log_browser</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_bisect_create_replay</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_bisect_edit_replay</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_bisect_replay</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_check_patches</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_apply_patches</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_show_patches_statistics</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_submodule_add</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_submodules_list</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_submodules_init</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_submodules_deinit</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_submodules_update</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_submodules_update_init</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_submodules_update_remote</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_submodules_update_options</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_submodules_sync</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_submodules_status</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Git">
+    <Name>git_submodules_summary</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
@@ -2136,12 +2456,12 @@
   </Shortcut>
   <Shortcut category="Mercurial">
     <Name>mercurial_commit</Name>
-    <Accel>Meta+Alt+O</Accel>
+    <Accel>Meta+Alt+C</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
     <Name>mercurial_outgoing</Name>
-    <Accel></Accel>
+    <Accel>Meta+Alt+O</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
@@ -2155,28 +2475,13 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>subversion_export</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Mercurial">
-    <Name>mercurial_add</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Mercurial">
-    <Name>mercurial_remove</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Mercurial">
-    <Name>mercurial_log</Name>
+    <Name>mercurial_export_repo</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
     <Name>mercurial_log_browser</Name>
-    <Accel>Meta+Alt+G</Accel>
+    <Accel>Meta+Alt+L</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
@@ -2195,6 +2500,11 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
+    <Name>mercurial_summary</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
     <Name>mercurial_heads</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -2220,13 +2530,38 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
+    <Name>mercurial_commit_merge</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_cancel_merge</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_remerge</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_show_conflicts</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
     <Name>mercurial_resolve</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
+    <Name>mercurial_unresolve</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
     <Name>mercurial_tag</Name>
-    <Accel></Accel>
+    <Accel>Meta+Alt+T</Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
@@ -2275,11 +2610,6 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_options</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Mercurial">
     <Name>mercurial_configure</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -2335,11 +2665,6 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_identify_bundle</Name>
-    <Accel></Accel>
-    <AltAccel></AltAccel>
-  </Shortcut>
-  <Shortcut category="Mercurial">
     <Name>mercurial_unbundle</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -2385,57 +2710,112 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_import</Name>
+    <Name>mercurial_export</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_rebase</Name>
+    <Name>mercurial_change_phase</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_graft</Name>
+    <Accel>Meta+Alt+G</Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_graft_continue</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_rebase_continue</Name>
+    <Name>mercurial_graft_stop</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_graft_abort</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_rebase_abort</Name>
+    <Name>mercurial_add_subrepo</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_gpg_list</Name>
+    <Name>mercurial_remove_subrepos</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_archive</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_list_bookmarks</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_gpg_verify</Name>
+    <Name>mercurial_define_bookmark</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_delete_bookmark</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_gpg_sign</Name>
+    <Name>mercurial_rename_bookmark</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_move_bookmark</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_incoming_bookmarks</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_purge</Name>
+    <Name>mercurial_pull_bookmark</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_outgoing_bookmarks</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_push_bookmark</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_purge_all</Name>
+    <Name>mercurial_push_current_bookmark</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_purge_list</Name>
+    <Name>mercurial_delete_all_backups</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_purge_all_list</Name>
+    <Name>mercurial_queues_init</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_queues_commit</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
@@ -2490,6 +2870,16 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
+    <Name>mercurial_queues_status</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_queues_summary</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
     <Name>mercurial_queues_push_next</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
@@ -2625,363 +3015,438 @@
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_list_bookmarks</Name>
+    <Name>mercurial_purge</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_purge_all</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_purge_list</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_purge_all_list</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_gpg_list</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_gpg_verify</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_define_bookmark</Name>
+    <Name>mercurial_gpg_sign</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_rebase</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_rebase_continue</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_delete_bookmark</Name>
+    <Name>mercurial_rebase_abort</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_shelve</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_rename_bookmark</Name>
+    <Name>mercurial_shelve_browser</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_unshelve</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_unshelve_abort</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_move_bookmark</Name>
+    <Name>mercurial_unshelve_continue</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_shelve_delete</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_shelve_cleanup</Name>
     <Accel></Accel>
     <AltAccel></AltAccel>
   </Shortcut>
   <Shortcut category="Mercurial">
-    <Name>mercurial_incoming_bookmarks</Name>
+    <Name>mercurial_convert_to_largefiles</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>
+  <Shortcut category="Mercurial">
+    <Name>mercurial_convert_to_normal</Name>
+    <Accel></Accel>
+    <AltAccel></AltAccel>
+  </Shortcut>