From 6ade97b1cda52a127e2e1f0cacb6a9ce295f955f Mon Sep 17 00:00:00 2001 From: "Mr. eXoDia" Date: Fri, 10 Apr 2015 01:51:35 +0200 Subject: [PATCH] "x64_dbg"->"x64dbg" + added Nukem --- Doxyfile | 4 ++-- LICENSE | 4 ++-- README.md | 17 ++++++++-------- help/LibrarianSetBreakPoint_bpdll.htm | 2 +- help/Plugins.htm | 2 +- help/Scripting.htm | 2 +- help/Special_Thanks.htm | 5 ++++- help/The_basics.htm | 2 +- help/plugin_debugpause.htm | 2 +- help/template/fixedtop.htm | 2 +- x64_dbg_dbg/_global.cpp | 8 ++++---- x64_dbg_dbg/debugger.cpp | 4 ++-- x64_dbg_dbg/debugger_commands.cpp | 8 ++++---- x64_dbg_dbg/x64_dbg.cpp | 2 +- x64_dbg_exe/resource.rc | 4 ++-- .../Project/Src/Gui/CommandHelpView.cpp | 6 +++--- x64_dbg_gui/Project/Src/Gui/MainWindow.cpp | 10 +++++----- x64_dbg_gui/Project/Src/Gui/MainWindow.ui | 2 +- x64_dbg_gui/Project/Src/Gui/SettingsDialog.ui | 2 +- .../Project/Src/Utils/UpdateChecker.cpp | 4 ++-- x64_dbg_launcher/x64_dbg_launcher.cpp | 20 +++++++++---------- 21 files changed, 58 insertions(+), 54 deletions(-) diff --git a/Doxyfile b/Doxyfile index 7e63768d..e3ebd68f 100644 --- a/Doxyfile +++ b/Doxyfile @@ -32,7 +32,7 @@ DOXYFILE_ENCODING = UTF-8 # title of most generated pages and in a few other places. # The default value is: My Project. -PROJECT_NAME = x64_dbg +PROJECT_NAME = x64dbg # The PROJECT_NUMBER tag can be used to enter a project or revision number. This # could be handy for archiving the generated documentation or if some version @@ -1253,7 +1253,7 @@ GENERATE_HTMLHELP = NO # written to the html output directory. # This tag requires that the tag GENERATE_HTMLHELP is set to YES. -CHM_FILE = x64_dbg_src.chm +CHM_FILE = x64dbg_src.chm # The HHC_LOCATION tag can be used to specify the location (absolute path # including file name) of the HTML help compiler ( hhc.exe). If non-empty diff --git a/LICENSE b/LICENSE index bb49e61c..df0d2a54 100644 --- a/LICENSE +++ b/LICENSE @@ -156,8 +156,8 @@ same work. 2. Treatment of plugins This license does not affect plugins, i.e., dynamically linked -libraries, that use the provided plugin interface mechanism of x64_dbg -for contibuting additional features to the x64_dbg project and can only +libraries, that use the provided plugin interface mechanism of x64dbg +for contibuting additional features to the x64dbg project and can only be run from x64dbg. In fact you are allowed to create and share (non-)commercial, non-standalone closed-source plugins for x64dbg under your own license. diff --git a/README.md b/README.md index 5f70bce7..38b06556 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,18 @@ -# x64_dbg +# x64dbg ## Note -Please run `install.bat` before you start committing code, this ensures your code is auto-formatted to the *x64_dbg* [standards](https://bitbucket.org/mrexodia/x64_dbg/wiki/x64_dbg_coding_guidelines). +Please run `install.bat` before you start committing code, this ensures your code is auto-formatted to the *x64dbg* [standards](https://bitbucket.org/mrexodia/x64dbg/wiki/x64dbg_coding_guidelines). ## Compiling -For a complete guide on compiling *x64_dbg* read [this](https://bitbucket.org/mrexodia/x64_dbg/wiki/Compiling%20the%20whole%20project). +For a complete guide on compiling *x64dbg* read [this](https://bitbucket.org/mrexodia/x64dbg/wiki/Compiling%20the%20whole%20project). ## Downloads -Releases of *x64_dbg* can be found [here](http://download.x64dbg.com). -Snapshots of *x64_dbg* can be found [here](http://snapshots.x64dbg.com). +Releases of *x64dbg* can be found [here](http://download.x64dbg.com). +Snapshots of *x64dbg* can be found [here](http://snapshots.x64dbg.com). Jenkins build server can be found [here](http://jenkins.x64dbg.com). ## Overview -*x64_dbg* is an open-source x32/x64 debugger for Windows. +*x64dbg* is an open-source x32/x64 debugger for Windows. ## Features - Open-source @@ -41,7 +41,7 @@ Jenkins build server can be found [here](http://jenkins.x64dbg.com). - Memory breakpoints sometimes fail (TitanEngine bug) ## License -*x64_dbg* is licensed under GLPv3, which means you can freely distribute and/or modify the source of *x64_dbg*, as long as you share your changes with us. The only exception is that plugins you write do not have to comply with the GLPv3 license. They do not have to be open-source and they can be commercial and/or private. The only exception to this is when your plugin uses code copied from *x64_dbg*. In that case you would still have to share the changes to *x64_dbg* with us. +*x64dbg* is licensed under GLPv3, which means you can freely distribute and/or modify the source of *x64dbg*, as long as you share your changes with us. The only exception is that plugins you write do not have to comply with the GLPv3 license. They do not have to be open-source and they can be commercial and/or private. The only exception to this is when your plugin uses code copied from *x64dbg*. In that case you would still have to share the changes to *x64dbg* with us. ## Credits - Debugger core by [TitanEngine Community Edition](https://bitbucket.org/mrexodia/titanengine-update) @@ -70,4 +70,5 @@ Jenkins build server can be found [here](http://jenkins.x64dbg.com). - [Mr. eXoDia](http://mrexodia.cf) - Sigma - [tr4ceflow](http://blog.tr4ceflow.com) -- [Dreg](http://www.fr33project.org) \ No newline at end of file +- [Dreg](http://www.fr33project.org) +- Nukem \ No newline at end of file diff --git a/help/LibrarianSetBreakPoint_bpdll.htm b/help/LibrarianSetBreakPoint_bpdll.htm index f85d4f47..e2c4ef2c 100644 --- a/help/LibrarianSetBreakPoint_bpdll.htm +++ b/help/LibrarianSetBreakPoint_bpdll.htm @@ -20,7 +20,7 @@ breakpoint on DLL load/unload.

arguments
  arg1: DLL Name to break on.

[arg2]: 'l' means on load, 'u' means on unload. When not -specified, x64_dbg will break on both load and unload.

+specified, x64dbg will break on both load and unload.

[arg3]: When specified, the breakpoint will not be singleshoot. When not specified the breakpoint will be removed after it has been hit.

result
This command does not set any result diff --git a/help/Plugins.htm b/help/Plugins.htm index 0f15062b..4ec63599 100644 --- a/help/Plugins.htm +++ b/help/Plugins.htm @@ -16,7 +16,7 @@ html,body {

Plugins
This section describes -various plugin functions for x64_dbg.

+various plugin functions for x64dbg.

You can install plugins by copying the *.dp32 (x32 plugins) or *.dp64 (x64 plugins) to the 'plugins' directory.

diff --git a/help/Scripting.htm b/help/Scripting.htm index 66e42dc5..665f71ec 100644 --- a/help/Scripting.htm +++ b/help/Scripting.htm @@ -16,6 +16,6 @@ html,body {

Scripting
This sections provides an overview of automating tasks with -x64_dbg using scripts. See Commands for a description of all possible script commands. See Introduction for an introduction to +x64dbg using scripts. See Commands for a description of all possible script commands. See Introduction for an introduction to expressions.

\ No newline at end of file diff --git a/help/Special_Thanks.htm b/help/Special_Thanks.htm index c3cdbfc5..7c5707f0 100644 --- a/help/Special_Thanks.htm +++ b/help/Special_Thanks.htm @@ -16,7 +16,7 @@ html,body {

Credits
- This page is reserved for people/organisations that contributed to x64_dbg.

+ This page is reserved for people/organisations that contributed to x64dbg.

diff --git a/help/The_basics.htm b/help/The_basics.htm index 026cb673..9ddbde5d 100644 --- a/help/The_basics.htm +++ b/help/The_basics.htm @@ -17,7 +17,7 @@ html,body {

The basics
This page covers the -basic principles of plugin development for x64_dbg.

+basic principles of plugin development for x64dbg.

Exports
A plugin has at least one export. This export must be called pluginit. See the PLUG_INITSTRUCT and the plugin headers for diff --git a/help/plugin_debugpause.htm b/help/plugin_debugpause.htm index 59623e5b..5195b5b1 100644 --- a/help/plugin_debugpause.htm +++ b/help/plugin_debugpause.htm @@ -17,7 +17,7 @@ html,body {

_plugin_debugpause
This function returns debugger control to the user. You would use this function when you write an unpacker that needs support -from x64_dbg (for example in development). Calling this function will set the +from x64dbg (for example in development). Calling this function will set the debug state to 'paused' and it will not return until the user runs the debuggee using the 'run' command diff --git a/help/template/fixedtop.htm b/help/template/fixedtop.htm index 27ba79a8..e5132c54 100644 --- a/help/template/fixedtop.htm +++ b/help/template/fixedtop.htm @@ -52,7 +52,7 @@ window.onafterprint = d_onafterprint;

($content$)


x64_dbg, GPLv3  +href="http://x64dbg.com" target=_blank>x64dbg, GPLv3  diff --git a/x64_dbg_dbg/_global.cpp b/x64_dbg_dbg/_global.cpp index 9f4ce22d..4629b609 100644 --- a/x64_dbg_dbg/_global.cpp +++ b/x64_dbg_dbg/_global.cpp @@ -9,7 +9,7 @@ #include /** -\brief x64_dbg library instance. +\brief x64dbg library instance. */ HINSTANCE hInst; @@ -24,7 +24,7 @@ char dbbasepath[deflen] = ""; char dbpath[3 * deflen] = ""; /** -\brief Number of allocated buffers by emalloc(). This should be 0 when x64_dbg ends. +\brief Number of allocated buffers by emalloc(). This should be 0 when x64dbg ends. */ static int emalloc_count = 0; @@ -287,13 +287,13 @@ arch GetFileArchitecture(const char* szFileName) } /** -\brief Query if x64_dbg is running in Wow64 mode. +\brief Query if x64dbg is running in Wow64 mode. \return true if running in Wow64, false otherwise. */ bool IsWow64() { BOOL bIsWow64Process = FALSE; - //x64_dbg supports WinXP SP3 and later only, so ignore the GetProcAddress crap :D + //x64dbg supports WinXP SP3 and later only, so ignore the GetProcAddress crap :D IsWow64Process(GetCurrentProcess(), &bIsWow64Process); return !!bIsWow64Process; } diff --git a/x64_dbg_dbg/debugger.cpp b/x64_dbg_dbg/debugger.cpp index bc6b8a0e..ecc640ed 100644 --- a/x64_dbg_dbg/debugger.cpp +++ b/x64_dbg_dbg/debugger.cpp @@ -1116,9 +1116,9 @@ DWORD WINAPI threadDebugLoop(void* lpParameter) if((mewow64 and !wow64) or (!mewow64 and wow64)) { #ifdef _WIN64 - dputs("Use x32_dbg to debug this process!"); + dputs("Use x32dbg to debug this process!"); #else - dputs("Use x64_dbg to debug this process!"); + dputs("Use x64dbg to debug this process!"); #endif // _WIN64 unlock(WAITID_STOP); return 0; diff --git a/x64_dbg_dbg/debugger_commands.cpp b/x64_dbg_dbg/debugger_commands.cpp index fe889a88..179a6772 100644 --- a/x64_dbg_dbg/debugger_commands.cpp +++ b/x64_dbg_dbg/debugger_commands.cpp @@ -68,10 +68,10 @@ CMDRESULT cbDebugInit(int argc, char* argv[]) return STATUS_ERROR; #ifdef _WIN64 case x32: - dputs("Use x32_dbg to debug this file!"); + dputs("Use x32dbg to debug this file!"); #else //x86 case x64: - dputs("Use x64_dbg to debug this file!"); + dputs("Use x64dbg to debug this file!"); #endif //_WIN64 return STATUS_ERROR; default: @@ -924,9 +924,9 @@ CMDRESULT cbDebugAttach(int argc, char* argv[]) if((mewow64 and !wow64) or (!mewow64 and wow64)) { #ifdef _WIN64 - dputs("Use x32_dbg to debug this process!"); + dputs("Use x32dbg to debug this process!"); #else - dputs("Use x64_dbg to debug this process!"); + dputs("Use x64dbg to debug this process!"); #endif // _WIN64 return STATUS_ERROR; } diff --git a/x64_dbg_dbg/x64_dbg.cpp b/x64_dbg_dbg/x64_dbg.cpp index 06c094dc..85a92196 100644 --- a/x64_dbg_dbg/x64_dbg.cpp +++ b/x64_dbg_dbg/x64_dbg.cpp @@ -324,7 +324,7 @@ extern "C" DLL_EXPORT void _dbg_dbgexitsignal() if(memleaks()) { char msg[256] = ""; - sprintf(msg, "%d memory leak(s) found!\n\nPlease send contact the authors of x64_dbg.", memleaks()); + sprintf(msg, "%d memory leak(s) found!\n\nPlease send contact the authors of x64dbg.", memleaks()); MessageBoxA(0, msg, "error", MB_ICONERROR | MB_SYSTEMMODAL); } else diff --git a/x64_dbg_exe/resource.rc b/x64_dbg_exe/resource.rc index 5773be70..6354d6a1 100644 --- a/x64_dbg_exe/resource.rc +++ b/x64_dbg_exe/resource.rc @@ -83,10 +83,10 @@ BEGIN BEGIN BLOCK "040904b0" BEGIN - VALUE "FileDescription", "x64_dbg" + VALUE "FileDescription", "x64dbg" VALUE "FileVersion", "0.0.2.5" VALUE "LegalCopyright", "x64dbg.com" - VALUE "ProductName", "x64_dbg" + VALUE "ProductName", "x64dbg" VALUE "ProductVersion", "0.0.2.5" END END diff --git a/x64_dbg_gui/Project/Src/Gui/CommandHelpView.cpp b/x64_dbg_gui/Project/Src/Gui/CommandHelpView.cpp index 7761035d..7da508e3 100644 --- a/x64_dbg_gui/Project/Src/Gui/CommandHelpView.cpp +++ b/x64_dbg_gui/Project/Src/Gui/CommandHelpView.cpp @@ -60,7 +60,7 @@ CommandHelpView::CommandHelpView(QWidget* parent) : QWidget(parent), ui(new Ui:: //fill with example data mModuleList->setRowCount(2); - mModuleList->setCellContent(0, 0, "x64_dbg"); + mModuleList->setCellContent(0, 0, "x64dbg"); mModuleList->setCellContent(1, 0, "testplugin"); mModuleList->setSingleSelection(0); @@ -75,7 +75,7 @@ void CommandHelpView::moduleSelectionChanged(int index) { mSearchListView->mList->setRowCount(0); - if(index == 0) //x64_dbg + if(index == 0) //x64dbg { mCurrentMode = 0; mSearchListView->mList->setRowCount(3); @@ -101,7 +101,7 @@ void CommandHelpView::moduleSelectionChanged(int index) void CommandHelpView::symbolSelectionChanged(int index) { QString info = ""; - if(mCurrentMode == 0) //x64_dbg + if(mCurrentMode == 0) //x64dbg { switch(index) { diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp index 11f0e8ac..4f7ed4e7 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.cpp @@ -36,9 +36,9 @@ MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), ui(new Ui::MainWi this->showMaximized(); #ifdef _WIN64 - mWindowMainTitle = "x64_dbg"; + mWindowMainTitle = "x64dbg"; #else - mWindowMainTitle = "x32_dbg"; + mWindowMainTitle = "x32dbg"; #endif //Set window title @@ -498,9 +498,9 @@ void MainWindow::displayScriptWidget() void MainWindow::displayAboutWidget() { #ifdef _WIN64 - QString title = "About x64_dbg"; + QString title = "About x64dbg"; #else - QString title = "About x32_dbg"; + QString title = "About x32dbg"; #endif title += QString().sprintf(" v%d", BridgeGetDbgVersion()); QMessageBox msg(QMessageBox::Information, title, "Website:\nhttp://x64dbg.com\n\nAttribution:\nIcons8 (http://icons8.com)\nYusuke Kamiyamane (http://p.yusukekamiyamane.com)\n\nCompiled on:\n"__DATE__", "__TIME__); @@ -985,7 +985,7 @@ void MainWindow::displayCallstack() void MainWindow::donate() { - QMessageBox msg(QMessageBox::Information, "Donate", "All the money will go to x64_dbg development."); + QMessageBox msg(QMessageBox::Information, "Donate", "All the money will go to x64dbg development."); msg.setWindowIcon(QIcon(":/icons/images/donate.png")); msg.setParent(this, Qt::Dialog); msg.setWindowFlags(msg.windowFlags() & (~Qt::WindowContextHelpButtonHint)); diff --git a/x64_dbg_gui/Project/Src/Gui/MainWindow.ui b/x64_dbg_gui/Project/Src/Gui/MainWindow.ui index 6e3b2faf..cd5a58da 100644 --- a/x64_dbg_gui/Project/Src/Gui/MainWindow.ui +++ b/x64_dbg_gui/Project/Src/Gui/MainWindow.ui @@ -14,7 +14,7 @@ Qt::NoContextMenu - x64_dbg + x64dbg diff --git a/x64_dbg_gui/Project/Src/Gui/SettingsDialog.ui b/x64_dbg_gui/Project/Src/Gui/SettingsDialog.ui index 7f7c4b4c..3990b72a 100644 --- a/x64_dbg_gui/Project/Src/Gui/SettingsDialog.ui +++ b/x64_dbg_gui/Project/Src/Gui/SettingsDialog.ui @@ -409,7 +409,7 @@ - Set x64_dbg as Just In Time Debugger + Set x64dbg as Just In Time Debugger diff --git a/x64_dbg_gui/Project/Src/Utils/UpdateChecker.cpp b/x64_dbg_gui/Project/Src/Utils/UpdateChecker.cpp index c9cd865a..f1c00595 100644 --- a/x64_dbg_gui/Project/Src/Utils/UpdateChecker.cpp +++ b/x64_dbg_gui/Project/Src/Utils/UpdateChecker.cpp @@ -45,9 +45,9 @@ void UpdateChecker::finishedSlot(QNetworkReply* reply) if(version > dbgVersion) info = QString().sprintf("New version v%d available!\nDownload at http://x64dbg.com\n\nYou are now on version v%d", version, dbgVersion); else if(version < dbgVersion) - info = QString().sprintf("You have a development version (v%d) of x64_dbg!", dbgVersion); + info = QString().sprintf("You have a development version (v%d) of x64dbg!", dbgVersion); else - info = QString().sprintf("You have the latest version (%d) of x64_dbg!", version); + info = QString().sprintf("You have the latest version (%d) of x64dbg!", version); QMessageBox msg(QMessageBox::Information, "Information", info); msg.setWindowIcon(QIcon(":/icons/images/information.png")); msg.setParent(mParent, Qt::Dialog); diff --git a/x64_dbg_launcher/x64_dbg_launcher.cpp b/x64_dbg_launcher/x64_dbg_launcher.cpp index bbac4070..7618bef2 100644 --- a/x64_dbg_launcher/x64_dbg_launcher.cpp +++ b/x64_dbg_launcher/x64_dbg_launcher.cpp @@ -152,7 +152,7 @@ static bool BrowseFileOpen(HWND owner, const wchar_t* filter, const wchar_t* def @brief A macro that defines shellext executable key. */ -#define SHELLEXT_EXE_KEY L"exefile\\shell\\Debug with x64_dbg\\Command" +#define SHELLEXT_EXE_KEY L"exefile\\shell\\Debug with x64dbg\\Command" /** @def SHELLEXT_DLL_KEY @@ -160,7 +160,7 @@ static bool BrowseFileOpen(HWND owner, const wchar_t* filter, const wchar_t* def @brief A macro that defines shellext DLL key. */ -#define SHELLEXT_DLL_KEY L"dllfile\\shell\\Debug with x64_dbg\\Command" +#define SHELLEXT_DLL_KEY L"dllfile\\shell\\Debug with x64dbg\\Command" /** @fn static void RegisterShellExtension(const wchar_t* key, const wchar_t* command) @@ -297,13 +297,13 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi //Load settings bool bDoneSomething = false; wchar_t sz32Path[MAX_PATH] = L""; - if(!GetPrivateProfileStringW(L"Launcher", L"x32_dbg", L"", sz32Path, MAX_PATH, szIniPath)) + if(!GetPrivateProfileStringW(L"Launcher", L"x32dbg", L"", sz32Path, MAX_PATH, szIniPath)) { wcscpy_s(sz32Path, szCurrentDir); PathAppendW(sz32Path, L"x32\\x32_dbg.exe"); if(FileExists(sz32Path)) { - WritePrivateProfileStringW(L"Launcher", L"x32_dbg", sz32Path, szIniPath); + WritePrivateProfileStringW(L"Launcher", L"x32dbg", sz32Path, szIniPath); bDoneSomething = true; } } @@ -315,13 +315,13 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi if(len) sz32Dir[len] = L'\0'; wchar_t sz64Path[MAX_PATH] = L""; - if(!GetPrivateProfileStringW(L"Launcher", L"x64_dbg", L"", sz64Path, MAX_PATH, szIniPath)) + if(!GetPrivateProfileStringW(L"Launcher", L"x64dbg", L"", sz64Path, MAX_PATH, szIniPath)) { wcscpy_s(sz64Path, szCurrentDir); PathAppendW(sz64Path, L"x64\\x64_dbg.exe"); if(FileExists(sz64Path)) { - WritePrivateProfileStringW(L"Launcher", L"x64_dbg", sz64Path, szIniPath); + WritePrivateProfileStringW(L"Launcher", L"x64dbg", sz64Path, szIniPath); bDoneSomething = true; } } @@ -340,12 +340,12 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi { if(!FileExists(sz32Path) && BrowseFileOpen(0, L"x32_dbg.exe\0x32_dbg.exe\0\0", 0, sz32Path, MAX_PATH, szCurrentDir)) { - WritePrivateProfileStringW(L"Launcher", L"x32_dbg", sz32Path, szIniPath); + WritePrivateProfileStringW(L"Launcher", L"x32dbg", sz32Path, szIniPath); bDoneSomething = true; } if(!FileExists(sz64Path) && BrowseFileOpen(0, L"x64_dbg.exe\0x64_dbg.exe\0\0", 0, sz64Path, MAX_PATH, szCurrentDir)) { - WritePrivateProfileStringW(L"Launcher", L"x64_dbg", sz64Path, szIniPath); + WritePrivateProfileStringW(L"Launcher", L"x64dbg", sz64Path, szIniPath); bDoneSomething = true; } if(MessageBoxW(0, L"Do you want to register a shell extension?", L"Question", MB_YESNO | MB_ICONQUESTION) == IDYES) @@ -374,14 +374,14 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLi if(sz32Path[0]) ShellExecuteW(0, L"open", sz32Path, cmdLine.c_str(), sz32Dir, SW_SHOWNORMAL); else - MessageBoxW(0, L"Path to x32_dbg not specified in launcher configuration...", L"Error!", MB_ICONERROR); + MessageBoxW(0, L"Path to x32dbg not specified in launcher configuration...", L"Error!", MB_ICONERROR); break; case x64: if(sz64Path[0]) ShellExecuteW(0, L"open", sz64Path, cmdLine.c_str(), sz64Dir, SW_SHOWNORMAL); else - MessageBoxW(0, L"Path to x64_dbg not specified in launcher configuration...", L"Error!", MB_ICONERROR); + MessageBoxW(0, L"Path to x64dbg not specified in launcher configuration...", L"Error!", MB_ICONERROR); break; case invalid: