diff --git a/mingw-w64-headers/Makefile.am b/mingw-w64-headers/Makefile.am
index e2837b0..ed4ba5e 100644
--- a/mingw-w64-headers/Makefile.am
+++ b/mingw-w64-headers/Makefile.am
@@ -60,6 +60,8 @@
 IDL_SRCS = \
   include/activation.idl \
   include/activaut.idl \
+  include/activdbg.idl \
+  include/activdbg100.idl \
   include/activprof.idl \
   include/activscp.idl \
   include/audioclient.idl \
diff --git a/mingw-w64-headers/Makefile.in b/mingw-w64-headers/Makefile.in
index a736db6..00caf8d 100644
--- a/mingw-w64-headers/Makefile.in
+++ b/mingw-w64-headers/Makefile.in
@@ -284,6 +284,8 @@
 @HAVE_WIDL_TRUE@IDL_SRCS = \
 @HAVE_WIDL_TRUE@  include/activation.idl \
 @HAVE_WIDL_TRUE@  include/activaut.idl \
+@HAVE_WIDL_TRUE@  include/activdbg.idl \
+@HAVE_WIDL_TRUE@  include/activdbg100.idl \
 @HAVE_WIDL_TRUE@  include/activprof.idl \
 @HAVE_WIDL_TRUE@  include/activscp.idl \
 @HAVE_WIDL_TRUE@  include/audioclient.idl \
diff --git a/mingw-w64-headers/include/activdbg.h b/mingw-w64-headers/include/activdbg.h
new file mode 100644
index 0000000..f4b3161
--- /dev/null
+++ b/mingw-w64-headers/include/activdbg.h
@@ -0,0 +1,11475 @@
+/*** Autogenerated by WIDL 1.6 from activdbg.idl - Do not edit ***/
+
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+
+#include <rpc.h>
+#include <rpcndr.h>
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __activdbg_h__
+#define __activdbg_h__
+
+/* Forward declarations */
+
+#ifndef __IActiveScriptDebug32_FWD_DEFINED__
+#define __IActiveScriptDebug32_FWD_DEFINED__
+typedef interface IActiveScriptDebug32 IActiveScriptDebug32;
+#endif
+
+#ifndef __IActiveScriptDebug64_FWD_DEFINED__
+#define __IActiveScriptDebug64_FWD_DEFINED__
+typedef interface IActiveScriptDebug64 IActiveScriptDebug64;
+#endif
+
+#ifndef __IActiveScriptSiteDebug32_FWD_DEFINED__
+#define __IActiveScriptSiteDebug32_FWD_DEFINED__
+typedef interface IActiveScriptSiteDebug32 IActiveScriptSiteDebug32;
+#endif
+
+#ifndef __IActiveScriptSiteDebug64_FWD_DEFINED__
+#define __IActiveScriptSiteDebug64_FWD_DEFINED__
+typedef interface IActiveScriptSiteDebug64 IActiveScriptSiteDebug64;
+#endif
+
+#ifndef __IActiveScriptSiteDebugEx_FWD_DEFINED__
+#define __IActiveScriptSiteDebugEx_FWD_DEFINED__
+typedef interface IActiveScriptSiteDebugEx IActiveScriptSiteDebugEx;
+#endif
+
+#ifndef __IActiveScriptErrorDebug_FWD_DEFINED__
+#define __IActiveScriptErrorDebug_FWD_DEFINED__
+typedef interface IActiveScriptErrorDebug IActiveScriptErrorDebug;
+#endif
+
+#ifndef __IDebugCodeContext_FWD_DEFINED__
+#define __IDebugCodeContext_FWD_DEFINED__
+typedef interface IDebugCodeContext IDebugCodeContext;
+#endif
+
+#ifndef __IDebugExpression_FWD_DEFINED__
+#define __IDebugExpression_FWD_DEFINED__
+typedef interface IDebugExpression IDebugExpression;
+#endif
+
+#ifndef __IDebugExpressionContext_FWD_DEFINED__
+#define __IDebugExpressionContext_FWD_DEFINED__
+typedef interface IDebugExpressionContext IDebugExpressionContext;
+#endif
+
+#ifndef __IDebugExpressionCallBack_FWD_DEFINED__
+#define __IDebugExpressionCallBack_FWD_DEFINED__
+typedef interface IDebugExpressionCallBack IDebugExpressionCallBack;
+#endif
+
+#ifndef __IDebugStackFrame_FWD_DEFINED__
+#define __IDebugStackFrame_FWD_DEFINED__
+typedef interface IDebugStackFrame IDebugStackFrame;
+#endif
+
+#ifndef __IDebugStackFrameSniffer_FWD_DEFINED__
+#define __IDebugStackFrameSniffer_FWD_DEFINED__
+typedef interface IDebugStackFrameSniffer IDebugStackFrameSniffer;
+#endif
+
+#ifndef __IDebugStackFrameSnifferEx32_FWD_DEFINED__
+#define __IDebugStackFrameSnifferEx32_FWD_DEFINED__
+typedef interface IDebugStackFrameSnifferEx32 IDebugStackFrameSnifferEx32;
+#endif
+
+#ifndef __IDebugStackFrameSnifferEx64_FWD_DEFINED__
+#define __IDebugStackFrameSnifferEx64_FWD_DEFINED__
+typedef interface IDebugStackFrameSnifferEx64 IDebugStackFrameSnifferEx64;
+#endif
+
+#ifndef __IDebugSyncOperation_FWD_DEFINED__
+#define __IDebugSyncOperation_FWD_DEFINED__
+typedef interface IDebugSyncOperation IDebugSyncOperation;
+#endif
+
+#ifndef __IDebugAsyncOperation_FWD_DEFINED__
+#define __IDebugAsyncOperation_FWD_DEFINED__
+typedef interface IDebugAsyncOperation IDebugAsyncOperation;
+#endif
+
+#ifndef __IDebugAsyncOperationCallBack_FWD_DEFINED__
+#define __IDebugAsyncOperationCallBack_FWD_DEFINED__
+typedef interface IDebugAsyncOperationCallBack IDebugAsyncOperationCallBack;
+#endif
+
+#ifndef __IEnumDebugCodeContexts_FWD_DEFINED__
+#define __IEnumDebugCodeContexts_FWD_DEFINED__
+typedef interface IEnumDebugCodeContexts IEnumDebugCodeContexts;
+#endif
+
+#ifndef __IEnumDebugStackFrames_FWD_DEFINED__
+#define __IEnumDebugStackFrames_FWD_DEFINED__
+typedef interface IEnumDebugStackFrames IEnumDebugStackFrames;
+#endif
+
+#ifndef __IEnumDebugStackFrames64_FWD_DEFINED__
+#define __IEnumDebugStackFrames64_FWD_DEFINED__
+typedef interface IEnumDebugStackFrames64 IEnumDebugStackFrames64;
+#endif
+
+#ifndef __IDebugDocumentInfo_FWD_DEFINED__
+#define __IDebugDocumentInfo_FWD_DEFINED__
+typedef interface IDebugDocumentInfo IDebugDocumentInfo;
+#endif
+
+#ifndef __IDebugDocumentProvider_FWD_DEFINED__
+#define __IDebugDocumentProvider_FWD_DEFINED__
+typedef interface IDebugDocumentProvider IDebugDocumentProvider;
+#endif
+
+#ifndef __IDebugDocument_FWD_DEFINED__
+#define __IDebugDocument_FWD_DEFINED__
+typedef interface IDebugDocument IDebugDocument;
+#endif
+
+#ifndef __IDebugDocumentText_FWD_DEFINED__
+#define __IDebugDocumentText_FWD_DEFINED__
+typedef interface IDebugDocumentText IDebugDocumentText;
+#endif
+
+#ifndef __IDebugDocumentTextEvents_FWD_DEFINED__
+#define __IDebugDocumentTextEvents_FWD_DEFINED__
+typedef interface IDebugDocumentTextEvents IDebugDocumentTextEvents;
+#endif
+
+#ifndef __IDebugDocumentTextAuthor_FWD_DEFINED__
+#define __IDebugDocumentTextAuthor_FWD_DEFINED__
+typedef interface IDebugDocumentTextAuthor IDebugDocumentTextAuthor;
+#endif
+
+#ifndef __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
+#define __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
+typedef interface IDebugDocumentTextExternalAuthor IDebugDocumentTextExternalAuthor;
+#endif
+
+#ifndef __IDebugDocumentHelper32_FWD_DEFINED__
+#define __IDebugDocumentHelper32_FWD_DEFINED__
+typedef interface IDebugDocumentHelper32 IDebugDocumentHelper32;
+#endif
+
+#ifndef __IDebugDocumentHelper64_FWD_DEFINED__
+#define __IDebugDocumentHelper64_FWD_DEFINED__
+typedef interface IDebugDocumentHelper64 IDebugDocumentHelper64;
+#endif
+
+#ifndef __IDebugDocumentHost_FWD_DEFINED__
+#define __IDebugDocumentHost_FWD_DEFINED__
+typedef interface IDebugDocumentHost IDebugDocumentHost;
+#endif
+
+#ifndef __IDebugDocumentContext_FWD_DEFINED__
+#define __IDebugDocumentContext_FWD_DEFINED__
+typedef interface IDebugDocumentContext IDebugDocumentContext;
+#endif
+
+#ifndef __IDebugSessionProvider_FWD_DEFINED__
+#define __IDebugSessionProvider_FWD_DEFINED__
+typedef interface IDebugSessionProvider IDebugSessionProvider;
+#endif
+
+#ifndef __IApplicationDebugger_FWD_DEFINED__
+#define __IApplicationDebugger_FWD_DEFINED__
+typedef interface IApplicationDebugger IApplicationDebugger;
+#endif
+
+#ifndef __IApplicationDebuggerUI_FWD_DEFINED__
+#define __IApplicationDebuggerUI_FWD_DEFINED__
+typedef interface IApplicationDebuggerUI IApplicationDebuggerUI;
+#endif
+
+#ifndef __IMachineDebugManager_FWD_DEFINED__
+#define __IMachineDebugManager_FWD_DEFINED__
+typedef interface IMachineDebugManager IMachineDebugManager;
+#endif
+
+#ifndef __IMachineDebugManagerCookie_FWD_DEFINED__
+#define __IMachineDebugManagerCookie_FWD_DEFINED__
+typedef interface IMachineDebugManagerCookie IMachineDebugManagerCookie;
+#endif
+
+#ifndef __IMachineDebugManagerEvents_FWD_DEFINED__
+#define __IMachineDebugManagerEvents_FWD_DEFINED__
+typedef interface IMachineDebugManagerEvents IMachineDebugManagerEvents;
+#endif
+
+#ifndef __IProcessDebugManager32_FWD_DEFINED__
+#define __IProcessDebugManager32_FWD_DEFINED__
+typedef interface IProcessDebugManager32 IProcessDebugManager32;
+#endif
+
+#ifndef __IProcessDebugManager64_FWD_DEFINED__
+#define __IProcessDebugManager64_FWD_DEFINED__
+typedef interface IProcessDebugManager64 IProcessDebugManager64;
+#endif
+
+#ifndef __IRemoteDebugApplication_FWD_DEFINED__
+#define __IRemoteDebugApplication_FWD_DEFINED__
+typedef interface IRemoteDebugApplication IRemoteDebugApplication;
+#endif
+
+#ifndef __IDebugApplication32_FWD_DEFINED__
+#define __IDebugApplication32_FWD_DEFINED__
+typedef interface IDebugApplication32 IDebugApplication32;
+#endif
+
+#ifndef __IDebugApplication64_FWD_DEFINED__
+#define __IDebugApplication64_FWD_DEFINED__
+typedef interface IDebugApplication64 IDebugApplication64;
+#endif
+
+#ifndef __IRemoteDebugApplicationEvents_FWD_DEFINED__
+#define __IRemoteDebugApplicationEvents_FWD_DEFINED__
+typedef interface IRemoteDebugApplicationEvents IRemoteDebugApplicationEvents;
+#endif
+
+#ifndef __IDebugApplicationNode_FWD_DEFINED__
+#define __IDebugApplicationNode_FWD_DEFINED__
+typedef interface IDebugApplicationNode IDebugApplicationNode;
+#endif
+
+#ifndef __IDebugApplicationNodeEvents_FWD_DEFINED__
+#define __IDebugApplicationNodeEvents_FWD_DEFINED__
+typedef interface IDebugApplicationNodeEvents IDebugApplicationNodeEvents;
+#endif
+
+#ifndef __AsyncIDebugApplicationNodeEvents_FWD_DEFINED__
+#define __AsyncIDebugApplicationNodeEvents_FWD_DEFINED__
+typedef interface AsyncIDebugApplicationNodeEvents AsyncIDebugApplicationNodeEvents;
+#endif
+
+#ifndef __IDebugThreadCall32_FWD_DEFINED__
+#define __IDebugThreadCall32_FWD_DEFINED__
+typedef interface IDebugThreadCall32 IDebugThreadCall32;
+#endif
+
+#ifndef __IDebugThreadCall64_FWD_DEFINED__
+#define __IDebugThreadCall64_FWD_DEFINED__
+typedef interface IDebugThreadCall64 IDebugThreadCall64;
+#endif
+
+#ifndef __IRemoteDebugApplicationThread_FWD_DEFINED__
+#define __IRemoteDebugApplicationThread_FWD_DEFINED__
+typedef interface IRemoteDebugApplicationThread IRemoteDebugApplicationThread;
+#endif
+
+#ifndef __IDebugApplicationThread_FWD_DEFINED__
+#define __IDebugApplicationThread_FWD_DEFINED__
+typedef interface IDebugApplicationThread IDebugApplicationThread;
+#endif
+
+#ifndef __IDebugApplicationThread64_FWD_DEFINED__
+#define __IDebugApplicationThread64_FWD_DEFINED__
+typedef interface IDebugApplicationThread64 IDebugApplicationThread64;
+#endif
+
+#ifndef __IDebugCookie_FWD_DEFINED__
+#define __IDebugCookie_FWD_DEFINED__
+typedef interface IDebugCookie IDebugCookie;
+#endif
+
+#ifndef __IEnumDebugApplicationNodes_FWD_DEFINED__
+#define __IEnumDebugApplicationNodes_FWD_DEFINED__
+typedef interface IEnumDebugApplicationNodes IEnumDebugApplicationNodes;
+#endif
+
+#ifndef __IEnumRemoteDebugApplications_FWD_DEFINED__
+#define __IEnumRemoteDebugApplications_FWD_DEFINED__
+typedef interface IEnumRemoteDebugApplications IEnumRemoteDebugApplications;
+#endif
+
+#ifndef __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
+#define __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
+typedef interface IEnumRemoteDebugApplicationThreads IEnumRemoteDebugApplicationThreads;
+#endif
+
+#ifndef __IDebugFormatter_FWD_DEFINED__
+#define __IDebugFormatter_FWD_DEFINED__
+typedef interface IDebugFormatter IDebugFormatter;
+#endif
+
+#ifndef __ISimpleConnectionPoint_FWD_DEFINED__
+#define __ISimpleConnectionPoint_FWD_DEFINED__
+typedef interface ISimpleConnectionPoint ISimpleConnectionPoint;
+#endif
+
+#ifndef __IDebugHelper_FWD_DEFINED__
+#define __IDebugHelper_FWD_DEFINED__
+typedef interface IDebugHelper IDebugHelper;
+#endif
+
+#ifndef __IEnumDebugExpressionContexts_FWD_DEFINED__
+#define __IEnumDebugExpressionContexts_FWD_DEFINED__
+typedef interface IEnumDebugExpressionContexts IEnumDebugExpressionContexts;
+#endif
+
+#ifndef __IProvideExpressionContexts_FWD_DEFINED__
+#define __IProvideExpressionContexts_FWD_DEFINED__
+typedef interface IProvideExpressionContexts IProvideExpressionContexts;
+#endif
+
+#ifndef __ProcessDebugManager_FWD_DEFINED__
+#define __ProcessDebugManager_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class ProcessDebugManager ProcessDebugManager;
+#else
+typedef struct ProcessDebugManager ProcessDebugManager;
+#endif /* defined __cplusplus */
+#endif /* defined __ProcessDebugManager_FWD_DEFINED__ */
+
+#ifndef __DebugHelper_FWD_DEFINED__
+#define __DebugHelper_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class DebugHelper DebugHelper;
+#else
+typedef struct DebugHelper DebugHelper;
+#endif /* defined __cplusplus */
+#endif /* defined __DebugHelper_FWD_DEFINED__ */
+
+#ifndef __CDebugDocumentHelper_FWD_DEFINED__
+#define __CDebugDocumentHelper_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class CDebugDocumentHelper CDebugDocumentHelper;
+#else
+typedef struct CDebugDocumentHelper CDebugDocumentHelper;
+#endif /* defined __cplusplus */
+#endif /* defined __CDebugDocumentHelper_FWD_DEFINED__ */
+
+#ifndef __MachineDebugManager_RETAIL_FWD_DEFINED__
+#define __MachineDebugManager_RETAIL_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class MachineDebugManager_RETAIL MachineDebugManager_RETAIL;
+#else
+typedef struct MachineDebugManager_RETAIL MachineDebugManager_RETAIL;
+#endif /* defined __cplusplus */
+#endif /* defined __MachineDebugManager_RETAIL_FWD_DEFINED__ */
+
+#ifndef __MachineDebugManager_DEBUG_FWD_DEFINED__
+#define __MachineDebugManager_DEBUG_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class MachineDebugManager_DEBUG MachineDebugManager_DEBUG;
+#else
+typedef struct MachineDebugManager_DEBUG MachineDebugManager_DEBUG;
+#endif /* defined __cplusplus */
+#endif /* defined __MachineDebugManager_DEBUG_FWD_DEFINED__ */
+
+#ifndef __DefaultDebugSessionProvider_FWD_DEFINED__
+#define __DefaultDebugSessionProvider_FWD_DEFINED__
+#ifdef __cplusplus
+typedef class DefaultDebugSessionProvider DefaultDebugSessionProvider;
+#else
+typedef struct DefaultDebugSessionProvider DefaultDebugSessionProvider;
+#endif /* defined __cplusplus */
+#endif /* defined __DefaultDebugSessionProvider_FWD_DEFINED__ */
+
+/* Headers for imported files */
+
+#include <ocidl.h>
+#include <oleidl.h>
+#include <oaidl.h>
+#include <activscp.h>
+#include <dbgprop.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <winapifamily.h>
+
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+
+#ifndef __ActivDbg_h
+#define __ActivDbg_h
+#ifndef __IActiveScriptDebug32_FWD_DEFINED__
+#define __IActiveScriptDebug32_FWD_DEFINED__
+typedef interface IActiveScriptDebug32 IActiveScriptDebug32;
+#endif
+
+#ifndef __IActiveScriptDebug64_FWD_DEFINED__
+#define __IActiveScriptDebug64_FWD_DEFINED__
+typedef interface IActiveScriptDebug64 IActiveScriptDebug64;
+#endif
+
+#ifndef __IActiveScriptErrorDebug_FWD_DEFINED__
+#define __IActiveScriptErrorDebug_FWD_DEFINED__
+typedef interface IActiveScriptErrorDebug IActiveScriptErrorDebug;
+#endif
+
+#ifndef __IActiveScriptSiteDebug32_FWD_DEFINED__
+#define __IActiveScriptSiteDebug32_FWD_DEFINED__
+typedef interface IActiveScriptSiteDebug32 IActiveScriptSiteDebug32;
+#endif
+
+#ifndef __IActiveScriptSiteDebug64_FWD_DEFINED__
+#define __IActiveScriptSiteDebug64_FWD_DEFINED__
+typedef interface IActiveScriptSiteDebug64 IActiveScriptSiteDebug64;
+#endif
+
+#ifndef __IActiveScriptSiteDebugEx_FWD_DEFINED__
+#define __IActiveScriptSiteDebugEx_FWD_DEFINED__
+typedef interface IActiveScriptSiteDebugEx IActiveScriptSiteDebugEx;
+#endif
+
+#ifndef __IActiveScriptTextInfo_FWD_DEFINED__
+#define __IActiveScriptTextInfo_FWD_DEFINED__
+typedef interface IActiveScriptTextInfo IActiveScriptTextInfo;
+#endif
+
+#ifndef __IApplicationDebugger_FWD_DEFINED__
+#define __IApplicationDebugger_FWD_DEFINED__
+typedef interface IApplicationDebugger IApplicationDebugger;
+#endif
+
+#ifndef __IDebugApplication32_FWD_DEFINED__
+#define __IDebugApplication32_FWD_DEFINED__
+typedef interface IDebugApplication32 IDebugApplication32;
+#endif
+
+#ifndef __IDebugApplication64_FWD_DEFINED__
+#define __IDebugApplication64_FWD_DEFINED__
+typedef interface IDebugApplication64 IDebugApplication64;
+#endif
+
+#ifndef __IDebugApplicationNode_FWD_DEFINED__
+#define __IDebugApplicationNode_FWD_DEFINED__
+typedef interface IDebugApplicationNode IDebugApplicationNode;
+#endif
+
+#ifndef __IDebugApplicationNodeEvents_FWD_DEFINED__
+#define __IDebugApplicationNodeEvents_FWD_DEFINED__
+typedef interface IDebugApplicationNodeEvents IDebugApplicationNodeEvents;
+#endif
+
+#ifndef __AsyncIDebugApplicationNodeEvents_FWD_DEFINED__
+#define __AsyncIDebugApplicationNodeEvents_FWD_DEFINED__
+typedef interface AsyncIDebugApplicationNodeEvents AsyncIDebugApplicationNodeEvents;
+#endif
+
+#ifndef __IDebugApplicationThread_FWD_DEFINED__
+#define __IDebugApplicationThread_FWD_DEFINED__
+typedef interface IDebugApplicationThread IDebugApplicationThread;
+#endif
+
+#ifndef __IDebugAsyncOperation_FWD_DEFINED__
+#define __IDebugAsyncOperation_FWD_DEFINED__
+typedef interface IDebugAsyncOperation IDebugAsyncOperation;
+#endif
+
+#ifndef __IDebugAsyncOperationCallBack_FWD_DEFINED__
+#define __IDebugAsyncOperationCallBack_FWD_DEFINED__
+typedef interface IDebugAsyncOperationCallBack IDebugAsyncOperationCallBack;
+#endif
+
+#ifndef __IDebugCodeContext_FWD_DEFINED__
+#define __IDebugCodeContext_FWD_DEFINED__
+typedef interface IDebugCodeContext IDebugCodeContext;
+#endif
+
+#ifndef __IDebugDocument_FWD_DEFINED__
+#define __IDebugDocument_FWD_DEFINED__
+typedef interface IDebugDocument IDebugDocument;
+#endif
+
+#ifndef __IDebugDocumentContext_FWD_DEFINED__
+#define __IDebugDocumentContext_FWD_DEFINED__
+typedef interface IDebugDocumentContext IDebugDocumentContext;
+#endif
+
+#ifndef __IDebugDocumentHelper32_FWD_DEFINED__
+#define __IDebugDocumentHelper32_FWD_DEFINED__
+typedef interface IDebugDocumentHelper32 IDebugDocumentHelper32;
+#endif
+
+#ifndef __IDebugDocumentHelper64_FWD_DEFINED__
+#define __IDebugDocumentHelper64_FWD_DEFINED__
+typedef interface IDebugDocumentHelper64 IDebugDocumentHelper64;
+#endif
+
+#ifndef __IDebugDocumentHost_FWD_DEFINED__
+#define __IDebugDocumentHost_FWD_DEFINED__
+typedef interface IDebugDocumentHost IDebugDocumentHost;
+#endif
+
+#ifndef __IDebugDocumentInfo_FWD_DEFINED__
+#define __IDebugDocumentInfo_FWD_DEFINED__
+typedef interface IDebugDocumentInfo IDebugDocumentInfo;
+#endif
+
+#ifndef __IDebugDocumentProvider_FWD_DEFINED__
+#define __IDebugDocumentProvider_FWD_DEFINED__
+typedef interface IDebugDocumentProvider IDebugDocumentProvider;
+#endif
+
+#ifndef __IDebugDocumentText_FWD_DEFINED__
+#define __IDebugDocumentText_FWD_DEFINED__
+typedef interface IDebugDocumentText IDebugDocumentText;
+#endif
+
+#ifndef __IDebugDocumentTextAuthor_FWD_DEFINED__
+#define __IDebugDocumentTextAuthor_FWD_DEFINED__
+typedef interface IDebugDocumentTextAuthor IDebugDocumentTextAuthor;
+#endif
+
+#ifndef __IDebugDocumentTextEvents_FWD_DEFINED__
+#define __IDebugDocumentTextEvents_FWD_DEFINED__
+typedef interface IDebugDocumentTextEvents IDebugDocumentTextEvents;
+#endif
+
+#ifndef __IDebugExpression_FWD_DEFINED__
+#define __IDebugExpression_FWD_DEFINED__
+typedef interface IDebugExpression IDebugExpression;
+#endif
+
+#ifndef __IDebugExpressionCallBack_FWD_DEFINED__
+#define __IDebugExpressionCallBack_FWD_DEFINED__
+typedef interface IDebugExpressionCallBack IDebugExpressionCallBack;
+#endif
+
+#ifndef __IDebugExpressionContext_FWD_DEFINED__
+#define __IDebugExpressionContext_FWD_DEFINED__
+typedef interface IDebugExpressionContext IDebugExpressionContext;
+#endif
+
+#ifndef __IDebugFormatter_FWD_DEFINED__
+#define __IDebugFormatter_FWD_DEFINED__
+typedef interface IDebugFormatter IDebugFormatter;
+#endif
+
+#ifndef __IDebugSessionProvider_FWD_DEFINED__
+#define __IDebugSessionProvider_FWD_DEFINED__
+typedef interface IDebugSessionProvider IDebugSessionProvider;
+#endif
+
+#ifndef __IDebugStackFrame_FWD_DEFINED__
+#define __IDebugStackFrame_FWD_DEFINED__
+typedef interface IDebugStackFrame IDebugStackFrame;
+#endif
+
+#ifndef __IDebugStackFrameSniffer_FWD_DEFINED__
+#define __IDebugStackFrameSniffer_FWD_DEFINED__
+typedef interface IDebugStackFrameSniffer IDebugStackFrameSniffer;
+#endif
+
+#ifndef __IDebugSyncOperation_FWD_DEFINED__
+#define __IDebugSyncOperation_FWD_DEFINED__
+typedef interface IDebugSyncOperation IDebugSyncOperation;
+#endif
+
+#ifndef __IDebugThreadCall32_FWD_DEFINED__
+#define __IDebugThreadCall32_FWD_DEFINED__
+typedef interface IDebugThreadCall32 IDebugThreadCall32;
+#endif
+
+#ifndef __IDebugThreadCall64_FWD_DEFINED__
+#define __IDebugThreadCall64_FWD_DEFINED__
+typedef interface IDebugThreadCall64 IDebugThreadCall64;
+#endif
+
+#ifndef __IEnumActiveScriptDebugs_FWD_DEFINED__
+#define __IEnumActiveScriptDebugs_FWD_DEFINED__
+typedef interface IEnumActiveScriptDebugs IEnumActiveScriptDebugs;
+#endif
+
+#ifndef __IEnumDebugApplicationNodes_FWD_DEFINED__
+#define __IEnumDebugApplicationNodes_FWD_DEFINED__
+typedef interface IEnumDebugApplicationNodes IEnumDebugApplicationNodes;
+#endif
+
+#ifndef __IEnumDebugCodeContexts_FWD_DEFINED__
+#define __IEnumDebugCodeContexts_FWD_DEFINED__
+typedef interface IEnumDebugCodeContexts IEnumDebugCodeContexts;
+#endif
+
+#ifndef __IEnumDebugDocumentContexts_FWD_DEFINED__
+#define __IEnumDebugDocumentContexts_FWD_DEFINED__
+typedef interface IEnumDebugDocumentContexts IEnumDebugDocumentContexts;
+#endif
+
+#ifndef __IEnumDebugExpressionContexts_FWD_DEFINED__
+#define __IEnumDebugExpressionContexts_FWD_DEFINED__
+typedef interface IEnumDebugExpressionContexts IEnumDebugExpressionContexts;
+#endif
+
+#ifndef __IEnumDebugObjectBrowsers_FWD_DEFINED__
+#define __IEnumDebugObjectBrowsers_FWD_DEFINED__
+typedef interface IEnumDebugObjectBrowsers IEnumDebugObjectBrowsers;
+#endif
+
+#ifndef __IEnumDebugStackFrames_FWD_DEFINED__
+#define __IEnumDebugStackFrames_FWD_DEFINED__
+typedef interface IEnumDebugStackFrames IEnumDebugStackFrames;
+#endif
+
+#ifndef __IEnumDebugStackFrames64_FWD_DEFINED__
+#define __IEnumDebugStackFrames64_FWD_DEFINED__
+typedef interface IEnumDebugStackFrames64 IEnumDebugStackFrames64;
+#endif
+
+#ifndef __IEnumRemoteDebugApplications_FWD_DEFINED__
+#define __IEnumRemoteDebugApplications_FWD_DEFINED__
+typedef interface IEnumRemoteDebugApplications IEnumRemoteDebugApplications;
+#endif
+
+#ifndef __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
+#define __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
+typedef interface IEnumRemoteDebugApplicationThreads IEnumRemoteDebugApplicationThreads;
+#endif
+
+#ifndef __IMachineDebugManager_FWD_DEFINED__
+#define __IMachineDebugManager_FWD_DEFINED__
+typedef interface IMachineDebugManager IMachineDebugManager;
+#endif
+
+#ifndef __IMachineDebugManagerCookie_FWD_DEFINED__
+#define __IMachineDebugManagerCookie_FWD_DEFINED__
+typedef interface IMachineDebugManagerCookie IMachineDebugManagerCookie;
+#endif
+
+#ifndef __IMachineDebugManagerEvents_FWD_DEFINED__
+#define __IMachineDebugManagerEvents_FWD_DEFINED__
+typedef interface IMachineDebugManagerEvents IMachineDebugManagerEvents;
+#endif
+
+#ifndef __IProcessDebugManager_FWD_DEFINED__
+#define __IProcessDebugManager_FWD_DEFINED__
+typedef interface IProcessDebugManager IProcessDebugManager;
+#endif
+
+#ifndef __IProvideExpressionContexts_FWD_DEFINED__
+#define __IProvideExpressionContexts_FWD_DEFINED__
+typedef interface IProvideExpressionContexts IProvideExpressionContexts;
+#endif
+
+#ifndef __IRemoteDebugApplication_FWD_DEFINED__
+#define __IRemoteDebugApplication_FWD_DEFINED__
+typedef interface IRemoteDebugApplication IRemoteDebugApplication;
+#endif
+
+#ifndef __IRemoteDebugApplicationThread_FWD_DEFINED__
+#define __IRemoteDebugApplicationThread_FWD_DEFINED__
+typedef interface IRemoteDebugApplicationThread IRemoteDebugApplicationThread;
+#endif
+
+typedef DWORD APPBREAKFLAGS;
+typedef WORD SOURCE_TEXT_ATTR;
+typedef DWORD TEXT_DOC_ATTR;
+typedef enum tagBREAKPOINT_STATE {
+    BREAKPOINT_DELETED = 0,
+    BREAKPOINT_DISABLED = 1,
+    BREAKPOINT_ENABLED = 2
+} BREAKPOINT_STATE;
+typedef enum tagBREAKREASON {
+    BREAKREASON_STEP = 0,
+    BREAKREASON_BREAKPOINT = 1,
+    BREAKREASON_DEBUGGER_BLOCK = 2,
+    BREAKREASON_HOST_INITIATED = 3,
+    BREAKREASON_LANGUAGE_INITIATED = 4,
+    BREAKREASON_DEBUGGER_HALT = 5,
+    BREAKREASON_ERROR = 6,
+    BREAKREASON_JIT = 7
+} BREAKREASON;
+typedef enum tagBREAKRESUME_ACTION {
+    BREAKRESUMEACTION_ABORT = 0,
+    BREAKRESUMEACTION_CONTINUE = 1,
+    BREAKRESUMEACTION_STEP_INTO = 2,
+    BREAKRESUMEACTION_STEP_OVER = 3,
+    BREAKRESUMEACTION_STEP_OUT = 4,
+    BREAKRESUMEACTION_IGNORE = 5
+} BREAKRESUMEACTION;
+typedef enum tagDOCUMENTNAMETYPE {
+    DOCUMENTNAMETYPE_APPNODE = 0,
+    DOCUMENTNAMETYPE_TITLE = 1,
+    DOCUMENTNAMETYPE_FILE_TAIL = 2,
+    DOCUMENTNAMETYPE_URL = 3,
+    DOCUMENTNAMETYPE_UNIQUE_TITLE = 4
+} DOCUMENTNAMETYPE;
+typedef enum tagERRORRESUMEACTION {
+    ERRORRESUMEACTION_ReexecuteErrorStatement = 0,
+    ERRORRESUMEACTION_AbortCallAndReturnErrorToCaller = 1,
+    ERRORRESUMEACTION_SkipErrorStatement = 2
+} ERRORRESUMEACTION;
+typedef struct tagDebugStackFrameDescriptor {
+    IDebugStackFrame *pdsf;
+    DWORD dwMin;
+    DWORD dwLim;
+    WINBOOL fFinal;
+    IUnknown *punkFinal;
+} DebugStackFrameDescriptor;
+typedef struct tagDebugStackFrameDescriptor64 {
+    IDebugStackFrame *pdsf;
+    DWORDLONG dwMin;
+    DWORDLONG dwLim;
+    WINBOOL fFinal;
+    IUnknown *punkFinal;
+} DebugStackFrameDescriptor64;
+#define APPBREAKFLAG_DEBUGGER_BLOCK (0x1)
+
+#define APPBREAKFLAG_DEBUGGER_HALT (0x2)
+
+#define APPBREAKFLAG_STEP (0x10000)
+
+#define APPBREAKFLAG_NESTED (0x20000)
+
+#define APPBREAKFLAG_STEPTYPE_SOURCE (0x0)
+
+#define APPBREAKFLAG_STEPTYPE_BYTECODE (0x100000)
+
+#define APPBREAKFLAG_STEPTYPE_MACHINE (0x200000)
+
+#define APPBREAKFLAG_STEPTYPE_MASK (0xf00000)
+
+#define APPBREAKFLAG_IN_BREAKPOINT (0x80000000)
+
+#define SOURCETEXT_ATTR_KEYWORD (0x1)
+
+#define SOURCETEXT_ATTR_COMMENT (0x2)
+
+#define SOURCETEXT_ATTR_NONSOURCE (0x4)
+
+#define SOURCETEXT_ATTR_OPERATOR (0x8)
+
+#define SOURCETEXT_ATTR_NUMBER (0x10)
+
+#define SOURCETEXT_ATTR_STRING (0x20)
+
+#define SOURCETEXT_ATTR_FUNCTION_START (0x40)
+
+#define TEXT_DOC_ATTR_READONLY (0x1)
+
+#define TEXT_DOC_ATTR_TYPE_PRIMARY (0x2)
+
+#define TEXT_DOC_ATTR_TYPE_WORKER (0x4)
+
+#define TEXT_DOC_ATTR_TYPE_SCRIPT (0x8)
+
+
+#define DEBUG_TEXT_ISEXPRESSION (0x1)
+
+#define DEBUG_TEXT_RETURNVALUE (0x2)
+
+#define DEBUG_TEXT_NOSIDEEFFECTS (0x4)
+
+#define DEBUG_TEXT_ALLOWBREAKPOINTS (0x8)
+
+#define DEBUG_TEXT_ALLOWERRORREPORT (0x10)
+
+#define DEBUG_TEXT_EVALUATETOCODECONTEXT (0x20)
+
+#ifndef DISABLE_ACTIVDBG_INTERFACE_WRAPPERS
+#ifdef _WIN64
+#define IDebugApplication IDebugApplication64
+#define IID_IDebugApplication IID_IDebugApplication64
+#define IDebugThreadCall IDebugThreadCall64
+#define IID_IDebugThreadCall IID_IDebugThreadCall64
+#define SynchronousCallIntoThread SynchronousCallIntoThread64
+#define IActiveScriptDebug IActiveScriptDebug64
+#define IID_IActiveScriptDebug IID_IActiveScriptDebug64
+#define IActiveScriptSiteDebug IActiveScriptSiteDebug64
+#define IID_IActiveScriptSiteDebug IID_IActiveScriptSiteDebug64
+#define IDebugStackFrameSnifferEx IDebugStackFrameSnifferEx64
+#define IID_IDebugStackFrameSnifferEx IID_IDebugStackFrameSnifferEx64
+#define EnumStackFramesEx EnumStackFramesEx64
+#define IDebugDocumentHelper IDebugDocumentHelper64
+#define IID_IDebugDocumentHelper IID_IDebugDocumentHelper64
+#define IProcessDebugManager IProcessDebugManager64
+#define IID_IProcessDebugManager IID_IProcessDebugManager64
+#else
+#define IDebugApplication IDebugApplication32
+#define IID_IDebugApplication IID_IDebugApplication32
+#define IDebugThreadCall IDebugThreadCall32
+#define IID_IDebugThreadCall IID_IDebugThreadCall32
+#define SynchronousCallIntoThread SynchronousCallIntoThread32
+#define IActiveScriptDebug IActiveScriptDebug32
+#define IID_IActiveScriptDebug IID_IActiveScriptDebug32
+#define IActiveScriptSiteDebug IActiveScriptSiteDebug32
+#define IID_IActiveScriptSiteDebug IID_IActiveScriptSiteDebug32
+#define IDebugStackFrameSnifferEx IDebugStackFrameSnifferEx32
+#define IID_IDebugStackFrameSnifferEx IID_IDebugStackFrameSnifferEx32
+#define EnumStackFramesEx EnumStackFramesEx32
+#define IDebugDocumentHelper IDebugDocumentHelper32
+#define IID_IDebugDocumentHelper IID_IDebugDocumentHelper32
+#define IProcessDebugManager IProcessDebugManager32
+#define IID_IProcessDebugManager IID_IProcessDebugManager32
+#endif
+#endif
+EXTERN_C const CLSID CLSID_DebugHelper;
+EXTERN_C const CLSID CLSID_MachineDebugManager;
+EXTERN_C const CLSID CLSID_ProcessDebugManager;
+/*****************************************************************************
+ * IActiveScriptDebug32 interface
+ */
+#ifndef __IActiveScriptDebug32_INTERFACE_DEFINED__
+#define __IActiveScriptDebug32_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IActiveScriptDebug32, 0x51973c10, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c10-cb0c-11d0-b5c9-00a0244a0e7a")
+IActiveScriptDebug32 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetScriptTextAttributes(
+        LPCOLESTR pstrCode,
+        ULONG uNumCodeChars,
+        LPCOLESTR pstrDelimiter,
+        DWORD dwFlags,
+        SOURCE_TEXT_ATTR *pattr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetScriptletTextAttributes(
+        LPCOLESTR pstrCode,
+        ULONG uNumCodeChars,
+        LPCOLESTR pstrDelimiter,
+        DWORD dwFlags,
+        SOURCE_TEXT_ATTR *pattr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumCodeContextsOfPosition(
+        DWORD dwSourceContext,
+        ULONG uCharacterOffset,
+        ULONG uNumChars,
+        IEnumDebugCodeContexts **ppescc) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IActiveScriptDebug32, 0x51973c10, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IActiveScriptDebug32Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IActiveScriptDebug32* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IActiveScriptDebug32* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IActiveScriptDebug32* This);
+
+    /*** IActiveScriptDebug32 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetScriptTextAttributes)(
+        IActiveScriptDebug32* This,
+        LPCOLESTR pstrCode,
+        ULONG uNumCodeChars,
+        LPCOLESTR pstrDelimiter,
+        DWORD dwFlags,
+        SOURCE_TEXT_ATTR *pattr);
+
+    HRESULT (STDMETHODCALLTYPE *GetScriptletTextAttributes)(
+        IActiveScriptDebug32* This,
+        LPCOLESTR pstrCode,
+        ULONG uNumCodeChars,
+        LPCOLESTR pstrDelimiter,
+        DWORD dwFlags,
+        SOURCE_TEXT_ATTR *pattr);
+
+    HRESULT (STDMETHODCALLTYPE *EnumCodeContextsOfPosition)(
+        IActiveScriptDebug32* This,
+        DWORD dwSourceContext,
+        ULONG uCharacterOffset,
+        ULONG uNumChars,
+        IEnumDebugCodeContexts **ppescc);
+
+    END_INTERFACE
+} IActiveScriptDebug32Vtbl;
+interface IActiveScriptDebug32 {
+    CONST_VTBL IActiveScriptDebug32Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IActiveScriptDebug32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IActiveScriptDebug32_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IActiveScriptDebug32_Release(This) (This)->lpVtbl->Release(This)
+/*** IActiveScriptDebug32 methods ***/
+#define IActiveScriptDebug32_GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr) (This)->lpVtbl->GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
+#define IActiveScriptDebug32_GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr) (This)->lpVtbl->GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
+#define IActiveScriptDebug32_EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc) (This)->lpVtbl->EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IActiveScriptDebug32_QueryInterface(IActiveScriptDebug32* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IActiveScriptDebug32_AddRef(IActiveScriptDebug32* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IActiveScriptDebug32_Release(IActiveScriptDebug32* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IActiveScriptDebug32 methods ***/
+static FORCEINLINE HRESULT IActiveScriptDebug32_GetScriptTextAttributes(IActiveScriptDebug32* This,LPCOLESTR pstrCode,ULONG uNumCodeChars,LPCOLESTR pstrDelimiter,DWORD dwFlags,SOURCE_TEXT_ATTR *pattr) {
+    return This->lpVtbl->GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr);
+}
+static FORCEINLINE HRESULT IActiveScriptDebug32_GetScriptletTextAttributes(IActiveScriptDebug32* This,LPCOLESTR pstrCode,ULONG uNumCodeChars,LPCOLESTR pstrDelimiter,DWORD dwFlags,SOURCE_TEXT_ATTR *pattr) {
+    return This->lpVtbl->GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr);
+}
+static FORCEINLINE HRESULT IActiveScriptDebug32_EnumCodeContextsOfPosition(IActiveScriptDebug32* This,DWORD dwSourceContext,ULONG uCharacterOffset,ULONG uNumChars,IEnumDebugCodeContexts **ppescc) {
+    return This->lpVtbl->EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IActiveScriptDebug32_GetScriptTextAttributes_Proxy(
+    IActiveScriptDebug32* This,
+    LPCOLESTR pstrCode,
+    ULONG uNumCodeChars,
+    LPCOLESTR pstrDelimiter,
+    DWORD dwFlags,
+    SOURCE_TEXT_ATTR *pattr);
+void __RPC_STUB IActiveScriptDebug32_GetScriptTextAttributes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptDebug32_GetScriptletTextAttributes_Proxy(
+    IActiveScriptDebug32* This,
+    LPCOLESTR pstrCode,
+    ULONG uNumCodeChars,
+    LPCOLESTR pstrDelimiter,
+    DWORD dwFlags,
+    SOURCE_TEXT_ATTR *pattr);
+void __RPC_STUB IActiveScriptDebug32_GetScriptletTextAttributes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptDebug32_EnumCodeContextsOfPosition_Proxy(
+    IActiveScriptDebug32* This,
+    DWORD dwSourceContext,
+    ULONG uCharacterOffset,
+    ULONG uNumChars,
+    IEnumDebugCodeContexts **ppescc);
+void __RPC_STUB IActiveScriptDebug32_EnumCodeContextsOfPosition_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IActiveScriptDebug32_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IActiveScriptDebug64 interface
+ */
+#ifndef __IActiveScriptDebug64_INTERFACE_DEFINED__
+#define __IActiveScriptDebug64_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IActiveScriptDebug64, 0xbc437e23, 0xf5b8, 0x47f4, 0xbb,0x79, 0x7d,0x1c,0xe5,0x48,0x3b,0x86);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("bc437e23-f5b8-47f4-bb79-7d1ce5483b86")
+IActiveScriptDebug64 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetScriptTextAttributes(
+        LPCOLESTR pstrCode,
+        ULONG uNumCodeChars,
+        LPCOLESTR pstrDelimiter,
+        DWORD dwFlags,
+        SOURCE_TEXT_ATTR *pattr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetScriptletTextAttributes(
+        LPCOLESTR pstrCode,
+        ULONG uNumCodeChars,
+        LPCOLESTR pstrDelimiter,
+        DWORD dwFlags,
+        SOURCE_TEXT_ATTR *pattr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumCodeContextsOfPosition(
+        DWORDLONG dwSourceContext,
+        ULONG uCharacterOffset,
+        ULONG uNumChars,
+        IEnumDebugCodeContexts **ppescc) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IActiveScriptDebug64, 0xbc437e23, 0xf5b8, 0x47f4, 0xbb,0x79, 0x7d,0x1c,0xe5,0x48,0x3b,0x86)
+#endif
+#else
+typedef struct IActiveScriptDebug64Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IActiveScriptDebug64* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IActiveScriptDebug64* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IActiveScriptDebug64* This);
+
+    /*** IActiveScriptDebug64 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetScriptTextAttributes)(
+        IActiveScriptDebug64* This,
+        LPCOLESTR pstrCode,
+        ULONG uNumCodeChars,
+        LPCOLESTR pstrDelimiter,
+        DWORD dwFlags,
+        SOURCE_TEXT_ATTR *pattr);
+
+    HRESULT (STDMETHODCALLTYPE *GetScriptletTextAttributes)(
+        IActiveScriptDebug64* This,
+        LPCOLESTR pstrCode,
+        ULONG uNumCodeChars,
+        LPCOLESTR pstrDelimiter,
+        DWORD dwFlags,
+        SOURCE_TEXT_ATTR *pattr);
+
+    HRESULT (STDMETHODCALLTYPE *EnumCodeContextsOfPosition)(
+        IActiveScriptDebug64* This,
+        DWORDLONG dwSourceContext,
+        ULONG uCharacterOffset,
+        ULONG uNumChars,
+        IEnumDebugCodeContexts **ppescc);
+
+    END_INTERFACE
+} IActiveScriptDebug64Vtbl;
+interface IActiveScriptDebug64 {
+    CONST_VTBL IActiveScriptDebug64Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IActiveScriptDebug64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IActiveScriptDebug64_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IActiveScriptDebug64_Release(This) (This)->lpVtbl->Release(This)
+/*** IActiveScriptDebug64 methods ***/
+#define IActiveScriptDebug64_GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr) (This)->lpVtbl->GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
+#define IActiveScriptDebug64_GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr) (This)->lpVtbl->GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
+#define IActiveScriptDebug64_EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc) (This)->lpVtbl->EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IActiveScriptDebug64_QueryInterface(IActiveScriptDebug64* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IActiveScriptDebug64_AddRef(IActiveScriptDebug64* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IActiveScriptDebug64_Release(IActiveScriptDebug64* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IActiveScriptDebug64 methods ***/
+static FORCEINLINE HRESULT IActiveScriptDebug64_GetScriptTextAttributes(IActiveScriptDebug64* This,LPCOLESTR pstrCode,ULONG uNumCodeChars,LPCOLESTR pstrDelimiter,DWORD dwFlags,SOURCE_TEXT_ATTR *pattr) {
+    return This->lpVtbl->GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr);
+}
+static FORCEINLINE HRESULT IActiveScriptDebug64_GetScriptletTextAttributes(IActiveScriptDebug64* This,LPCOLESTR pstrCode,ULONG uNumCodeChars,LPCOLESTR pstrDelimiter,DWORD dwFlags,SOURCE_TEXT_ATTR *pattr) {
+    return This->lpVtbl->GetScriptletTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr);
+}
+static FORCEINLINE HRESULT IActiveScriptDebug64_EnumCodeContextsOfPosition(IActiveScriptDebug64* This,DWORDLONG dwSourceContext,ULONG uCharacterOffset,ULONG uNumChars,IEnumDebugCodeContexts **ppescc) {
+    return This->lpVtbl->EnumCodeContextsOfPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppescc);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IActiveScriptDebug64_GetScriptTextAttributes_Proxy(
+    IActiveScriptDebug64* This,
+    LPCOLESTR pstrCode,
+    ULONG uNumCodeChars,
+    LPCOLESTR pstrDelimiter,
+    DWORD dwFlags,
+    SOURCE_TEXT_ATTR *pattr);
+void __RPC_STUB IActiveScriptDebug64_GetScriptTextAttributes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptDebug64_GetScriptletTextAttributes_Proxy(
+    IActiveScriptDebug64* This,
+    LPCOLESTR pstrCode,
+    ULONG uNumCodeChars,
+    LPCOLESTR pstrDelimiter,
+    DWORD dwFlags,
+    SOURCE_TEXT_ATTR *pattr);
+void __RPC_STUB IActiveScriptDebug64_GetScriptletTextAttributes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptDebug64_EnumCodeContextsOfPosition_Proxy(
+    IActiveScriptDebug64* This,
+    DWORDLONG dwSourceContext,
+    ULONG uCharacterOffset,
+    ULONG uNumChars,
+    IEnumDebugCodeContexts **ppescc);
+void __RPC_STUB IActiveScriptDebug64_EnumCodeContextsOfPosition_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IActiveScriptDebug64_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IActiveScriptSiteDebug32 interface
+ */
+#ifndef __IActiveScriptSiteDebug32_INTERFACE_DEFINED__
+#define __IActiveScriptSiteDebug32_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IActiveScriptSiteDebug32, 0x51973c11, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c11-cb0c-11d0-b5c9-00a0244a0e7a")
+IActiveScriptSiteDebug32 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetDocumentContextFromPosition(
+        DWORD dwSourceContext,
+        ULONG uCharacterOffset,
+        ULONG uNumChars,
+        IDebugDocumentContext **ppsc) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetApplication(
+        IDebugApplication32 **ppda) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRootApplicationNode(
+        IDebugApplicationNode **ppdanRoot) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnScriptErrorDebug(
+        IActiveScriptErrorDebug *pErrorDebug,
+        WINBOOL *pfEnterDebugger,
+        WINBOOL *pfCallOnScriptErrorWhenContinuing) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IActiveScriptSiteDebug32, 0x51973c11, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IActiveScriptSiteDebug32Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IActiveScriptSiteDebug32* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IActiveScriptSiteDebug32* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IActiveScriptSiteDebug32* This);
+
+    /*** IActiveScriptSiteDebug32 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetDocumentContextFromPosition)(
+        IActiveScriptSiteDebug32* This,
+        DWORD dwSourceContext,
+        ULONG uCharacterOffset,
+        ULONG uNumChars,
+        IDebugDocumentContext **ppsc);
+
+    HRESULT (STDMETHODCALLTYPE *GetApplication)(
+        IActiveScriptSiteDebug32* This,
+        IDebugApplication32 **ppda);
+
+    HRESULT (STDMETHODCALLTYPE *GetRootApplicationNode)(
+        IActiveScriptSiteDebug32* This,
+        IDebugApplicationNode **ppdanRoot);
+
+    HRESULT (STDMETHODCALLTYPE *OnScriptErrorDebug)(
+        IActiveScriptSiteDebug32* This,
+        IActiveScriptErrorDebug *pErrorDebug,
+        WINBOOL *pfEnterDebugger,
+        WINBOOL *pfCallOnScriptErrorWhenContinuing);
+
+    END_INTERFACE
+} IActiveScriptSiteDebug32Vtbl;
+interface IActiveScriptSiteDebug32 {
+    CONST_VTBL IActiveScriptSiteDebug32Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IActiveScriptSiteDebug32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IActiveScriptSiteDebug32_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IActiveScriptSiteDebug32_Release(This) (This)->lpVtbl->Release(This)
+/*** IActiveScriptSiteDebug32 methods ***/
+#define IActiveScriptSiteDebug32_GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc) (This)->lpVtbl->GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc)
+#define IActiveScriptSiteDebug32_GetApplication(This,ppda) (This)->lpVtbl->GetApplication(This,ppda)
+#define IActiveScriptSiteDebug32_GetRootApplicationNode(This,ppdanRoot) (This)->lpVtbl->GetRootApplicationNode(This,ppdanRoot)
+#define IActiveScriptSiteDebug32_OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing) (This)->lpVtbl->OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IActiveScriptSiteDebug32_QueryInterface(IActiveScriptSiteDebug32* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IActiveScriptSiteDebug32_AddRef(IActiveScriptSiteDebug32* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IActiveScriptSiteDebug32_Release(IActiveScriptSiteDebug32* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IActiveScriptSiteDebug32 methods ***/
+static FORCEINLINE HRESULT IActiveScriptSiteDebug32_GetDocumentContextFromPosition(IActiveScriptSiteDebug32* This,DWORD dwSourceContext,ULONG uCharacterOffset,ULONG uNumChars,IDebugDocumentContext **ppsc) {
+    return This->lpVtbl->GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc);
+}
+static FORCEINLINE HRESULT IActiveScriptSiteDebug32_GetApplication(IActiveScriptSiteDebug32* This,IDebugApplication32 **ppda) {
+    return This->lpVtbl->GetApplication(This,ppda);
+}
+static FORCEINLINE HRESULT IActiveScriptSiteDebug32_GetRootApplicationNode(IActiveScriptSiteDebug32* This,IDebugApplicationNode **ppdanRoot) {
+    return This->lpVtbl->GetRootApplicationNode(This,ppdanRoot);
+}
+static FORCEINLINE HRESULT IActiveScriptSiteDebug32_OnScriptErrorDebug(IActiveScriptSiteDebug32* This,IActiveScriptErrorDebug *pErrorDebug,WINBOOL *pfEnterDebugger,WINBOOL *pfCallOnScriptErrorWhenContinuing) {
+    return This->lpVtbl->OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug32_GetDocumentContextFromPosition_Proxy(
+    IActiveScriptSiteDebug32* This,
+    DWORD dwSourceContext,
+    ULONG uCharacterOffset,
+    ULONG uNumChars,
+    IDebugDocumentContext **ppsc);
+void __RPC_STUB IActiveScriptSiteDebug32_GetDocumentContextFromPosition_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug32_GetApplication_Proxy(
+    IActiveScriptSiteDebug32* This,
+    IDebugApplication32 **ppda);
+void __RPC_STUB IActiveScriptSiteDebug32_GetApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug32_GetRootApplicationNode_Proxy(
+    IActiveScriptSiteDebug32* This,
+    IDebugApplicationNode **ppdanRoot);
+void __RPC_STUB IActiveScriptSiteDebug32_GetRootApplicationNode_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug32_OnScriptErrorDebug_Proxy(
+    IActiveScriptSiteDebug32* This,
+    IActiveScriptErrorDebug *pErrorDebug,
+    WINBOOL *pfEnterDebugger,
+    WINBOOL *pfCallOnScriptErrorWhenContinuing);
+void __RPC_STUB IActiveScriptSiteDebug32_OnScriptErrorDebug_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IActiveScriptSiteDebug32_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IActiveScriptSiteDebug64 interface
+ */
+#ifndef __IActiveScriptSiteDebug64_INTERFACE_DEFINED__
+#define __IActiveScriptSiteDebug64_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IActiveScriptSiteDebug64, 0xd6b96b0a, 0x7463, 0x402c, 0x92,0xac, 0x89,0x98,0x42,0x26,0x94,0x2f);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d6b96b0a-7463-402c-92ac-89984226942f")
+IActiveScriptSiteDebug64 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetDocumentContextFromPosition(
+        DWORDLONG dwSourceContext,
+        ULONG uCharacterOffset,
+        ULONG uNumChars,
+        IDebugDocumentContext **ppsc) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetApplication(
+        IDebugApplication64 **ppda) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRootApplicationNode(
+        IDebugApplicationNode **ppdanRoot) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnScriptErrorDebug(
+        IActiveScriptErrorDebug *pErrorDebug,
+        WINBOOL *pfEnterDebugger,
+        WINBOOL *pfCallOnScriptErrorWhenContinuing) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IActiveScriptSiteDebug64, 0xd6b96b0a, 0x7463, 0x402c, 0x92,0xac, 0x89,0x98,0x42,0x26,0x94,0x2f)
+#endif
+#else
+typedef struct IActiveScriptSiteDebug64Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IActiveScriptSiteDebug64* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IActiveScriptSiteDebug64* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IActiveScriptSiteDebug64* This);
+
+    /*** IActiveScriptSiteDebug64 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetDocumentContextFromPosition)(
+        IActiveScriptSiteDebug64* This,
+        DWORDLONG dwSourceContext,
+        ULONG uCharacterOffset,
+        ULONG uNumChars,
+        IDebugDocumentContext **ppsc);
+
+    HRESULT (STDMETHODCALLTYPE *GetApplication)(
+        IActiveScriptSiteDebug64* This,
+        IDebugApplication64 **ppda);
+
+    HRESULT (STDMETHODCALLTYPE *GetRootApplicationNode)(
+        IActiveScriptSiteDebug64* This,
+        IDebugApplicationNode **ppdanRoot);
+
+    HRESULT (STDMETHODCALLTYPE *OnScriptErrorDebug)(
+        IActiveScriptSiteDebug64* This,
+        IActiveScriptErrorDebug *pErrorDebug,
+        WINBOOL *pfEnterDebugger,
+        WINBOOL *pfCallOnScriptErrorWhenContinuing);
+
+    END_INTERFACE
+} IActiveScriptSiteDebug64Vtbl;
+interface IActiveScriptSiteDebug64 {
+    CONST_VTBL IActiveScriptSiteDebug64Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IActiveScriptSiteDebug64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IActiveScriptSiteDebug64_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IActiveScriptSiteDebug64_Release(This) (This)->lpVtbl->Release(This)
+/*** IActiveScriptSiteDebug64 methods ***/
+#define IActiveScriptSiteDebug64_GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc) (This)->lpVtbl->GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc)
+#define IActiveScriptSiteDebug64_GetApplication(This,ppda) (This)->lpVtbl->GetApplication(This,ppda)
+#define IActiveScriptSiteDebug64_GetRootApplicationNode(This,ppdanRoot) (This)->lpVtbl->GetRootApplicationNode(This,ppdanRoot)
+#define IActiveScriptSiteDebug64_OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing) (This)->lpVtbl->OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IActiveScriptSiteDebug64_QueryInterface(IActiveScriptSiteDebug64* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IActiveScriptSiteDebug64_AddRef(IActiveScriptSiteDebug64* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IActiveScriptSiteDebug64_Release(IActiveScriptSiteDebug64* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IActiveScriptSiteDebug64 methods ***/
+static FORCEINLINE HRESULT IActiveScriptSiteDebug64_GetDocumentContextFromPosition(IActiveScriptSiteDebug64* This,DWORDLONG dwSourceContext,ULONG uCharacterOffset,ULONG uNumChars,IDebugDocumentContext **ppsc) {
+    return This->lpVtbl->GetDocumentContextFromPosition(This,dwSourceContext,uCharacterOffset,uNumChars,ppsc);
+}
+static FORCEINLINE HRESULT IActiveScriptSiteDebug64_GetApplication(IActiveScriptSiteDebug64* This,IDebugApplication64 **ppda) {
+    return This->lpVtbl->GetApplication(This,ppda);
+}
+static FORCEINLINE HRESULT IActiveScriptSiteDebug64_GetRootApplicationNode(IActiveScriptSiteDebug64* This,IDebugApplicationNode **ppdanRoot) {
+    return This->lpVtbl->GetRootApplicationNode(This,ppdanRoot);
+}
+static FORCEINLINE HRESULT IActiveScriptSiteDebug64_OnScriptErrorDebug(IActiveScriptSiteDebug64* This,IActiveScriptErrorDebug *pErrorDebug,WINBOOL *pfEnterDebugger,WINBOOL *pfCallOnScriptErrorWhenContinuing) {
+    return This->lpVtbl->OnScriptErrorDebug(This,pErrorDebug,pfEnterDebugger,pfCallOnScriptErrorWhenContinuing);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug64_GetDocumentContextFromPosition_Proxy(
+    IActiveScriptSiteDebug64* This,
+    DWORDLONG dwSourceContext,
+    ULONG uCharacterOffset,
+    ULONG uNumChars,
+    IDebugDocumentContext **ppsc);
+void __RPC_STUB IActiveScriptSiteDebug64_GetDocumentContextFromPosition_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug64_GetApplication_Proxy(
+    IActiveScriptSiteDebug64* This,
+    IDebugApplication64 **ppda);
+void __RPC_STUB IActiveScriptSiteDebug64_GetApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug64_GetRootApplicationNode_Proxy(
+    IActiveScriptSiteDebug64* This,
+    IDebugApplicationNode **ppdanRoot);
+void __RPC_STUB IActiveScriptSiteDebug64_GetRootApplicationNode_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebug64_OnScriptErrorDebug_Proxy(
+    IActiveScriptSiteDebug64* This,
+    IActiveScriptErrorDebug *pErrorDebug,
+    WINBOOL *pfEnterDebugger,
+    WINBOOL *pfCallOnScriptErrorWhenContinuing);
+void __RPC_STUB IActiveScriptSiteDebug64_OnScriptErrorDebug_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IActiveScriptSiteDebug64_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IActiveScriptSiteDebugEx interface
+ */
+#ifndef __IActiveScriptSiteDebugEx_INTERFACE_DEFINED__
+#define __IActiveScriptSiteDebugEx_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IActiveScriptSiteDebugEx, 0xbb722ccb, 0x6ad2, 0x41c6, 0xb7,0x80, 0xaf,0x9c,0x03,0xee,0x69,0xf5);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("bb722ccb-6ad2-41c6-b780-af9c03ee69f5")
+IActiveScriptSiteDebugEx : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnCanNotJITScriptErrorDebug(
+        IActiveScriptErrorDebug *pErrorDebug,
+        WINBOOL *pfCallOnScriptErrorWhenContinuing) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IActiveScriptSiteDebugEx, 0xbb722ccb, 0x6ad2, 0x41c6, 0xb7,0x80, 0xaf,0x9c,0x03,0xee,0x69,0xf5)
+#endif
+#else
+typedef struct IActiveScriptSiteDebugExVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IActiveScriptSiteDebugEx* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IActiveScriptSiteDebugEx* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IActiveScriptSiteDebugEx* This);
+
+    /*** IActiveScriptSiteDebugEx methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnCanNotJITScriptErrorDebug)(
+        IActiveScriptSiteDebugEx* This,
+        IActiveScriptErrorDebug *pErrorDebug,
+        WINBOOL *pfCallOnScriptErrorWhenContinuing);
+
+    END_INTERFACE
+} IActiveScriptSiteDebugExVtbl;
+interface IActiveScriptSiteDebugEx {
+    CONST_VTBL IActiveScriptSiteDebugExVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IActiveScriptSiteDebugEx_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IActiveScriptSiteDebugEx_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IActiveScriptSiteDebugEx_Release(This) (This)->lpVtbl->Release(This)
+/*** IActiveScriptSiteDebugEx methods ***/
+#define IActiveScriptSiteDebugEx_OnCanNotJITScriptErrorDebug(This,pErrorDebug,pfCallOnScriptErrorWhenContinuing) (This)->lpVtbl->OnCanNotJITScriptErrorDebug(This,pErrorDebug,pfCallOnScriptErrorWhenContinuing)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IActiveScriptSiteDebugEx_QueryInterface(IActiveScriptSiteDebugEx* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IActiveScriptSiteDebugEx_AddRef(IActiveScriptSiteDebugEx* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IActiveScriptSiteDebugEx_Release(IActiveScriptSiteDebugEx* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IActiveScriptSiteDebugEx methods ***/
+static FORCEINLINE HRESULT IActiveScriptSiteDebugEx_OnCanNotJITScriptErrorDebug(IActiveScriptSiteDebugEx* This,IActiveScriptErrorDebug *pErrorDebug,WINBOOL *pfCallOnScriptErrorWhenContinuing) {
+    return This->lpVtbl->OnCanNotJITScriptErrorDebug(This,pErrorDebug,pfCallOnScriptErrorWhenContinuing);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IActiveScriptSiteDebugEx_OnCanNotJITScriptErrorDebug_Proxy(
+    IActiveScriptSiteDebugEx* This,
+    IActiveScriptErrorDebug *pErrorDebug,
+    WINBOOL *pfCallOnScriptErrorWhenContinuing);
+void __RPC_STUB IActiveScriptSiteDebugEx_OnCanNotJITScriptErrorDebug_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IActiveScriptSiteDebugEx_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IActiveScriptErrorDebug interface
+ */
+#ifndef __IActiveScriptErrorDebug_INTERFACE_DEFINED__
+#define __IActiveScriptErrorDebug_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IActiveScriptErrorDebug, 0x51973c12, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c12-cb0c-11d0-b5c9-00a0244a0e7a")
+IActiveScriptErrorDebug : public IActiveScriptError
+{
+    virtual HRESULT STDMETHODCALLTYPE GetDocumentContext(
+        IDebugDocumentContext **ppssc) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStackFrame(
+        IDebugStackFrame **ppdsf) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IActiveScriptErrorDebug, 0x51973c12, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IActiveScriptErrorDebugVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IActiveScriptErrorDebug* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IActiveScriptErrorDebug* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IActiveScriptErrorDebug* This);
+
+    /*** IActiveScriptError methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetExceptionInfo)(
+        IActiveScriptErrorDebug* This,
+        EXCEPINFO *pexcepinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetSourcePosition)(
+        IActiveScriptErrorDebug* This,
+        DWORD *pdwSourceContext,
+        ULONG *pulLineNumber,
+        LONG *plCharacterPosition);
+
+    HRESULT (STDMETHODCALLTYPE *GetSourceLineText)(
+        IActiveScriptErrorDebug* This,
+        BSTR *pbstrSourceLine);
+
+    /*** IActiveScriptErrorDebug methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetDocumentContext)(
+        IActiveScriptErrorDebug* This,
+        IDebugDocumentContext **ppssc);
+
+    HRESULT (STDMETHODCALLTYPE *GetStackFrame)(
+        IActiveScriptErrorDebug* This,
+        IDebugStackFrame **ppdsf);
+
+    END_INTERFACE
+} IActiveScriptErrorDebugVtbl;
+interface IActiveScriptErrorDebug {
+    CONST_VTBL IActiveScriptErrorDebugVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IActiveScriptErrorDebug_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IActiveScriptErrorDebug_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IActiveScriptErrorDebug_Release(This) (This)->lpVtbl->Release(This)
+/*** IActiveScriptError methods ***/
+#define IActiveScriptErrorDebug_GetExceptionInfo(This,pexcepinfo) (This)->lpVtbl->GetExceptionInfo(This,pexcepinfo)
+#define IActiveScriptErrorDebug_GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition) (This)->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition)
+#define IActiveScriptErrorDebug_GetSourceLineText(This,pbstrSourceLine) (This)->lpVtbl->GetSourceLineText(This,pbstrSourceLine)
+/*** IActiveScriptErrorDebug methods ***/
+#define IActiveScriptErrorDebug_GetDocumentContext(This,ppssc) (This)->lpVtbl->GetDocumentContext(This,ppssc)
+#define IActiveScriptErrorDebug_GetStackFrame(This,ppdsf) (This)->lpVtbl->GetStackFrame(This,ppdsf)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IActiveScriptErrorDebug_QueryInterface(IActiveScriptErrorDebug* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IActiveScriptErrorDebug_AddRef(IActiveScriptErrorDebug* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IActiveScriptErrorDebug_Release(IActiveScriptErrorDebug* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IActiveScriptError methods ***/
+static FORCEINLINE HRESULT IActiveScriptErrorDebug_GetExceptionInfo(IActiveScriptErrorDebug* This,EXCEPINFO *pexcepinfo) {
+    return This->lpVtbl->GetExceptionInfo(This,pexcepinfo);
+}
+static FORCEINLINE HRESULT IActiveScriptErrorDebug_GetSourcePosition(IActiveScriptErrorDebug* This,DWORD *pdwSourceContext,ULONG *pulLineNumber,LONG *plCharacterPosition) {
+    return This->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition);
+}
+static FORCEINLINE HRESULT IActiveScriptErrorDebug_GetSourceLineText(IActiveScriptErrorDebug* This,BSTR *pbstrSourceLine) {
+    return This->lpVtbl->GetSourceLineText(This,pbstrSourceLine);
+}
+/*** IActiveScriptErrorDebug methods ***/
+static FORCEINLINE HRESULT IActiveScriptErrorDebug_GetDocumentContext(IActiveScriptErrorDebug* This,IDebugDocumentContext **ppssc) {
+    return This->lpVtbl->GetDocumentContext(This,ppssc);
+}
+static FORCEINLINE HRESULT IActiveScriptErrorDebug_GetStackFrame(IActiveScriptErrorDebug* This,IDebugStackFrame **ppdsf) {
+    return This->lpVtbl->GetStackFrame(This,ppdsf);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IActiveScriptErrorDebug_GetDocumentContext_Proxy(
+    IActiveScriptErrorDebug* This,
+    IDebugDocumentContext **ppssc);
+void __RPC_STUB IActiveScriptErrorDebug_GetDocumentContext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptErrorDebug_GetStackFrame_Proxy(
+    IActiveScriptErrorDebug* This,
+    IDebugStackFrame **ppdsf);
+void __RPC_STUB IActiveScriptErrorDebug_GetStackFrame_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IActiveScriptErrorDebug_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugCodeContext interface
+ */
+#ifndef __IDebugCodeContext_INTERFACE_DEFINED__
+#define __IDebugCodeContext_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugCodeContext, 0x51973c13, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c13-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugCodeContext : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetDocumentContext(
+        IDebugDocumentContext **ppsc) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetBreakPoint(
+        BREAKPOINT_STATE bps) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugCodeContext, 0x51973c13, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugCodeContextVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugCodeContext* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugCodeContext* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugCodeContext* This);
+
+    /*** IDebugCodeContext methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetDocumentContext)(
+        IDebugCodeContext* This,
+        IDebugDocumentContext **ppsc);
+
+    HRESULT (STDMETHODCALLTYPE *SetBreakPoint)(
+        IDebugCodeContext* This,
+        BREAKPOINT_STATE bps);
+
+    END_INTERFACE
+} IDebugCodeContextVtbl;
+interface IDebugCodeContext {
+    CONST_VTBL IDebugCodeContextVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugCodeContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugCodeContext_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugCodeContext_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugCodeContext methods ***/
+#define IDebugCodeContext_GetDocumentContext(This,ppsc) (This)->lpVtbl->GetDocumentContext(This,ppsc)
+#define IDebugCodeContext_SetBreakPoint(This,bps) (This)->lpVtbl->SetBreakPoint(This,bps)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugCodeContext_QueryInterface(IDebugCodeContext* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugCodeContext_AddRef(IDebugCodeContext* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugCodeContext_Release(IDebugCodeContext* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugCodeContext methods ***/
+static FORCEINLINE HRESULT IDebugCodeContext_GetDocumentContext(IDebugCodeContext* This,IDebugDocumentContext **ppsc) {
+    return This->lpVtbl->GetDocumentContext(This,ppsc);
+}
+static FORCEINLINE HRESULT IDebugCodeContext_SetBreakPoint(IDebugCodeContext* This,BREAKPOINT_STATE bps) {
+    return This->lpVtbl->SetBreakPoint(This,bps);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugCodeContext_GetDocumentContext_Proxy(
+    IDebugCodeContext* This,
+    IDebugDocumentContext **ppsc);
+void __RPC_STUB IDebugCodeContext_GetDocumentContext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugCodeContext_SetBreakPoint_Proxy(
+    IDebugCodeContext* This,
+    BREAKPOINT_STATE bps);
+void __RPC_STUB IDebugCodeContext_SetBreakPoint_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugCodeContext_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugExpression interface
+ */
+#ifndef __IDebugExpression_INTERFACE_DEFINED__
+#define __IDebugExpression_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugExpression, 0x51973c14, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c14-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugExpression : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Start(
+        IDebugExpressionCallBack *pdecb) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Abort(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryIsComplete(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetResultAsString(
+        HRESULT *phrResult,
+        BSTR *pbstrResult) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetResultAsDebugProperty(
+        HRESULT *phrResult,
+        IDebugProperty **ppdp) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugExpression, 0x51973c14, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugExpressionVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugExpression* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugExpression* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugExpression* This);
+
+    /*** IDebugExpression methods ***/
+    HRESULT (STDMETHODCALLTYPE *Start)(
+        IDebugExpression* This,
+        IDebugExpressionCallBack *pdecb);
+
+    HRESULT (STDMETHODCALLTYPE *Abort)(
+        IDebugExpression* This);
+
+    HRESULT (STDMETHODCALLTYPE *QueryIsComplete)(
+        IDebugExpression* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetResultAsString)(
+        IDebugExpression* This,
+        HRESULT *phrResult,
+        BSTR *pbstrResult);
+
+    HRESULT (STDMETHODCALLTYPE *GetResultAsDebugProperty)(
+        IDebugExpression* This,
+        HRESULT *phrResult,
+        IDebugProperty **ppdp);
+
+    END_INTERFACE
+} IDebugExpressionVtbl;
+interface IDebugExpression {
+    CONST_VTBL IDebugExpressionVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugExpression_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugExpression_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugExpression_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugExpression methods ***/
+#define IDebugExpression_Start(This,pdecb) (This)->lpVtbl->Start(This,pdecb)
+#define IDebugExpression_Abort(This) (This)->lpVtbl->Abort(This)
+#define IDebugExpression_QueryIsComplete(This) (This)->lpVtbl->QueryIsComplete(This)
+#define IDebugExpression_GetResultAsString(This,phrResult,pbstrResult) (This)->lpVtbl->GetResultAsString(This,phrResult,pbstrResult)
+#define IDebugExpression_GetResultAsDebugProperty(This,phrResult,ppdp) (This)->lpVtbl->GetResultAsDebugProperty(This,phrResult,ppdp)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugExpression_QueryInterface(IDebugExpression* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugExpression_AddRef(IDebugExpression* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugExpression_Release(IDebugExpression* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugExpression methods ***/
+static FORCEINLINE HRESULT IDebugExpression_Start(IDebugExpression* This,IDebugExpressionCallBack *pdecb) {
+    return This->lpVtbl->Start(This,pdecb);
+}
+static FORCEINLINE HRESULT IDebugExpression_Abort(IDebugExpression* This) {
+    return This->lpVtbl->Abort(This);
+}
+static FORCEINLINE HRESULT IDebugExpression_QueryIsComplete(IDebugExpression* This) {
+    return This->lpVtbl->QueryIsComplete(This);
+}
+static FORCEINLINE HRESULT IDebugExpression_GetResultAsString(IDebugExpression* This,HRESULT *phrResult,BSTR *pbstrResult) {
+    return This->lpVtbl->GetResultAsString(This,phrResult,pbstrResult);
+}
+static FORCEINLINE HRESULT IDebugExpression_GetResultAsDebugProperty(IDebugExpression* This,HRESULT *phrResult,IDebugProperty **ppdp) {
+    return This->lpVtbl->GetResultAsDebugProperty(This,phrResult,ppdp);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugExpression_Start_Proxy(
+    IDebugExpression* This,
+    IDebugExpressionCallBack *pdecb);
+void __RPC_STUB IDebugExpression_Start_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugExpression_Abort_Proxy(
+    IDebugExpression* This);
+void __RPC_STUB IDebugExpression_Abort_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugExpression_QueryIsComplete_Proxy(
+    IDebugExpression* This);
+void __RPC_STUB IDebugExpression_QueryIsComplete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugExpression_GetResultAsString_Proxy(
+    IDebugExpression* This,
+    HRESULT *phrResult,
+    BSTR *pbstrResult);
+void __RPC_STUB IDebugExpression_GetResultAsString_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugExpression_GetResultAsDebugProperty_Proxy(
+    IDebugExpression* This,
+    HRESULT *phrResult,
+    IDebugProperty **ppdp);
+void __RPC_STUB IDebugExpression_GetResultAsDebugProperty_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugExpression_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugExpressionContext interface
+ */
+#ifndef __IDebugExpressionContext_INTERFACE_DEFINED__
+#define __IDebugExpressionContext_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugExpressionContext, 0x51973c15, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c15-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugExpressionContext : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE ParseLanguageText(
+        LPCOLESTR pstrCode,
+        UINT nRadix,
+        LPCOLESTR pstrDelimiter,
+        DWORD dwFlags,
+        IDebugExpression **ppe) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLanguageInfo(
+        BSTR *pbstrLanguageName,
+        GUID *pLanguageID) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugExpressionContext, 0x51973c15, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugExpressionContextVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugExpressionContext* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugExpressionContext* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugExpressionContext* This);
+
+    /*** IDebugExpressionContext methods ***/
+    HRESULT (STDMETHODCALLTYPE *ParseLanguageText)(
+        IDebugExpressionContext* This,
+        LPCOLESTR pstrCode,
+        UINT nRadix,
+        LPCOLESTR pstrDelimiter,
+        DWORD dwFlags,
+        IDebugExpression **ppe);
+
+    HRESULT (STDMETHODCALLTYPE *GetLanguageInfo)(
+        IDebugExpressionContext* This,
+        BSTR *pbstrLanguageName,
+        GUID *pLanguageID);
+
+    END_INTERFACE
+} IDebugExpressionContextVtbl;
+interface IDebugExpressionContext {
+    CONST_VTBL IDebugExpressionContextVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugExpressionContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugExpressionContext_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugExpressionContext_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugExpressionContext methods ***/
+#define IDebugExpressionContext_ParseLanguageText(This,pstrCode,nRadix,pstrDelimiter,dwFlags,ppe) (This)->lpVtbl->ParseLanguageText(This,pstrCode,nRadix,pstrDelimiter,dwFlags,ppe)
+#define IDebugExpressionContext_GetLanguageInfo(This,pbstrLanguageName,pLanguageID) (This)->lpVtbl->GetLanguageInfo(This,pbstrLanguageName,pLanguageID)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugExpressionContext_QueryInterface(IDebugExpressionContext* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugExpressionContext_AddRef(IDebugExpressionContext* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugExpressionContext_Release(IDebugExpressionContext* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugExpressionContext methods ***/
+static FORCEINLINE HRESULT IDebugExpressionContext_ParseLanguageText(IDebugExpressionContext* This,LPCOLESTR pstrCode,UINT nRadix,LPCOLESTR pstrDelimiter,DWORD dwFlags,IDebugExpression **ppe) {
+    return This->lpVtbl->ParseLanguageText(This,pstrCode,nRadix,pstrDelimiter,dwFlags,ppe);
+}
+static FORCEINLINE HRESULT IDebugExpressionContext_GetLanguageInfo(IDebugExpressionContext* This,BSTR *pbstrLanguageName,GUID *pLanguageID) {
+    return This->lpVtbl->GetLanguageInfo(This,pbstrLanguageName,pLanguageID);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugExpressionContext_ParseLanguageText_Proxy(
+    IDebugExpressionContext* This,
+    LPCOLESTR pstrCode,
+    UINT nRadix,
+    LPCOLESTR pstrDelimiter,
+    DWORD dwFlags,
+    IDebugExpression **ppe);
+void __RPC_STUB IDebugExpressionContext_ParseLanguageText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugExpressionContext_GetLanguageInfo_Proxy(
+    IDebugExpressionContext* This,
+    BSTR *pbstrLanguageName,
+    GUID *pLanguageID);
+void __RPC_STUB IDebugExpressionContext_GetLanguageInfo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugExpressionContext_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugExpressionCallBack interface
+ */
+#ifndef __IDebugExpressionCallBack_INTERFACE_DEFINED__
+#define __IDebugExpressionCallBack_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugExpressionCallBack, 0x51973c16, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c16-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugExpressionCallBack : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE onComplete(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugExpressionCallBack, 0x51973c16, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugExpressionCallBackVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugExpressionCallBack* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugExpressionCallBack* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugExpressionCallBack* This);
+
+    /*** IDebugExpressionCallBack methods ***/
+    HRESULT (STDMETHODCALLTYPE *onComplete)(
+        IDebugExpressionCallBack* This);
+
+    END_INTERFACE
+} IDebugExpressionCallBackVtbl;
+interface IDebugExpressionCallBack {
+    CONST_VTBL IDebugExpressionCallBackVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugExpressionCallBack_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugExpressionCallBack_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugExpressionCallBack_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugExpressionCallBack methods ***/
+#define IDebugExpressionCallBack_onComplete(This) (This)->lpVtbl->onComplete(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugExpressionCallBack_QueryInterface(IDebugExpressionCallBack* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugExpressionCallBack_AddRef(IDebugExpressionCallBack* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugExpressionCallBack_Release(IDebugExpressionCallBack* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugExpressionCallBack methods ***/
+static FORCEINLINE HRESULT IDebugExpressionCallBack_onComplete(IDebugExpressionCallBack* This) {
+    return This->lpVtbl->onComplete(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugExpressionCallBack_onComplete_Proxy(
+    IDebugExpressionCallBack* This);
+void __RPC_STUB IDebugExpressionCallBack_onComplete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugExpressionCallBack_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugStackFrame interface
+ */
+#ifndef __IDebugStackFrame_INTERFACE_DEFINED__
+#define __IDebugStackFrame_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugStackFrame, 0x51973c17, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c17-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugStackFrame : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetCodeContext(
+        IDebugCodeContext **ppcc) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDescriptionString(
+        WINBOOL fLong,
+        BSTR *pbstrDescription) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLanguageString(
+        WINBOOL fLong,
+        BSTR *pbstrLanguage) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetThread(
+        IDebugApplicationThread **ppat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDebugProperty(
+        IDebugProperty **ppDebugProp) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugStackFrame, 0x51973c17, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugStackFrameVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugStackFrame* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugStackFrame* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugStackFrame* This);
+
+    /*** IDebugStackFrame methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetCodeContext)(
+        IDebugStackFrame* This,
+        IDebugCodeContext **ppcc);
+
+    HRESULT (STDMETHODCALLTYPE *GetDescriptionString)(
+        IDebugStackFrame* This,
+        WINBOOL fLong,
+        BSTR *pbstrDescription);
+
+    HRESULT (STDMETHODCALLTYPE *GetLanguageString)(
+        IDebugStackFrame* This,
+        WINBOOL fLong,
+        BSTR *pbstrLanguage);
+
+    HRESULT (STDMETHODCALLTYPE *GetThread)(
+        IDebugStackFrame* This,
+        IDebugApplicationThread **ppat);
+
+    HRESULT (STDMETHODCALLTYPE *GetDebugProperty)(
+        IDebugStackFrame* This,
+        IDebugProperty **ppDebugProp);
+
+    END_INTERFACE
+} IDebugStackFrameVtbl;
+interface IDebugStackFrame {
+    CONST_VTBL IDebugStackFrameVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugStackFrame_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugStackFrame_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugStackFrame_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugStackFrame methods ***/
+#define IDebugStackFrame_GetCodeContext(This,ppcc) (This)->lpVtbl->GetCodeContext(This,ppcc)
+#define IDebugStackFrame_GetDescriptionString(This,fLong,pbstrDescription) (This)->lpVtbl->GetDescriptionString(This,fLong,pbstrDescription)
+#define IDebugStackFrame_GetLanguageString(This,fLong,pbstrLanguage) (This)->lpVtbl->GetLanguageString(This,fLong,pbstrLanguage)
+#define IDebugStackFrame_GetThread(This,ppat) (This)->lpVtbl->GetThread(This,ppat)
+#define IDebugStackFrame_GetDebugProperty(This,ppDebugProp) (This)->lpVtbl->GetDebugProperty(This,ppDebugProp)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugStackFrame_QueryInterface(IDebugStackFrame* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugStackFrame_AddRef(IDebugStackFrame* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugStackFrame_Release(IDebugStackFrame* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugStackFrame methods ***/
+static FORCEINLINE HRESULT IDebugStackFrame_GetCodeContext(IDebugStackFrame* This,IDebugCodeContext **ppcc) {
+    return This->lpVtbl->GetCodeContext(This,ppcc);
+}
+static FORCEINLINE HRESULT IDebugStackFrame_GetDescriptionString(IDebugStackFrame* This,WINBOOL fLong,BSTR *pbstrDescription) {
+    return This->lpVtbl->GetDescriptionString(This,fLong,pbstrDescription);
+}
+static FORCEINLINE HRESULT IDebugStackFrame_GetLanguageString(IDebugStackFrame* This,WINBOOL fLong,BSTR *pbstrLanguage) {
+    return This->lpVtbl->GetLanguageString(This,fLong,pbstrLanguage);
+}
+static FORCEINLINE HRESULT IDebugStackFrame_GetThread(IDebugStackFrame* This,IDebugApplicationThread **ppat) {
+    return This->lpVtbl->GetThread(This,ppat);
+}
+static FORCEINLINE HRESULT IDebugStackFrame_GetDebugProperty(IDebugStackFrame* This,IDebugProperty **ppDebugProp) {
+    return This->lpVtbl->GetDebugProperty(This,ppDebugProp);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetCodeContext_Proxy(
+    IDebugStackFrame* This,
+    IDebugCodeContext **ppcc);
+void __RPC_STUB IDebugStackFrame_GetCodeContext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetDescriptionString_Proxy(
+    IDebugStackFrame* This,
+    WINBOOL fLong,
+    BSTR *pbstrDescription);
+void __RPC_STUB IDebugStackFrame_GetDescriptionString_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetLanguageString_Proxy(
+    IDebugStackFrame* This,
+    WINBOOL fLong,
+    BSTR *pbstrLanguage);
+void __RPC_STUB IDebugStackFrame_GetLanguageString_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetThread_Proxy(
+    IDebugStackFrame* This,
+    IDebugApplicationThread **ppat);
+void __RPC_STUB IDebugStackFrame_GetThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugStackFrame_GetDebugProperty_Proxy(
+    IDebugStackFrame* This,
+    IDebugProperty **ppDebugProp);
+void __RPC_STUB IDebugStackFrame_GetDebugProperty_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugStackFrame_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugStackFrameSniffer interface
+ */
+#ifndef __IDebugStackFrameSniffer_INTERFACE_DEFINED__
+#define __IDebugStackFrameSniffer_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugStackFrameSniffer, 0x51973c18, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c18-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugStackFrameSniffer : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE EnumStackFrames(
+        IEnumDebugStackFrames **ppedsf) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugStackFrameSniffer, 0x51973c18, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugStackFrameSnifferVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugStackFrameSniffer* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugStackFrameSniffer* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugStackFrameSniffer* This);
+
+    /*** IDebugStackFrameSniffer methods ***/
+    HRESULT (STDMETHODCALLTYPE *EnumStackFrames)(
+        IDebugStackFrameSniffer* This,
+        IEnumDebugStackFrames **ppedsf);
+
+    END_INTERFACE
+} IDebugStackFrameSnifferVtbl;
+interface IDebugStackFrameSniffer {
+    CONST_VTBL IDebugStackFrameSnifferVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugStackFrameSniffer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugStackFrameSniffer_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugStackFrameSniffer_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugStackFrameSniffer methods ***/
+#define IDebugStackFrameSniffer_EnumStackFrames(This,ppedsf) (This)->lpVtbl->EnumStackFrames(This,ppedsf)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugStackFrameSniffer_QueryInterface(IDebugStackFrameSniffer* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugStackFrameSniffer_AddRef(IDebugStackFrameSniffer* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugStackFrameSniffer_Release(IDebugStackFrameSniffer* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugStackFrameSniffer methods ***/
+static FORCEINLINE HRESULT IDebugStackFrameSniffer_EnumStackFrames(IDebugStackFrameSniffer* This,IEnumDebugStackFrames **ppedsf) {
+    return This->lpVtbl->EnumStackFrames(This,ppedsf);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugStackFrameSniffer_EnumStackFrames_Proxy(
+    IDebugStackFrameSniffer* This,
+    IEnumDebugStackFrames **ppedsf);
+void __RPC_STUB IDebugStackFrameSniffer_EnumStackFrames_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugStackFrameSniffer_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugStackFrameSnifferEx32 interface
+ */
+#ifndef __IDebugStackFrameSnifferEx32_INTERFACE_DEFINED__
+#define __IDebugStackFrameSnifferEx32_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugStackFrameSnifferEx32, 0x51973c19, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c19-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugStackFrameSnifferEx32 : public IDebugStackFrameSniffer
+{
+    virtual HRESULT STDMETHODCALLTYPE EnumStackFramesEx32(
+        DWORD dwSpMin,
+        IEnumDebugStackFrames **ppedsf) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugStackFrameSnifferEx32, 0x51973c19, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugStackFrameSnifferEx32Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugStackFrameSnifferEx32* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugStackFrameSnifferEx32* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugStackFrameSnifferEx32* This);
+
+    /*** IDebugStackFrameSniffer methods ***/
+    HRESULT (STDMETHODCALLTYPE *EnumStackFrames)(
+        IDebugStackFrameSnifferEx32* This,
+        IEnumDebugStackFrames **ppedsf);
+
+    /*** IDebugStackFrameSnifferEx32 methods ***/
+    HRESULT (STDMETHODCALLTYPE *EnumStackFramesEx32)(
+        IDebugStackFrameSnifferEx32* This,
+        DWORD dwSpMin,
+        IEnumDebugStackFrames **ppedsf);
+
+    END_INTERFACE
+} IDebugStackFrameSnifferEx32Vtbl;
+interface IDebugStackFrameSnifferEx32 {
+    CONST_VTBL IDebugStackFrameSnifferEx32Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugStackFrameSnifferEx32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugStackFrameSnifferEx32_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugStackFrameSnifferEx32_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugStackFrameSniffer methods ***/
+#define IDebugStackFrameSnifferEx32_EnumStackFrames(This,ppedsf) (This)->lpVtbl->EnumStackFrames(This,ppedsf)
+/*** IDebugStackFrameSnifferEx32 methods ***/
+#define IDebugStackFrameSnifferEx32_EnumStackFramesEx32(This,dwSpMin,ppedsf) (This)->lpVtbl->EnumStackFramesEx32(This,dwSpMin,ppedsf)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugStackFrameSnifferEx32_QueryInterface(IDebugStackFrameSnifferEx32* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugStackFrameSnifferEx32_AddRef(IDebugStackFrameSnifferEx32* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugStackFrameSnifferEx32_Release(IDebugStackFrameSnifferEx32* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugStackFrameSniffer methods ***/
+static FORCEINLINE HRESULT IDebugStackFrameSnifferEx32_EnumStackFrames(IDebugStackFrameSnifferEx32* This,IEnumDebugStackFrames **ppedsf) {
+    return This->lpVtbl->EnumStackFrames(This,ppedsf);
+}
+/*** IDebugStackFrameSnifferEx32 methods ***/
+static FORCEINLINE HRESULT IDebugStackFrameSnifferEx32_EnumStackFramesEx32(IDebugStackFrameSnifferEx32* This,DWORD dwSpMin,IEnumDebugStackFrames **ppedsf) {
+    return This->lpVtbl->EnumStackFramesEx32(This,dwSpMin,ppedsf);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugStackFrameSnifferEx32_EnumStackFramesEx32_Proxy(
+    IDebugStackFrameSnifferEx32* This,
+    DWORD dwSpMin,
+    IEnumDebugStackFrames **ppedsf);
+void __RPC_STUB IDebugStackFrameSnifferEx32_EnumStackFramesEx32_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugStackFrameSnifferEx32_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugStackFrameSnifferEx64 interface
+ */
+#ifndef __IDebugStackFrameSnifferEx64_INTERFACE_DEFINED__
+#define __IDebugStackFrameSnifferEx64_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugStackFrameSnifferEx64, 0x8cd12af4, 0x49c1, 0x4d52, 0x8d,0x8a, 0xc1,0x46,0xf4,0x75,0x81,0xaa);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("8cd12af4-49c1-4d52-8d8a-c146f47581aa")
+IDebugStackFrameSnifferEx64 : public IDebugStackFrameSniffer
+{
+    virtual HRESULT STDMETHODCALLTYPE EnumStackFramesEx64(
+        DWORDLONG dwSpMin,
+        IEnumDebugStackFrames64 **ppedsf) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugStackFrameSnifferEx64, 0x8cd12af4, 0x49c1, 0x4d52, 0x8d,0x8a, 0xc1,0x46,0xf4,0x75,0x81,0xaa)
+#endif
+#else
+typedef struct IDebugStackFrameSnifferEx64Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugStackFrameSnifferEx64* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugStackFrameSnifferEx64* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugStackFrameSnifferEx64* This);
+
+    /*** IDebugStackFrameSniffer methods ***/
+    HRESULT (STDMETHODCALLTYPE *EnumStackFrames)(
+        IDebugStackFrameSnifferEx64* This,
+        IEnumDebugStackFrames **ppedsf);
+
+    /*** IDebugStackFrameSnifferEx64 methods ***/
+    HRESULT (STDMETHODCALLTYPE *EnumStackFramesEx64)(
+        IDebugStackFrameSnifferEx64* This,
+        DWORDLONG dwSpMin,
+        IEnumDebugStackFrames64 **ppedsf);
+
+    END_INTERFACE
+} IDebugStackFrameSnifferEx64Vtbl;
+interface IDebugStackFrameSnifferEx64 {
+    CONST_VTBL IDebugStackFrameSnifferEx64Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugStackFrameSnifferEx64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugStackFrameSnifferEx64_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugStackFrameSnifferEx64_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugStackFrameSniffer methods ***/
+#define IDebugStackFrameSnifferEx64_EnumStackFrames(This,ppedsf) (This)->lpVtbl->EnumStackFrames(This,ppedsf)
+/*** IDebugStackFrameSnifferEx64 methods ***/
+#define IDebugStackFrameSnifferEx64_EnumStackFramesEx64(This,dwSpMin,ppedsf) (This)->lpVtbl->EnumStackFramesEx64(This,dwSpMin,ppedsf)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugStackFrameSnifferEx64_QueryInterface(IDebugStackFrameSnifferEx64* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugStackFrameSnifferEx64_AddRef(IDebugStackFrameSnifferEx64* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugStackFrameSnifferEx64_Release(IDebugStackFrameSnifferEx64* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugStackFrameSniffer methods ***/
+static FORCEINLINE HRESULT IDebugStackFrameSnifferEx64_EnumStackFrames(IDebugStackFrameSnifferEx64* This,IEnumDebugStackFrames **ppedsf) {
+    return This->lpVtbl->EnumStackFrames(This,ppedsf);
+}
+/*** IDebugStackFrameSnifferEx64 methods ***/
+static FORCEINLINE HRESULT IDebugStackFrameSnifferEx64_EnumStackFramesEx64(IDebugStackFrameSnifferEx64* This,DWORDLONG dwSpMin,IEnumDebugStackFrames64 **ppedsf) {
+    return This->lpVtbl->EnumStackFramesEx64(This,dwSpMin,ppedsf);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugStackFrameSnifferEx64_EnumStackFramesEx64_Proxy(
+    IDebugStackFrameSnifferEx64* This,
+    DWORDLONG dwSpMin,
+    IEnumDebugStackFrames64 **ppedsf);
+void __RPC_STUB IDebugStackFrameSnifferEx64_EnumStackFramesEx64_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugStackFrameSnifferEx64_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugSyncOperation interface
+ */
+#ifndef __IDebugSyncOperation_INTERFACE_DEFINED__
+#define __IDebugSyncOperation_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugSyncOperation, 0x51973c1a, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c1a-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugSyncOperation : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetTargetThread(
+        IDebugApplicationThread **ppatTarget) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Execute(
+        IUnknown **ppunkResult) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE InProgressAbort(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugSyncOperation, 0x51973c1a, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugSyncOperationVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugSyncOperation* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugSyncOperation* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugSyncOperation* This);
+
+    /*** IDebugSyncOperation methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetTargetThread)(
+        IDebugSyncOperation* This,
+        IDebugApplicationThread **ppatTarget);
+
+    HRESULT (STDMETHODCALLTYPE *Execute)(
+        IDebugSyncOperation* This,
+        IUnknown **ppunkResult);
+
+    HRESULT (STDMETHODCALLTYPE *InProgressAbort)(
+        IDebugSyncOperation* This);
+
+    END_INTERFACE
+} IDebugSyncOperationVtbl;
+interface IDebugSyncOperation {
+    CONST_VTBL IDebugSyncOperationVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugSyncOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugSyncOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugSyncOperation_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugSyncOperation methods ***/
+#define IDebugSyncOperation_GetTargetThread(This,ppatTarget) (This)->lpVtbl->GetTargetThread(This,ppatTarget)
+#define IDebugSyncOperation_Execute(This,ppunkResult) (This)->lpVtbl->Execute(This,ppunkResult)
+#define IDebugSyncOperation_InProgressAbort(This) (This)->lpVtbl->InProgressAbort(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugSyncOperation_QueryInterface(IDebugSyncOperation* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugSyncOperation_AddRef(IDebugSyncOperation* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugSyncOperation_Release(IDebugSyncOperation* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugSyncOperation methods ***/
+static FORCEINLINE HRESULT IDebugSyncOperation_GetTargetThread(IDebugSyncOperation* This,IDebugApplicationThread **ppatTarget) {
+    return This->lpVtbl->GetTargetThread(This,ppatTarget);
+}
+static FORCEINLINE HRESULT IDebugSyncOperation_Execute(IDebugSyncOperation* This,IUnknown **ppunkResult) {
+    return This->lpVtbl->Execute(This,ppunkResult);
+}
+static FORCEINLINE HRESULT IDebugSyncOperation_InProgressAbort(IDebugSyncOperation* This) {
+    return This->lpVtbl->InProgressAbort(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugSyncOperation_GetTargetThread_Proxy(
+    IDebugSyncOperation* This,
+    IDebugApplicationThread **ppatTarget);
+void __RPC_STUB IDebugSyncOperation_GetTargetThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugSyncOperation_Execute_Proxy(
+    IDebugSyncOperation* This,
+    IUnknown **ppunkResult);
+void __RPC_STUB IDebugSyncOperation_Execute_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugSyncOperation_InProgressAbort_Proxy(
+    IDebugSyncOperation* This);
+void __RPC_STUB IDebugSyncOperation_InProgressAbort_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugSyncOperation_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugAsyncOperation interface
+ */
+#ifndef __IDebugAsyncOperation_INTERFACE_DEFINED__
+#define __IDebugAsyncOperation_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugAsyncOperation, 0x51973c1b, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c1b-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugAsyncOperation : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetSyncDebugOperation(
+        IDebugSyncOperation **ppsdo) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Start(
+        IDebugAsyncOperationCallBack *padocb) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Abort(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryIsComplete(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetResult(
+        HRESULT *phrResult,
+        IUnknown **ppunkResult) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugAsyncOperation, 0x51973c1b, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugAsyncOperationVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugAsyncOperation* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugAsyncOperation* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugAsyncOperation* This);
+
+    /*** IDebugAsyncOperation methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSyncDebugOperation)(
+        IDebugAsyncOperation* This,
+        IDebugSyncOperation **ppsdo);
+
+    HRESULT (STDMETHODCALLTYPE *Start)(
+        IDebugAsyncOperation* This,
+        IDebugAsyncOperationCallBack *padocb);
+
+    HRESULT (STDMETHODCALLTYPE *Abort)(
+        IDebugAsyncOperation* This);
+
+    HRESULT (STDMETHODCALLTYPE *QueryIsComplete)(
+        IDebugAsyncOperation* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetResult)(
+        IDebugAsyncOperation* This,
+        HRESULT *phrResult,
+        IUnknown **ppunkResult);
+
+    END_INTERFACE
+} IDebugAsyncOperationVtbl;
+interface IDebugAsyncOperation {
+    CONST_VTBL IDebugAsyncOperationVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugAsyncOperation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugAsyncOperation_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugAsyncOperation_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugAsyncOperation methods ***/
+#define IDebugAsyncOperation_GetSyncDebugOperation(This,ppsdo) (This)->lpVtbl->GetSyncDebugOperation(This,ppsdo)
+#define IDebugAsyncOperation_Start(This,padocb) (This)->lpVtbl->Start(This,padocb)
+#define IDebugAsyncOperation_Abort(This) (This)->lpVtbl->Abort(This)
+#define IDebugAsyncOperation_QueryIsComplete(This) (This)->lpVtbl->QueryIsComplete(This)
+#define IDebugAsyncOperation_GetResult(This,phrResult,ppunkResult) (This)->lpVtbl->GetResult(This,phrResult,ppunkResult)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugAsyncOperation_QueryInterface(IDebugAsyncOperation* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugAsyncOperation_AddRef(IDebugAsyncOperation* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugAsyncOperation_Release(IDebugAsyncOperation* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugAsyncOperation methods ***/
+static FORCEINLINE HRESULT IDebugAsyncOperation_GetSyncDebugOperation(IDebugAsyncOperation* This,IDebugSyncOperation **ppsdo) {
+    return This->lpVtbl->GetSyncDebugOperation(This,ppsdo);
+}
+static FORCEINLINE HRESULT IDebugAsyncOperation_Start(IDebugAsyncOperation* This,IDebugAsyncOperationCallBack *padocb) {
+    return This->lpVtbl->Start(This,padocb);
+}
+static FORCEINLINE HRESULT IDebugAsyncOperation_Abort(IDebugAsyncOperation* This) {
+    return This->lpVtbl->Abort(This);
+}
+static FORCEINLINE HRESULT IDebugAsyncOperation_QueryIsComplete(IDebugAsyncOperation* This) {
+    return This->lpVtbl->QueryIsComplete(This);
+}
+static FORCEINLINE HRESULT IDebugAsyncOperation_GetResult(IDebugAsyncOperation* This,HRESULT *phrResult,IUnknown **ppunkResult) {
+    return This->lpVtbl->GetResult(This,phrResult,ppunkResult);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_GetSyncDebugOperation_Proxy(
+    IDebugAsyncOperation* This,
+    IDebugSyncOperation **ppsdo);
+void __RPC_STUB IDebugAsyncOperation_GetSyncDebugOperation_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_Start_Proxy(
+    IDebugAsyncOperation* This,
+    IDebugAsyncOperationCallBack *padocb);
+void __RPC_STUB IDebugAsyncOperation_Start_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_Abort_Proxy(
+    IDebugAsyncOperation* This);
+void __RPC_STUB IDebugAsyncOperation_Abort_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_QueryIsComplete_Proxy(
+    IDebugAsyncOperation* This);
+void __RPC_STUB IDebugAsyncOperation_QueryIsComplete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugAsyncOperation_GetResult_Proxy(
+    IDebugAsyncOperation* This,
+    HRESULT *phrResult,
+    IUnknown **ppunkResult);
+void __RPC_STUB IDebugAsyncOperation_GetResult_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugAsyncOperation_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugAsyncOperationCallBack interface
+ */
+#ifndef __IDebugAsyncOperationCallBack_INTERFACE_DEFINED__
+#define __IDebugAsyncOperationCallBack_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugAsyncOperationCallBack, 0x51973c1c, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c1c-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugAsyncOperationCallBack : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE onComplete(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugAsyncOperationCallBack, 0x51973c1c, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugAsyncOperationCallBackVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugAsyncOperationCallBack* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugAsyncOperationCallBack* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugAsyncOperationCallBack* This);
+
+    /*** IDebugAsyncOperationCallBack methods ***/
+    HRESULT (STDMETHODCALLTYPE *onComplete)(
+        IDebugAsyncOperationCallBack* This);
+
+    END_INTERFACE
+} IDebugAsyncOperationCallBackVtbl;
+interface IDebugAsyncOperationCallBack {
+    CONST_VTBL IDebugAsyncOperationCallBackVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugAsyncOperationCallBack_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugAsyncOperationCallBack_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugAsyncOperationCallBack_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugAsyncOperationCallBack methods ***/
+#define IDebugAsyncOperationCallBack_onComplete(This) (This)->lpVtbl->onComplete(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugAsyncOperationCallBack_QueryInterface(IDebugAsyncOperationCallBack* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugAsyncOperationCallBack_AddRef(IDebugAsyncOperationCallBack* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugAsyncOperationCallBack_Release(IDebugAsyncOperationCallBack* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugAsyncOperationCallBack methods ***/
+static FORCEINLINE HRESULT IDebugAsyncOperationCallBack_onComplete(IDebugAsyncOperationCallBack* This) {
+    return This->lpVtbl->onComplete(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugAsyncOperationCallBack_onComplete_Proxy(
+    IDebugAsyncOperationCallBack* This);
+void __RPC_STUB IDebugAsyncOperationCallBack_onComplete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugAsyncOperationCallBack_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IEnumDebugCodeContexts interface
+ */
+#ifndef __IEnumDebugCodeContexts_INTERFACE_DEFINED__
+#define __IEnumDebugCodeContexts_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IEnumDebugCodeContexts, 0x51973c1d, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c1d-cb0c-11d0-b5c9-00a0244a0e7a")
+IEnumDebugCodeContexts : public IUnknown
+{
+    virtual HRESULT __stdcall Next(
+        ULONG celt,
+        IDebugCodeContext **pscc,
+        ULONG *pceltFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG celt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumDebugCodeContexts **ppescc) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IEnumDebugCodeContexts, 0x51973c1d, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IEnumDebugCodeContextsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumDebugCodeContexts* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumDebugCodeContexts* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumDebugCodeContexts* This);
+
+    /*** IEnumDebugCodeContexts methods ***/
+    HRESULT (__stdcall *Next)(
+        IEnumDebugCodeContexts* This,
+        ULONG celt,
+        IDebugCodeContext **pscc,
+        ULONG *pceltFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumDebugCodeContexts* This,
+        ULONG celt);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumDebugCodeContexts* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumDebugCodeContexts* This,
+        IEnumDebugCodeContexts **ppescc);
+
+    END_INTERFACE
+} IEnumDebugCodeContextsVtbl;
+interface IEnumDebugCodeContexts {
+    CONST_VTBL IEnumDebugCodeContextsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IEnumDebugCodeContexts_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IEnumDebugCodeContexts_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumDebugCodeContexts_Release(This) (This)->lpVtbl->Release(This)
+/*** IEnumDebugCodeContexts methods ***/
+#define IEnumDebugCodeContexts_Next(This,celt,pscc,pceltFetched) (This)->lpVtbl->Next(This,celt,pscc,pceltFetched)
+#define IEnumDebugCodeContexts_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumDebugCodeContexts_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumDebugCodeContexts_Clone(This,ppescc) (This)->lpVtbl->Clone(This,ppescc)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IEnumDebugCodeContexts_QueryInterface(IEnumDebugCodeContexts* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IEnumDebugCodeContexts_AddRef(IEnumDebugCodeContexts* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IEnumDebugCodeContexts_Release(IEnumDebugCodeContexts* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IEnumDebugCodeContexts methods ***/
+static FORCEINLINE HRESULT IEnumDebugCodeContexts_Next(IEnumDebugCodeContexts* This,ULONG celt,IDebugCodeContext **pscc,ULONG *pceltFetched) {
+    return This->lpVtbl->Next(This,celt,pscc,pceltFetched);
+}
+static FORCEINLINE HRESULT IEnumDebugCodeContexts_Skip(IEnumDebugCodeContexts* This,ULONG celt) {
+    return This->lpVtbl->Skip(This,celt);
+}
+static FORCEINLINE HRESULT IEnumDebugCodeContexts_Reset(IEnumDebugCodeContexts* This) {
+    return This->lpVtbl->Reset(This);
+}
+static FORCEINLINE HRESULT IEnumDebugCodeContexts_Clone(IEnumDebugCodeContexts* This,IEnumDebugCodeContexts **ppescc) {
+    return This->lpVtbl->Clone(This,ppescc);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT __stdcall IEnumDebugCodeContexts_RemoteNext_Proxy(
+    IEnumDebugCodeContexts* This,
+    ULONG celt,
+    IDebugCodeContext **pscc,
+    ULONG *pceltFetched);
+void __RPC_STUB IEnumDebugCodeContexts_RemoteNext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDebugCodeContexts_Skip_Proxy(
+    IEnumDebugCodeContexts* This,
+    ULONG celt);
+void __RPC_STUB IEnumDebugCodeContexts_Skip_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDebugCodeContexts_Reset_Proxy(
+    IEnumDebugCodeContexts* This);
+void __RPC_STUB IEnumDebugCodeContexts_Reset_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDebugCodeContexts_Clone_Proxy(
+    IEnumDebugCodeContexts* This,
+    IEnumDebugCodeContexts **ppescc);
+void __RPC_STUB IEnumDebugCodeContexts_Clone_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumDebugCodeContexts_Next_Proxy(
+    IEnumDebugCodeContexts* This,
+    ULONG celt,
+    IDebugCodeContext **pscc,
+    ULONG *pceltFetched);
+HRESULT __RPC_STUB IEnumDebugCodeContexts_Next_Stub(
+    IEnumDebugCodeContexts* This,
+    ULONG celt,
+    IDebugCodeContext **pscc,
+    ULONG *pceltFetched);
+
+#endif  /* __IEnumDebugCodeContexts_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IEnumDebugStackFrames interface
+ */
+#ifndef __IEnumDebugStackFrames_INTERFACE_DEFINED__
+#define __IEnumDebugStackFrames_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IEnumDebugStackFrames, 0x51973c1e, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c1e-cb0c-11d0-b5c9-00a0244a0e7a")
+IEnumDebugStackFrames : public IUnknown
+{
+    virtual HRESULT __stdcall Next(
+        ULONG celt,
+        DebugStackFrameDescriptor *prgdsfd,
+        ULONG *pceltFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG celt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumDebugStackFrames **ppedsf) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IEnumDebugStackFrames, 0x51973c1e, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IEnumDebugStackFramesVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumDebugStackFrames* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumDebugStackFrames* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumDebugStackFrames* This);
+
+    /*** IEnumDebugStackFrames methods ***/
+    HRESULT (__stdcall *Next)(
+        IEnumDebugStackFrames* This,
+        ULONG celt,
+        DebugStackFrameDescriptor *prgdsfd,
+        ULONG *pceltFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumDebugStackFrames* This,
+        ULONG celt);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumDebugStackFrames* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumDebugStackFrames* This,
+        IEnumDebugStackFrames **ppedsf);
+
+    END_INTERFACE
+} IEnumDebugStackFramesVtbl;
+interface IEnumDebugStackFrames {
+    CONST_VTBL IEnumDebugStackFramesVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IEnumDebugStackFrames_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IEnumDebugStackFrames_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumDebugStackFrames_Release(This) (This)->lpVtbl->Release(This)
+/*** IEnumDebugStackFrames methods ***/
+#define IEnumDebugStackFrames_Next(This,celt,prgdsfd,pceltFetched) (This)->lpVtbl->Next(This,celt,prgdsfd,pceltFetched)
+#define IEnumDebugStackFrames_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumDebugStackFrames_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumDebugStackFrames_Clone(This,ppedsf) (This)->lpVtbl->Clone(This,ppedsf)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IEnumDebugStackFrames_QueryInterface(IEnumDebugStackFrames* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IEnumDebugStackFrames_AddRef(IEnumDebugStackFrames* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IEnumDebugStackFrames_Release(IEnumDebugStackFrames* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IEnumDebugStackFrames methods ***/
+static FORCEINLINE HRESULT IEnumDebugStackFrames_Next(IEnumDebugStackFrames* This,ULONG celt,DebugStackFrameDescriptor *prgdsfd,ULONG *pceltFetched) {
+    return This->lpVtbl->Next(This,celt,prgdsfd,pceltFetched);
+}
+static FORCEINLINE HRESULT IEnumDebugStackFrames_Skip(IEnumDebugStackFrames* This,ULONG celt) {
+    return This->lpVtbl->Skip(This,celt);
+}
+static FORCEINLINE HRESULT IEnumDebugStackFrames_Reset(IEnumDebugStackFrames* This) {
+    return This->lpVtbl->Reset(This);
+}
+static FORCEINLINE HRESULT IEnumDebugStackFrames_Clone(IEnumDebugStackFrames* This,IEnumDebugStackFrames **ppedsf) {
+    return This->lpVtbl->Clone(This,ppedsf);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT __stdcall IEnumDebugStackFrames_RemoteNext_Proxy(
+    IEnumDebugStackFrames* This,
+    ULONG celt,
+    DebugStackFrameDescriptor *prgdsfd,
+    ULONG *pceltFetched);
+void __RPC_STUB IEnumDebugStackFrames_RemoteNext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDebugStackFrames_Skip_Proxy(
+    IEnumDebugStackFrames* This,
+    ULONG celt);
+void __RPC_STUB IEnumDebugStackFrames_Skip_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDebugStackFrames_Reset_Proxy(
+    IEnumDebugStackFrames* This);
+void __RPC_STUB IEnumDebugStackFrames_Reset_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDebugStackFrames_Clone_Proxy(
+    IEnumDebugStackFrames* This,
+    IEnumDebugStackFrames **ppedsf);
+void __RPC_STUB IEnumDebugStackFrames_Clone_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumDebugStackFrames_Next_Proxy(
+    IEnumDebugStackFrames* This,
+    ULONG celt,
+    DebugStackFrameDescriptor *prgdsfd,
+    ULONG *pceltFetched);
+HRESULT __RPC_STUB IEnumDebugStackFrames_Next_Stub(
+    IEnumDebugStackFrames* This,
+    ULONG celt,
+    DebugStackFrameDescriptor *prgdsfd,
+    ULONG *pceltFetched);
+
+#endif  /* __IEnumDebugStackFrames_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IEnumDebugStackFrames64 interface
+ */
+#ifndef __IEnumDebugStackFrames64_INTERFACE_DEFINED__
+#define __IEnumDebugStackFrames64_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IEnumDebugStackFrames64, 0x0dc38853, 0xc1b0, 0x4176, 0xa9,0x84, 0xb2,0x98,0x36,0x10,0x27,0xaf);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("0dc38853-c1b0-4176-a984-b298361027af")
+IEnumDebugStackFrames64 : public IEnumDebugStackFrames
+{
+    virtual HRESULT __stdcall Next64(
+        ULONG celt,
+        DebugStackFrameDescriptor64 *prgdsfd,
+        ULONG *pceltFetched) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IEnumDebugStackFrames64, 0x0dc38853, 0xc1b0, 0x4176, 0xa9,0x84, 0xb2,0x98,0x36,0x10,0x27,0xaf)
+#endif
+#else
+typedef struct IEnumDebugStackFrames64Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumDebugStackFrames64* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumDebugStackFrames64* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumDebugStackFrames64* This);
+
+    /*** IEnumDebugStackFrames methods ***/
+    HRESULT (__stdcall *Next)(
+        IEnumDebugStackFrames64* This,
+        ULONG celt,
+        DebugStackFrameDescriptor *prgdsfd,
+        ULONG *pceltFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumDebugStackFrames64* This,
+        ULONG celt);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumDebugStackFrames64* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumDebugStackFrames64* This,
+        IEnumDebugStackFrames **ppedsf);
+
+    /*** IEnumDebugStackFrames64 methods ***/
+    HRESULT (__stdcall *Next64)(
+        IEnumDebugStackFrames64* This,
+        ULONG celt,
+        DebugStackFrameDescriptor64 *prgdsfd,
+        ULONG *pceltFetched);
+
+    END_INTERFACE
+} IEnumDebugStackFrames64Vtbl;
+interface IEnumDebugStackFrames64 {
+    CONST_VTBL IEnumDebugStackFrames64Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IEnumDebugStackFrames64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IEnumDebugStackFrames64_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumDebugStackFrames64_Release(This) (This)->lpVtbl->Release(This)
+/*** IEnumDebugStackFrames methods ***/
+#define IEnumDebugStackFrames64_Next(This,celt,prgdsfd,pceltFetched) (This)->lpVtbl->Next(This,celt,prgdsfd,pceltFetched)
+#define IEnumDebugStackFrames64_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumDebugStackFrames64_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumDebugStackFrames64_Clone(This,ppedsf) (This)->lpVtbl->Clone(This,ppedsf)
+/*** IEnumDebugStackFrames64 methods ***/
+#define IEnumDebugStackFrames64_Next64(This,celt,prgdsfd,pceltFetched) (This)->lpVtbl->Next64(This,celt,prgdsfd,pceltFetched)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IEnumDebugStackFrames64_QueryInterface(IEnumDebugStackFrames64* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IEnumDebugStackFrames64_AddRef(IEnumDebugStackFrames64* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IEnumDebugStackFrames64_Release(IEnumDebugStackFrames64* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IEnumDebugStackFrames methods ***/
+static FORCEINLINE HRESULT IEnumDebugStackFrames64_Next(IEnumDebugStackFrames64* This,ULONG celt,DebugStackFrameDescriptor *prgdsfd,ULONG *pceltFetched) {
+    return This->lpVtbl->Next(This,celt,prgdsfd,pceltFetched);
+}
+static FORCEINLINE HRESULT IEnumDebugStackFrames64_Skip(IEnumDebugStackFrames64* This,ULONG celt) {
+    return This->lpVtbl->Skip(This,celt);
+}
+static FORCEINLINE HRESULT IEnumDebugStackFrames64_Reset(IEnumDebugStackFrames64* This) {
+    return This->lpVtbl->Reset(This);
+}
+static FORCEINLINE HRESULT IEnumDebugStackFrames64_Clone(IEnumDebugStackFrames64* This,IEnumDebugStackFrames **ppedsf) {
+    return This->lpVtbl->Clone(This,ppedsf);
+}
+/*** IEnumDebugStackFrames64 methods ***/
+static FORCEINLINE HRESULT IEnumDebugStackFrames64_Next64(IEnumDebugStackFrames64* This,ULONG celt,DebugStackFrameDescriptor64 *prgdsfd,ULONG *pceltFetched) {
+    return This->lpVtbl->Next64(This,celt,prgdsfd,pceltFetched);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT __stdcall IEnumDebugStackFrames64_RemoteNext64_Proxy(
+    IEnumDebugStackFrames64* This,
+    ULONG celt,
+    DebugStackFrameDescriptor64 *prgdsfd,
+    ULONG *pceltFetched);
+void __RPC_STUB IEnumDebugStackFrames64_RemoteNext64_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumDebugStackFrames64_Next64_Proxy(
+    IEnumDebugStackFrames64* This,
+    ULONG celt,
+    DebugStackFrameDescriptor64 *prgdsfd,
+    ULONG *pceltFetched);
+HRESULT __RPC_STUB IEnumDebugStackFrames64_Next64_Stub(
+    IEnumDebugStackFrames64* This,
+    ULONG celt,
+    DebugStackFrameDescriptor64 *prgdsfd,
+    ULONG *pceltFetched);
+
+#endif  /* __IEnumDebugStackFrames64_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugDocumentInfo interface
+ */
+#ifndef __IDebugDocumentInfo_INTERFACE_DEFINED__
+#define __IDebugDocumentInfo_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugDocumentInfo, 0x51973c1f, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c1f-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugDocumentInfo : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetName(
+        DOCUMENTNAMETYPE dnt,
+        BSTR *pbstrName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDocumentClassId(
+        CLSID *pclsidDocument) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugDocumentInfo, 0x51973c1f, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugDocumentInfoVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugDocumentInfo* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugDocumentInfo* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugDocumentInfo* This);
+
+    /*** IDebugDocumentInfo methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetName)(
+        IDebugDocumentInfo* This,
+        DOCUMENTNAMETYPE dnt,
+        BSTR *pbstrName);
+
+    HRESULT (STDMETHODCALLTYPE *GetDocumentClassId)(
+        IDebugDocumentInfo* This,
+        CLSID *pclsidDocument);
+
+    END_INTERFACE
+} IDebugDocumentInfoVtbl;
+interface IDebugDocumentInfo {
+    CONST_VTBL IDebugDocumentInfoVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugDocumentInfo_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugDocumentInfo_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugDocumentInfo_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugDocumentInfo methods ***/
+#define IDebugDocumentInfo_GetName(This,dnt,pbstrName) (This)->lpVtbl->GetName(This,dnt,pbstrName)
+#define IDebugDocumentInfo_GetDocumentClassId(This,pclsidDocument) (This)->lpVtbl->GetDocumentClassId(This,pclsidDocument)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugDocumentInfo_QueryInterface(IDebugDocumentInfo* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugDocumentInfo_AddRef(IDebugDocumentInfo* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugDocumentInfo_Release(IDebugDocumentInfo* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugDocumentInfo methods ***/
+static FORCEINLINE HRESULT IDebugDocumentInfo_GetName(IDebugDocumentInfo* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
+    return This->lpVtbl->GetName(This,dnt,pbstrName);
+}
+static FORCEINLINE HRESULT IDebugDocumentInfo_GetDocumentClassId(IDebugDocumentInfo* This,CLSID *pclsidDocument) {
+    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugDocumentInfo_GetName_Proxy(
+    IDebugDocumentInfo* This,
+    DOCUMENTNAMETYPE dnt,
+    BSTR *pbstrName);
+void __RPC_STUB IDebugDocumentInfo_GetName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentInfo_GetDocumentClassId_Proxy(
+    IDebugDocumentInfo* This,
+    CLSID *pclsidDocument);
+void __RPC_STUB IDebugDocumentInfo_GetDocumentClassId_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugDocumentInfo_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugDocumentProvider interface
+ */
+#ifndef __IDebugDocumentProvider_INTERFACE_DEFINED__
+#define __IDebugDocumentProvider_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugDocumentProvider, 0x51973c20, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c20-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugDocumentProvider : public IDebugDocumentInfo
+{
+    virtual HRESULT STDMETHODCALLTYPE GetDocument(
+        IDebugDocument **ppssd) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugDocumentProvider, 0x51973c20, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugDocumentProviderVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugDocumentProvider* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugDocumentProvider* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugDocumentProvider* This);
+
+    /*** IDebugDocumentInfo methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetName)(
+        IDebugDocumentProvider* This,
+        DOCUMENTNAMETYPE dnt,
+        BSTR *pbstrName);
+
+    HRESULT (STDMETHODCALLTYPE *GetDocumentClassId)(
+        IDebugDocumentProvider* This,
+        CLSID *pclsidDocument);
+
+    /*** IDebugDocumentProvider methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetDocument)(
+        IDebugDocumentProvider* This,
+        IDebugDocument **ppssd);
+
+    END_INTERFACE
+} IDebugDocumentProviderVtbl;
+interface IDebugDocumentProvider {
+    CONST_VTBL IDebugDocumentProviderVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugDocumentProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugDocumentProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugDocumentProvider_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugDocumentInfo methods ***/
+#define IDebugDocumentProvider_GetName(This,dnt,pbstrName) (This)->lpVtbl->GetName(This,dnt,pbstrName)
+#define IDebugDocumentProvider_GetDocumentClassId(This,pclsidDocument) (This)->lpVtbl->GetDocumentClassId(This,pclsidDocument)
+/*** IDebugDocumentProvider methods ***/
+#define IDebugDocumentProvider_GetDocument(This,ppssd) (This)->lpVtbl->GetDocument(This,ppssd)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugDocumentProvider_QueryInterface(IDebugDocumentProvider* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugDocumentProvider_AddRef(IDebugDocumentProvider* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugDocumentProvider_Release(IDebugDocumentProvider* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugDocumentInfo methods ***/
+static FORCEINLINE HRESULT IDebugDocumentProvider_GetName(IDebugDocumentProvider* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
+    return This->lpVtbl->GetName(This,dnt,pbstrName);
+}
+static FORCEINLINE HRESULT IDebugDocumentProvider_GetDocumentClassId(IDebugDocumentProvider* This,CLSID *pclsidDocument) {
+    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
+}
+/*** IDebugDocumentProvider methods ***/
+static FORCEINLINE HRESULT IDebugDocumentProvider_GetDocument(IDebugDocumentProvider* This,IDebugDocument **ppssd) {
+    return This->lpVtbl->GetDocument(This,ppssd);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugDocumentProvider_GetDocument_Proxy(
+    IDebugDocumentProvider* This,
+    IDebugDocument **ppssd);
+void __RPC_STUB IDebugDocumentProvider_GetDocument_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugDocumentProvider_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugDocument interface
+ */
+#ifndef __IDebugDocument_INTERFACE_DEFINED__
+#define __IDebugDocument_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugDocument, 0x51973c21, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c21-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugDocument : public IDebugDocumentInfo
+{
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugDocument, 0x51973c21, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugDocumentVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugDocument* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugDocument* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugDocument* This);
+
+    /*** IDebugDocumentInfo methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetName)(
+        IDebugDocument* This,
+        DOCUMENTNAMETYPE dnt,
+        BSTR *pbstrName);
+
+    HRESULT (STDMETHODCALLTYPE *GetDocumentClassId)(
+        IDebugDocument* This,
+        CLSID *pclsidDocument);
+
+    END_INTERFACE
+} IDebugDocumentVtbl;
+interface IDebugDocument {
+    CONST_VTBL IDebugDocumentVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugDocument_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugDocumentInfo methods ***/
+#define IDebugDocument_GetName(This,dnt,pbstrName) (This)->lpVtbl->GetName(This,dnt,pbstrName)
+#define IDebugDocument_GetDocumentClassId(This,pclsidDocument) (This)->lpVtbl->GetDocumentClassId(This,pclsidDocument)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugDocument_QueryInterface(IDebugDocument* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugDocument_AddRef(IDebugDocument* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugDocument_Release(IDebugDocument* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugDocumentInfo methods ***/
+static FORCEINLINE HRESULT IDebugDocument_GetName(IDebugDocument* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
+    return This->lpVtbl->GetName(This,dnt,pbstrName);
+}
+static FORCEINLINE HRESULT IDebugDocument_GetDocumentClassId(IDebugDocument* This,CLSID *pclsidDocument) {
+    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
+}
+#endif
+#endif
+
+#endif
+
+
+#endif  /* __IDebugDocument_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugDocumentText interface
+ */
+#ifndef __IDebugDocumentText_INTERFACE_DEFINED__
+#define __IDebugDocumentText_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugDocumentText, 0x51973c22, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c22-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugDocumentText : public IDebugDocument
+{
+    virtual HRESULT STDMETHODCALLTYPE GetDocumentAttributes(
+        TEXT_DOC_ATTR *ptextdocattr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSize(
+        ULONG *pcNumLines,
+        ULONG *pcNumChars) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPositionOfLine(
+        ULONG cLineNumber,
+        ULONG *pcCharacterPosition) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetLineOfPosition(
+        ULONG cCharacterPosition,
+        ULONG *pcLineNumber,
+        ULONG *pcCharacterOffsetInLine) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetText(
+        ULONG cCharacterPosition,
+        WCHAR *pcharText,
+        SOURCE_TEXT_ATTR *pstaTextAttr,
+        ULONG *pcNumChars,
+        ULONG cMaxChars) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPositionOfContext(
+        IDebugDocumentContext *psc,
+        ULONG *pcCharacterPosition,
+        ULONG *cNumChars) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetContextOfPosition(
+        ULONG cCharacterPosition,
+        ULONG cNumChars,
+        IDebugDocumentContext **ppsc) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugDocumentText, 0x51973c22, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugDocumentTextVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugDocumentText* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugDocumentText* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugDocumentText* This);
+
+    /*** IDebugDocumentInfo methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetName)(
+        IDebugDocumentText* This,
+        DOCUMENTNAMETYPE dnt,
+        BSTR *pbstrName);
+
+    HRESULT (STDMETHODCALLTYPE *GetDocumentClassId)(
+        IDebugDocumentText* This,
+        CLSID *pclsidDocument);
+
+    /*** IDebugDocumentText methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetDocumentAttributes)(
+        IDebugDocumentText* This,
+        TEXT_DOC_ATTR *ptextdocattr);
+
+    HRESULT (STDMETHODCALLTYPE *GetSize)(
+        IDebugDocumentText* This,
+        ULONG *pcNumLines,
+        ULONG *pcNumChars);
+
+    HRESULT (STDMETHODCALLTYPE *GetPositionOfLine)(
+        IDebugDocumentText* This,
+        ULONG cLineNumber,
+        ULONG *pcCharacterPosition);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineOfPosition)(
+        IDebugDocumentText* This,
+        ULONG cCharacterPosition,
+        ULONG *pcLineNumber,
+        ULONG *pcCharacterOffsetInLine);
+
+    HRESULT (STDMETHODCALLTYPE *GetText)(
+        IDebugDocumentText* This,
+        ULONG cCharacterPosition,
+        WCHAR *pcharText,
+        SOURCE_TEXT_ATTR *pstaTextAttr,
+        ULONG *pcNumChars,
+        ULONG cMaxChars);
+
+    HRESULT (STDMETHODCALLTYPE *GetPositionOfContext)(
+        IDebugDocumentText* This,
+        IDebugDocumentContext *psc,
+        ULONG *pcCharacterPosition,
+        ULONG *cNumChars);
+
+    HRESULT (STDMETHODCALLTYPE *GetContextOfPosition)(
+        IDebugDocumentText* This,
+        ULONG cCharacterPosition,
+        ULONG cNumChars,
+        IDebugDocumentContext **ppsc);
+
+    END_INTERFACE
+} IDebugDocumentTextVtbl;
+interface IDebugDocumentText {
+    CONST_VTBL IDebugDocumentTextVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugDocumentText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugDocumentText_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugDocumentText_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugDocumentInfo methods ***/
+#define IDebugDocumentText_GetName(This,dnt,pbstrName) (This)->lpVtbl->GetName(This,dnt,pbstrName)
+#define IDebugDocumentText_GetDocumentClassId(This,pclsidDocument) (This)->lpVtbl->GetDocumentClassId(This,pclsidDocument)
+/*** IDebugDocumentText methods ***/
+#define IDebugDocumentText_GetDocumentAttributes(This,ptextdocattr) (This)->lpVtbl->GetDocumentAttributes(This,ptextdocattr)
+#define IDebugDocumentText_GetSize(This,pcNumLines,pcNumChars) (This)->lpVtbl->GetSize(This,pcNumLines,pcNumChars)
+#define IDebugDocumentText_GetPositionOfLine(This,cLineNumber,pcCharacterPosition) (This)->lpVtbl->GetPositionOfLine(This,cLineNumber,pcCharacterPosition)
+#define IDebugDocumentText_GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine) (This)->lpVtbl->GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine)
+#define IDebugDocumentText_GetText(This,cCharacterPosition,pcharText,pstaTextAttr,pcNumChars,cMaxChars) (This)->lpVtbl->GetText(This,cCharacterPosition,pcharText,pstaTextAttr,pcNumChars,cMaxChars)
+#define IDebugDocumentText_GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars) (This)->lpVtbl->GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars)
+#define IDebugDocumentText_GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc) (This)->lpVtbl->GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugDocumentText_QueryInterface(IDebugDocumentText* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugDocumentText_AddRef(IDebugDocumentText* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugDocumentText_Release(IDebugDocumentText* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugDocumentInfo methods ***/
+static FORCEINLINE HRESULT IDebugDocumentText_GetName(IDebugDocumentText* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
+    return This->lpVtbl->GetName(This,dnt,pbstrName);
+}
+static FORCEINLINE HRESULT IDebugDocumentText_GetDocumentClassId(IDebugDocumentText* This,CLSID *pclsidDocument) {
+    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
+}
+/*** IDebugDocumentText methods ***/
+static FORCEINLINE HRESULT IDebugDocumentText_GetDocumentAttributes(IDebugDocumentText* This,TEXT_DOC_ATTR *ptextdocattr) {
+    return This->lpVtbl->GetDocumentAttributes(This,ptextdocattr);
+}
+static FORCEINLINE HRESULT IDebugDocumentText_GetSize(IDebugDocumentText* This,ULONG *pcNumLines,ULONG *pcNumChars) {
+    return This->lpVtbl->GetSize(This,pcNumLines,pcNumChars);
+}
+static FORCEINLINE HRESULT IDebugDocumentText_GetPositionOfLine(IDebugDocumentText* This,ULONG cLineNumber,ULONG *pcCharacterPosition) {
+    return This->lpVtbl->GetPositionOfLine(This,cLineNumber,pcCharacterPosition);
+}
+static FORCEINLINE HRESULT IDebugDocumentText_GetLineOfPosition(IDebugDocumentText* This,ULONG cCharacterPosition,ULONG *pcLineNumber,ULONG *pcCharacterOffsetInLine) {
+    return This->lpVtbl->GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine);
+}
+static FORCEINLINE HRESULT IDebugDocumentText_GetText(IDebugDocumentText* This,ULONG cCharacterPosition,WCHAR *pcharText,SOURCE_TEXT_ATTR *pstaTextAttr,ULONG *pcNumChars,ULONG cMaxChars) {
+    return This->lpVtbl->GetText(This,cCharacterPosition,pcharText,pstaTextAttr,pcNumChars,cMaxChars);
+}
+static FORCEINLINE HRESULT IDebugDocumentText_GetPositionOfContext(IDebugDocumentText* This,IDebugDocumentContext *psc,ULONG *pcCharacterPosition,ULONG *cNumChars) {
+    return This->lpVtbl->GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars);
+}
+static FORCEINLINE HRESULT IDebugDocumentText_GetContextOfPosition(IDebugDocumentText* This,ULONG cCharacterPosition,ULONG cNumChars,IDebugDocumentContext **ppsc) {
+    return This->lpVtbl->GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetDocumentAttributes_Proxy(
+    IDebugDocumentText* This,
+    TEXT_DOC_ATTR *ptextdocattr);
+void __RPC_STUB IDebugDocumentText_GetDocumentAttributes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetSize_Proxy(
+    IDebugDocumentText* This,
+    ULONG *pcNumLines,
+    ULONG *pcNumChars);
+void __RPC_STUB IDebugDocumentText_GetSize_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetPositionOfLine_Proxy(
+    IDebugDocumentText* This,
+    ULONG cLineNumber,
+    ULONG *pcCharacterPosition);
+void __RPC_STUB IDebugDocumentText_GetPositionOfLine_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetLineOfPosition_Proxy(
+    IDebugDocumentText* This,
+    ULONG cCharacterPosition,
+    ULONG *pcLineNumber,
+    ULONG *pcCharacterOffsetInLine);
+void __RPC_STUB IDebugDocumentText_GetLineOfPosition_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetText_Proxy(
+    IDebugDocumentText* This,
+    ULONG cCharacterPosition,
+    WCHAR *pcharText,
+    SOURCE_TEXT_ATTR *pstaTextAttr,
+    ULONG *pcNumChars,
+    ULONG cMaxChars);
+void __RPC_STUB IDebugDocumentText_GetText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetPositionOfContext_Proxy(
+    IDebugDocumentText* This,
+    IDebugDocumentContext *psc,
+    ULONG *pcCharacterPosition,
+    ULONG *cNumChars);
+void __RPC_STUB IDebugDocumentText_GetPositionOfContext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentText_GetContextOfPosition_Proxy(
+    IDebugDocumentText* This,
+    ULONG cCharacterPosition,
+    ULONG cNumChars,
+    IDebugDocumentContext **ppsc);
+void __RPC_STUB IDebugDocumentText_GetContextOfPosition_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugDocumentText_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugDocumentTextEvents interface
+ */
+#ifndef __IDebugDocumentTextEvents_INTERFACE_DEFINED__
+#define __IDebugDocumentTextEvents_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugDocumentTextEvents, 0x51973c23, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c23-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugDocumentTextEvents : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE onDestroy(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onInsertText(
+        ULONG cCharacterPosition,
+        ULONG cNumToInsert) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onRemoveText(
+        ULONG cCharacterPosition,
+        ULONG cNumToRemove) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onReplaceText(
+        ULONG cCharacterPosition,
+        ULONG cNumToReplace) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onUpdateTextAttributes(
+        ULONG cCharacterPosition,
+        ULONG cNumToUpdate) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onUpdateDocumentAttributes(
+        TEXT_DOC_ATTR textdocattr) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugDocumentTextEvents, 0x51973c23, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugDocumentTextEventsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugDocumentTextEvents* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugDocumentTextEvents* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugDocumentTextEvents* This);
+
+    /*** IDebugDocumentTextEvents methods ***/
+    HRESULT (STDMETHODCALLTYPE *onDestroy)(
+        IDebugDocumentTextEvents* This);
+
+    HRESULT (STDMETHODCALLTYPE *onInsertText)(
+        IDebugDocumentTextEvents* This,
+        ULONG cCharacterPosition,
+        ULONG cNumToInsert);
+
+    HRESULT (STDMETHODCALLTYPE *onRemoveText)(
+        IDebugDocumentTextEvents* This,
+        ULONG cCharacterPosition,
+        ULONG cNumToRemove);
+
+    HRESULT (STDMETHODCALLTYPE *onReplaceText)(
+        IDebugDocumentTextEvents* This,
+        ULONG cCharacterPosition,
+        ULONG cNumToReplace);
+
+    HRESULT (STDMETHODCALLTYPE *onUpdateTextAttributes)(
+        IDebugDocumentTextEvents* This,
+        ULONG cCharacterPosition,
+        ULONG cNumToUpdate);
+
+    HRESULT (STDMETHODCALLTYPE *onUpdateDocumentAttributes)(
+        IDebugDocumentTextEvents* This,
+        TEXT_DOC_ATTR textdocattr);
+
+    END_INTERFACE
+} IDebugDocumentTextEventsVtbl;
+interface IDebugDocumentTextEvents {
+    CONST_VTBL IDebugDocumentTextEventsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugDocumentTextEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugDocumentTextEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugDocumentTextEvents_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugDocumentTextEvents methods ***/
+#define IDebugDocumentTextEvents_onDestroy(This) (This)->lpVtbl->onDestroy(This)
+#define IDebugDocumentTextEvents_onInsertText(This,cCharacterPosition,cNumToInsert) (This)->lpVtbl->onInsertText(This,cCharacterPosition,cNumToInsert)
+#define IDebugDocumentTextEvents_onRemoveText(This,cCharacterPosition,cNumToRemove) (This)->lpVtbl->onRemoveText(This,cCharacterPosition,cNumToRemove)
+#define IDebugDocumentTextEvents_onReplaceText(This,cCharacterPosition,cNumToReplace) (This)->lpVtbl->onReplaceText(This,cCharacterPosition,cNumToReplace)
+#define IDebugDocumentTextEvents_onUpdateTextAttributes(This,cCharacterPosition,cNumToUpdate) (This)->lpVtbl->onUpdateTextAttributes(This,cCharacterPosition,cNumToUpdate)
+#define IDebugDocumentTextEvents_onUpdateDocumentAttributes(This,textdocattr) (This)->lpVtbl->onUpdateDocumentAttributes(This,textdocattr)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugDocumentTextEvents_QueryInterface(IDebugDocumentTextEvents* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugDocumentTextEvents_AddRef(IDebugDocumentTextEvents* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugDocumentTextEvents_Release(IDebugDocumentTextEvents* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugDocumentTextEvents methods ***/
+static FORCEINLINE HRESULT IDebugDocumentTextEvents_onDestroy(IDebugDocumentTextEvents* This) {
+    return This->lpVtbl->onDestroy(This);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextEvents_onInsertText(IDebugDocumentTextEvents* This,ULONG cCharacterPosition,ULONG cNumToInsert) {
+    return This->lpVtbl->onInsertText(This,cCharacterPosition,cNumToInsert);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextEvents_onRemoveText(IDebugDocumentTextEvents* This,ULONG cCharacterPosition,ULONG cNumToRemove) {
+    return This->lpVtbl->onRemoveText(This,cCharacterPosition,cNumToRemove);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextEvents_onReplaceText(IDebugDocumentTextEvents* This,ULONG cCharacterPosition,ULONG cNumToReplace) {
+    return This->lpVtbl->onReplaceText(This,cCharacterPosition,cNumToReplace);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextEvents_onUpdateTextAttributes(IDebugDocumentTextEvents* This,ULONG cCharacterPosition,ULONG cNumToUpdate) {
+    return This->lpVtbl->onUpdateTextAttributes(This,cCharacterPosition,cNumToUpdate);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextEvents_onUpdateDocumentAttributes(IDebugDocumentTextEvents* This,TEXT_DOC_ATTR textdocattr) {
+    return This->lpVtbl->onUpdateDocumentAttributes(This,textdocattr);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onDestroy_Proxy(
+    IDebugDocumentTextEvents* This);
+void __RPC_STUB IDebugDocumentTextEvents_onDestroy_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onInsertText_Proxy(
+    IDebugDocumentTextEvents* This,
+    ULONG cCharacterPosition,
+    ULONG cNumToInsert);
+void __RPC_STUB IDebugDocumentTextEvents_onInsertText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onRemoveText_Proxy(
+    IDebugDocumentTextEvents* This,
+    ULONG cCharacterPosition,
+    ULONG cNumToRemove);
+void __RPC_STUB IDebugDocumentTextEvents_onRemoveText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onReplaceText_Proxy(
+    IDebugDocumentTextEvents* This,
+    ULONG cCharacterPosition,
+    ULONG cNumToReplace);
+void __RPC_STUB IDebugDocumentTextEvents_onReplaceText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onUpdateTextAttributes_Proxy(
+    IDebugDocumentTextEvents* This,
+    ULONG cCharacterPosition,
+    ULONG cNumToUpdate);
+void __RPC_STUB IDebugDocumentTextEvents_onUpdateTextAttributes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentTextEvents_onUpdateDocumentAttributes_Proxy(
+    IDebugDocumentTextEvents* This,
+    TEXT_DOC_ATTR textdocattr);
+void __RPC_STUB IDebugDocumentTextEvents_onUpdateDocumentAttributes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugDocumentTextEvents_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugDocumentTextAuthor interface
+ */
+#ifndef __IDebugDocumentTextAuthor_INTERFACE_DEFINED__
+#define __IDebugDocumentTextAuthor_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugDocumentTextAuthor, 0x51973c24, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c24-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugDocumentTextAuthor : public IDebugDocumentText
+{
+    virtual HRESULT STDMETHODCALLTYPE InsertText(
+        ULONG cCharacterPosition,
+        ULONG cNumToInsert,
+        OLECHAR pcharText[]) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveText(
+        ULONG cCharacterPosition,
+        ULONG cNumToRemove) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ReplaceText(
+        ULONG cCharacterPosition,
+        ULONG cNumToReplace,
+        OLECHAR pcharText[]) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugDocumentTextAuthor, 0x51973c24, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugDocumentTextAuthorVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugDocumentTextAuthor* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugDocumentTextAuthor* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugDocumentTextAuthor* This);
+
+    /*** IDebugDocumentInfo methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetName)(
+        IDebugDocumentTextAuthor* This,
+        DOCUMENTNAMETYPE dnt,
+        BSTR *pbstrName);
+
+    HRESULT (STDMETHODCALLTYPE *GetDocumentClassId)(
+        IDebugDocumentTextAuthor* This,
+        CLSID *pclsidDocument);
+
+    /*** IDebugDocumentText methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetDocumentAttributes)(
+        IDebugDocumentTextAuthor* This,
+        TEXT_DOC_ATTR *ptextdocattr);
+
+    HRESULT (STDMETHODCALLTYPE *GetSize)(
+        IDebugDocumentTextAuthor* This,
+        ULONG *pcNumLines,
+        ULONG *pcNumChars);
+
+    HRESULT (STDMETHODCALLTYPE *GetPositionOfLine)(
+        IDebugDocumentTextAuthor* This,
+        ULONG cLineNumber,
+        ULONG *pcCharacterPosition);
+
+    HRESULT (STDMETHODCALLTYPE *GetLineOfPosition)(
+        IDebugDocumentTextAuthor* This,
+        ULONG cCharacterPosition,
+        ULONG *pcLineNumber,
+        ULONG *pcCharacterOffsetInLine);
+
+    HRESULT (STDMETHODCALLTYPE *GetText)(
+        IDebugDocumentTextAuthor* This,
+        ULONG cCharacterPosition,
+        WCHAR *pcharText,
+        SOURCE_TEXT_ATTR *pstaTextAttr,
+        ULONG *pcNumChars,
+        ULONG cMaxChars);
+
+    HRESULT (STDMETHODCALLTYPE *GetPositionOfContext)(
+        IDebugDocumentTextAuthor* This,
+        IDebugDocumentContext *psc,
+        ULONG *pcCharacterPosition,
+        ULONG *cNumChars);
+
+    HRESULT (STDMETHODCALLTYPE *GetContextOfPosition)(
+        IDebugDocumentTextAuthor* This,
+        ULONG cCharacterPosition,
+        ULONG cNumChars,
+        IDebugDocumentContext **ppsc);
+
+    /*** IDebugDocumentTextAuthor methods ***/
+    HRESULT (STDMETHODCALLTYPE *InsertText)(
+        IDebugDocumentTextAuthor* This,
+        ULONG cCharacterPosition,
+        ULONG cNumToInsert,
+        OLECHAR pcharText[]);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveText)(
+        IDebugDocumentTextAuthor* This,
+        ULONG cCharacterPosition,
+        ULONG cNumToRemove);
+
+    HRESULT (STDMETHODCALLTYPE *ReplaceText)(
+        IDebugDocumentTextAuthor* This,
+        ULONG cCharacterPosition,
+        ULONG cNumToReplace,
+        OLECHAR pcharText[]);
+
+    END_INTERFACE
+} IDebugDocumentTextAuthorVtbl;
+interface IDebugDocumentTextAuthor {
+    CONST_VTBL IDebugDocumentTextAuthorVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugDocumentTextAuthor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugDocumentTextAuthor_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugDocumentTextAuthor_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugDocumentInfo methods ***/
+#define IDebugDocumentTextAuthor_GetName(This,dnt,pbstrName) (This)->lpVtbl->GetName(This,dnt,pbstrName)
+#define IDebugDocumentTextAuthor_GetDocumentClassId(This,pclsidDocument) (This)->lpVtbl->GetDocumentClassId(This,pclsidDocument)
+/*** IDebugDocumentText methods ***/
+#define IDebugDocumentTextAuthor_GetDocumentAttributes(This,ptextdocattr) (This)->lpVtbl->GetDocumentAttributes(This,ptextdocattr)
+#define IDebugDocumentTextAuthor_GetSize(This,pcNumLines,pcNumChars) (This)->lpVtbl->GetSize(This,pcNumLines,pcNumChars)
+#define IDebugDocumentTextAuthor_GetPositionOfLine(This,cLineNumber,pcCharacterPosition) (This)->lpVtbl->GetPositionOfLine(This,cLineNumber,pcCharacterPosition)
+#define IDebugDocumentTextAuthor_GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine) (This)->lpVtbl->GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine)
+#define IDebugDocumentTextAuthor_GetText(This,cCharacterPosition,pcharText,pstaTextAttr,pcNumChars,cMaxChars) (This)->lpVtbl->GetText(This,cCharacterPosition,pcharText,pstaTextAttr,pcNumChars,cMaxChars)
+#define IDebugDocumentTextAuthor_GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars) (This)->lpVtbl->GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars)
+#define IDebugDocumentTextAuthor_GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc) (This)->lpVtbl->GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc)
+/*** IDebugDocumentTextAuthor methods ***/
+#define IDebugDocumentTextAuthor_InsertText(This,cCharacterPosition,cNumToInsert,pcharText) (This)->lpVtbl->InsertText(This,cCharacterPosition,cNumToInsert,pcharText)
+#define IDebugDocumentTextAuthor_RemoveText(This,cCharacterPosition,cNumToRemove) (This)->lpVtbl->RemoveText(This,cCharacterPosition,cNumToRemove)
+#define IDebugDocumentTextAuthor_ReplaceText(This,cCharacterPosition,cNumToReplace,pcharText) (This)->lpVtbl->ReplaceText(This,cCharacterPosition,cNumToReplace,pcharText)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_QueryInterface(IDebugDocumentTextAuthor* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugDocumentTextAuthor_AddRef(IDebugDocumentTextAuthor* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugDocumentTextAuthor_Release(IDebugDocumentTextAuthor* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugDocumentInfo methods ***/
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetName(IDebugDocumentTextAuthor* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
+    return This->lpVtbl->GetName(This,dnt,pbstrName);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetDocumentClassId(IDebugDocumentTextAuthor* This,CLSID *pclsidDocument) {
+    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
+}
+/*** IDebugDocumentText methods ***/
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetDocumentAttributes(IDebugDocumentTextAuthor* This,TEXT_DOC_ATTR *ptextdocattr) {
+    return This->lpVtbl->GetDocumentAttributes(This,ptextdocattr);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetSize(IDebugDocumentTextAuthor* This,ULONG *pcNumLines,ULONG *pcNumChars) {
+    return This->lpVtbl->GetSize(This,pcNumLines,pcNumChars);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetPositionOfLine(IDebugDocumentTextAuthor* This,ULONG cLineNumber,ULONG *pcCharacterPosition) {
+    return This->lpVtbl->GetPositionOfLine(This,cLineNumber,pcCharacterPosition);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetLineOfPosition(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG *pcLineNumber,ULONG *pcCharacterOffsetInLine) {
+    return This->lpVtbl->GetLineOfPosition(This,cCharacterPosition,pcLineNumber,pcCharacterOffsetInLine);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetText(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,WCHAR *pcharText,SOURCE_TEXT_ATTR *pstaTextAttr,ULONG *pcNumChars,ULONG cMaxChars) {
+    return This->lpVtbl->GetText(This,cCharacterPosition,pcharText,pstaTextAttr,pcNumChars,cMaxChars);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetPositionOfContext(IDebugDocumentTextAuthor* This,IDebugDocumentContext *psc,ULONG *pcCharacterPosition,ULONG *cNumChars) {
+    return This->lpVtbl->GetPositionOfContext(This,psc,pcCharacterPosition,cNumChars);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_GetContextOfPosition(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG cNumChars,IDebugDocumentContext **ppsc) {
+    return This->lpVtbl->GetContextOfPosition(This,cCharacterPosition,cNumChars,ppsc);
+}
+/*** IDebugDocumentTextAuthor methods ***/
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_InsertText(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG cNumToInsert,OLECHAR pcharText[]) {
+    return This->lpVtbl->InsertText(This,cCharacterPosition,cNumToInsert,pcharText);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_RemoveText(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG cNumToRemove) {
+    return This->lpVtbl->RemoveText(This,cCharacterPosition,cNumToRemove);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextAuthor_ReplaceText(IDebugDocumentTextAuthor* This,ULONG cCharacterPosition,ULONG cNumToReplace,OLECHAR pcharText[]) {
+    return This->lpVtbl->ReplaceText(This,cCharacterPosition,cNumToReplace,pcharText);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugDocumentTextAuthor_InsertText_Proxy(
+    IDebugDocumentTextAuthor* This,
+    ULONG cCharacterPosition,
+    ULONG cNumToInsert,
+    OLECHAR pcharText[]);
+void __RPC_STUB IDebugDocumentTextAuthor_InsertText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentTextAuthor_RemoveText_Proxy(
+    IDebugDocumentTextAuthor* This,
+    ULONG cCharacterPosition,
+    ULONG cNumToRemove);
+void __RPC_STUB IDebugDocumentTextAuthor_RemoveText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentTextAuthor_ReplaceText_Proxy(
+    IDebugDocumentTextAuthor* This,
+    ULONG cCharacterPosition,
+    ULONG cNumToReplace,
+    OLECHAR pcharText[]);
+void __RPC_STUB IDebugDocumentTextAuthor_ReplaceText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugDocumentTextAuthor_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugDocumentTextExternalAuthor interface
+ */
+#ifndef __IDebugDocumentTextExternalAuthor_INTERFACE_DEFINED__
+#define __IDebugDocumentTextExternalAuthor_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugDocumentTextExternalAuthor, 0x51973c25, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c25-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugDocumentTextExternalAuthor : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetPathName(
+        BSTR *pbstrLongName,
+        WINBOOL *pfIsOriginalFile) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFileName(
+        BSTR *pbstrShortName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE NotifyChanged(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugDocumentTextExternalAuthor, 0x51973c25, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugDocumentTextExternalAuthorVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugDocumentTextExternalAuthor* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugDocumentTextExternalAuthor* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugDocumentTextExternalAuthor* This);
+
+    /*** IDebugDocumentTextExternalAuthor methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetPathName)(
+        IDebugDocumentTextExternalAuthor* This,
+        BSTR *pbstrLongName,
+        WINBOOL *pfIsOriginalFile);
+
+    HRESULT (STDMETHODCALLTYPE *GetFileName)(
+        IDebugDocumentTextExternalAuthor* This,
+        BSTR *pbstrShortName);
+
+    HRESULT (STDMETHODCALLTYPE *NotifyChanged)(
+        IDebugDocumentTextExternalAuthor* This);
+
+    END_INTERFACE
+} IDebugDocumentTextExternalAuthorVtbl;
+interface IDebugDocumentTextExternalAuthor {
+    CONST_VTBL IDebugDocumentTextExternalAuthorVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugDocumentTextExternalAuthor_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugDocumentTextExternalAuthor_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugDocumentTextExternalAuthor_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugDocumentTextExternalAuthor methods ***/
+#define IDebugDocumentTextExternalAuthor_GetPathName(This,pbstrLongName,pfIsOriginalFile) (This)->lpVtbl->GetPathName(This,pbstrLongName,pfIsOriginalFile)
+#define IDebugDocumentTextExternalAuthor_GetFileName(This,pbstrShortName) (This)->lpVtbl->GetFileName(This,pbstrShortName)
+#define IDebugDocumentTextExternalAuthor_NotifyChanged(This) (This)->lpVtbl->NotifyChanged(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugDocumentTextExternalAuthor_QueryInterface(IDebugDocumentTextExternalAuthor* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugDocumentTextExternalAuthor_AddRef(IDebugDocumentTextExternalAuthor* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugDocumentTextExternalAuthor_Release(IDebugDocumentTextExternalAuthor* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugDocumentTextExternalAuthor methods ***/
+static FORCEINLINE HRESULT IDebugDocumentTextExternalAuthor_GetPathName(IDebugDocumentTextExternalAuthor* This,BSTR *pbstrLongName,WINBOOL *pfIsOriginalFile) {
+    return This->lpVtbl->GetPathName(This,pbstrLongName,pfIsOriginalFile);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextExternalAuthor_GetFileName(IDebugDocumentTextExternalAuthor* This,BSTR *pbstrShortName) {
+    return This->lpVtbl->GetFileName(This,pbstrShortName);
+}
+static FORCEINLINE HRESULT IDebugDocumentTextExternalAuthor_NotifyChanged(IDebugDocumentTextExternalAuthor* This) {
+    return This->lpVtbl->NotifyChanged(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugDocumentTextExternalAuthor_GetPathName_Proxy(
+    IDebugDocumentTextExternalAuthor* This,
+    BSTR *pbstrLongName,
+    WINBOOL *pfIsOriginalFile);
+void __RPC_STUB IDebugDocumentTextExternalAuthor_GetPathName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentTextExternalAuthor_GetFileName_Proxy(
+    IDebugDocumentTextExternalAuthor* This,
+    BSTR *pbstrShortName);
+void __RPC_STUB IDebugDocumentTextExternalAuthor_GetFileName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentTextExternalAuthor_NotifyChanged_Proxy(
+    IDebugDocumentTextExternalAuthor* This);
+void __RPC_STUB IDebugDocumentTextExternalAuthor_NotifyChanged_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugDocumentTextExternalAuthor_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugDocumentHelper32 interface
+ */
+#ifndef __IDebugDocumentHelper32_INTERFACE_DEFINED__
+#define __IDebugDocumentHelper32_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugDocumentHelper32, 0x51973c26, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c26-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugDocumentHelper32 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Init(
+        IDebugApplication32 *pda,
+        LPCOLESTR pszShortName,
+        LPCOLESTR pszLongName,
+        TEXT_DOC_ATTR docAttr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Attach(
+        IDebugDocumentHelper32 *pddhParent) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Detach(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddUnicodeText(
+        LPCOLESTR pszText) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddDBCSText(
+        LPCSTR pszText) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetDebugDocumentHost(
+        IDebugDocumentHost *pddh) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddDeferredText(
+        ULONG cChars,
+        DWORD dwTextStartCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DefineScriptBlock(
+        ULONG ulCharOffset,
+        ULONG cChars,
+        IActiveScript *pas,
+        WINBOOL fScriptlet,
+        DWORD *pdwSourceContext) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetDefaultTextAttr(
+        SOURCE_TEXT_ATTR staTextAttr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetTextAttributes(
+        ULONG ulCharOffset,
+        ULONG cChars,
+        SOURCE_TEXT_ATTR *pstaTextAttr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetLongName(
+        LPCOLESTR pszLongName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetShortName(
+        LPCOLESTR pszShortName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetDocumentAttr(
+        TEXT_DOC_ATTR pszAttributes) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDebugApplicationNode(
+        IDebugApplicationNode **ppdan) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetScriptBlockInfo(
+        DWORD dwSourceContext,
+        IActiveScript **ppasd,
+        ULONG *piCharPos,
+        ULONG *pcChars) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateDebugDocumentContext(
+        ULONG iCharPos,
+        ULONG cChars,
+        IDebugDocumentContext **ppddc) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BringDocumentToTop(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BringDocumentContextToTop(
+        IDebugDocumentContext *pddc) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugDocumentHelper32, 0x51973c26, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugDocumentHelper32Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugDocumentHelper32* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugDocumentHelper32* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugDocumentHelper32* This);
+
+    /*** IDebugDocumentHelper32 methods ***/
+    HRESULT (STDMETHODCALLTYPE *Init)(
+        IDebugDocumentHelper32* This,
+        IDebugApplication32 *pda,
+        LPCOLESTR pszShortName,
+        LPCOLESTR pszLongName,
+        TEXT_DOC_ATTR docAttr);
+
+    HRESULT (STDMETHODCALLTYPE *Attach)(
+        IDebugDocumentHelper32* This,
+        IDebugDocumentHelper32 *pddhParent);
+
+    HRESULT (STDMETHODCALLTYPE *Detach)(
+        IDebugDocumentHelper32* This);
+
+    HRESULT (STDMETHODCALLTYPE *AddUnicodeText)(
+        IDebugDocumentHelper32* This,
+        LPCOLESTR pszText);
+
+    HRESULT (STDMETHODCALLTYPE *AddDBCSText)(
+        IDebugDocumentHelper32* This,
+        LPCSTR pszText);
+
+    HRESULT (STDMETHODCALLTYPE *SetDebugDocumentHost)(
+        IDebugDocumentHelper32* This,
+        IDebugDocumentHost *pddh);
+
+    HRESULT (STDMETHODCALLTYPE *AddDeferredText)(
+        IDebugDocumentHelper32* This,
+        ULONG cChars,
+        DWORD dwTextStartCookie);
+
+    HRESULT (STDMETHODCALLTYPE *DefineScriptBlock)(
+        IDebugDocumentHelper32* This,
+        ULONG ulCharOffset,
+        ULONG cChars,
+        IActiveScript *pas,
+        WINBOOL fScriptlet,
+        DWORD *pdwSourceContext);
+
+    HRESULT (STDMETHODCALLTYPE *SetDefaultTextAttr)(
+        IDebugDocumentHelper32* This,
+        SOURCE_TEXT_ATTR staTextAttr);
+
+    HRESULT (STDMETHODCALLTYPE *SetTextAttributes)(
+        IDebugDocumentHelper32* This,
+        ULONG ulCharOffset,
+        ULONG cChars,
+        SOURCE_TEXT_ATTR *pstaTextAttr);
+
+    HRESULT (STDMETHODCALLTYPE *SetLongName)(
+        IDebugDocumentHelper32* This,
+        LPCOLESTR pszLongName);
+
+    HRESULT (STDMETHODCALLTYPE *SetShortName)(
+        IDebugDocumentHelper32* This,
+        LPCOLESTR pszShortName);
+
+    HRESULT (STDMETHODCALLTYPE *SetDocumentAttr)(
+        IDebugDocumentHelper32* This,
+        TEXT_DOC_ATTR pszAttributes);
+
+    HRESULT (STDMETHODCALLTYPE *GetDebugApplicationNode)(
+        IDebugDocumentHelper32* This,
+        IDebugApplicationNode **ppdan);
+
+    HRESULT (STDMETHODCALLTYPE *GetScriptBlockInfo)(
+        IDebugDocumentHelper32* This,
+        DWORD dwSourceContext,
+        IActiveScript **ppasd,
+        ULONG *piCharPos,
+        ULONG *pcChars);
+
+    HRESULT (STDMETHODCALLTYPE *CreateDebugDocumentContext)(
+        IDebugDocumentHelper32* This,
+        ULONG iCharPos,
+        ULONG cChars,
+        IDebugDocumentContext **ppddc);
+
+    HRESULT (STDMETHODCALLTYPE *BringDocumentToTop)(
+        IDebugDocumentHelper32* This);
+
+    HRESULT (STDMETHODCALLTYPE *BringDocumentContextToTop)(
+        IDebugDocumentHelper32* This,
+        IDebugDocumentContext *pddc);
+
+    END_INTERFACE
+} IDebugDocumentHelper32Vtbl;
+interface IDebugDocumentHelper32 {
+    CONST_VTBL IDebugDocumentHelper32Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugDocumentHelper32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugDocumentHelper32_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugDocumentHelper32_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugDocumentHelper32 methods ***/
+#define IDebugDocumentHelper32_Init(This,pda,pszShortName,pszLongName,docAttr) (This)->lpVtbl->Init(This,pda,pszShortName,pszLongName,docAttr)
+#define IDebugDocumentHelper32_Attach(This,pddhParent) (This)->lpVtbl->Attach(This,pddhParent)
+#define IDebugDocumentHelper32_Detach(This) (This)->lpVtbl->Detach(This)
+#define IDebugDocumentHelper32_AddUnicodeText(This,pszText) (This)->lpVtbl->AddUnicodeText(This,pszText)
+#define IDebugDocumentHelper32_AddDBCSText(This,pszText) (This)->lpVtbl->AddDBCSText(This,pszText)
+#define IDebugDocumentHelper32_SetDebugDocumentHost(This,pddh) (This)->lpVtbl->SetDebugDocumentHost(This,pddh)
+#define IDebugDocumentHelper32_AddDeferredText(This,cChars,dwTextStartCookie) (This)->lpVtbl->AddDeferredText(This,cChars,dwTextStartCookie)
+#define IDebugDocumentHelper32_DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext) (This)->lpVtbl->DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext)
+#define IDebugDocumentHelper32_SetDefaultTextAttr(This,staTextAttr) (This)->lpVtbl->SetDefaultTextAttr(This,staTextAttr)
+#define IDebugDocumentHelper32_SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr) (This)->lpVtbl->SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr)
+#define IDebugDocumentHelper32_SetLongName(This,pszLongName) (This)->lpVtbl->SetLongName(This,pszLongName)
+#define IDebugDocumentHelper32_SetShortName(This,pszShortName) (This)->lpVtbl->SetShortName(This,pszShortName)
+#define IDebugDocumentHelper32_SetDocumentAttr(This,pszAttributes) (This)->lpVtbl->SetDocumentAttr(This,pszAttributes)
+#define IDebugDocumentHelper32_GetDebugApplicationNode(This,ppdan) (This)->lpVtbl->GetDebugApplicationNode(This,ppdan)
+#define IDebugDocumentHelper32_GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars) (This)->lpVtbl->GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars)
+#define IDebugDocumentHelper32_CreateDebugDocumentContext(This,iCharPos,cChars,ppddc) (This)->lpVtbl->CreateDebugDocumentContext(This,iCharPos,cChars,ppddc)
+#define IDebugDocumentHelper32_BringDocumentToTop(This) (This)->lpVtbl->BringDocumentToTop(This)
+#define IDebugDocumentHelper32_BringDocumentContextToTop(This,pddc) (This)->lpVtbl->BringDocumentContextToTop(This,pddc)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugDocumentHelper32_QueryInterface(IDebugDocumentHelper32* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugDocumentHelper32_AddRef(IDebugDocumentHelper32* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugDocumentHelper32_Release(IDebugDocumentHelper32* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugDocumentHelper32 methods ***/
+static FORCEINLINE HRESULT IDebugDocumentHelper32_Init(IDebugDocumentHelper32* This,IDebugApplication32 *pda,LPCOLESTR pszShortName,LPCOLESTR pszLongName,TEXT_DOC_ATTR docAttr) {
+    return This->lpVtbl->Init(This,pda,pszShortName,pszLongName,docAttr);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_Attach(IDebugDocumentHelper32* This,IDebugDocumentHelper32 *pddhParent) {
+    return This->lpVtbl->Attach(This,pddhParent);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_Detach(IDebugDocumentHelper32* This) {
+    return This->lpVtbl->Detach(This);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_AddUnicodeText(IDebugDocumentHelper32* This,LPCOLESTR pszText) {
+    return This->lpVtbl->AddUnicodeText(This,pszText);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_AddDBCSText(IDebugDocumentHelper32* This,LPCSTR pszText) {
+    return This->lpVtbl->AddDBCSText(This,pszText);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_SetDebugDocumentHost(IDebugDocumentHelper32* This,IDebugDocumentHost *pddh) {
+    return This->lpVtbl->SetDebugDocumentHost(This,pddh);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_AddDeferredText(IDebugDocumentHelper32* This,ULONG cChars,DWORD dwTextStartCookie) {
+    return This->lpVtbl->AddDeferredText(This,cChars,dwTextStartCookie);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_DefineScriptBlock(IDebugDocumentHelper32* This,ULONG ulCharOffset,ULONG cChars,IActiveScript *pas,WINBOOL fScriptlet,DWORD *pdwSourceContext) {
+    return This->lpVtbl->DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_SetDefaultTextAttr(IDebugDocumentHelper32* This,SOURCE_TEXT_ATTR staTextAttr) {
+    return This->lpVtbl->SetDefaultTextAttr(This,staTextAttr);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_SetTextAttributes(IDebugDocumentHelper32* This,ULONG ulCharOffset,ULONG cChars,SOURCE_TEXT_ATTR *pstaTextAttr) {
+    return This->lpVtbl->SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_SetLongName(IDebugDocumentHelper32* This,LPCOLESTR pszLongName) {
+    return This->lpVtbl->SetLongName(This,pszLongName);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_SetShortName(IDebugDocumentHelper32* This,LPCOLESTR pszShortName) {
+    return This->lpVtbl->SetShortName(This,pszShortName);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_SetDocumentAttr(IDebugDocumentHelper32* This,TEXT_DOC_ATTR pszAttributes) {
+    return This->lpVtbl->SetDocumentAttr(This,pszAttributes);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_GetDebugApplicationNode(IDebugDocumentHelper32* This,IDebugApplicationNode **ppdan) {
+    return This->lpVtbl->GetDebugApplicationNode(This,ppdan);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_GetScriptBlockInfo(IDebugDocumentHelper32* This,DWORD dwSourceContext,IActiveScript **ppasd,ULONG *piCharPos,ULONG *pcChars) {
+    return This->lpVtbl->GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_CreateDebugDocumentContext(IDebugDocumentHelper32* This,ULONG iCharPos,ULONG cChars,IDebugDocumentContext **ppddc) {
+    return This->lpVtbl->CreateDebugDocumentContext(This,iCharPos,cChars,ppddc);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_BringDocumentToTop(IDebugDocumentHelper32* This) {
+    return This->lpVtbl->BringDocumentToTop(This);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper32_BringDocumentContextToTop(IDebugDocumentHelper32* This,IDebugDocumentContext *pddc) {
+    return This->lpVtbl->BringDocumentContextToTop(This,pddc);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_Init_Proxy(
+    IDebugDocumentHelper32* This,
+    IDebugApplication32 *pda,
+    LPCOLESTR pszShortName,
+    LPCOLESTR pszLongName,
+    TEXT_DOC_ATTR docAttr);
+void __RPC_STUB IDebugDocumentHelper32_Init_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_Attach_Proxy(
+    IDebugDocumentHelper32* This,
+    IDebugDocumentHelper32 *pddhParent);
+void __RPC_STUB IDebugDocumentHelper32_Attach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_Detach_Proxy(
+    IDebugDocumentHelper32* This);
+void __RPC_STUB IDebugDocumentHelper32_Detach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_AddUnicodeText_Proxy(
+    IDebugDocumentHelper32* This,
+    LPCOLESTR pszText);
+void __RPC_STUB IDebugDocumentHelper32_AddUnicodeText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_AddDBCSText_Proxy(
+    IDebugDocumentHelper32* This,
+    LPCSTR pszText);
+void __RPC_STUB IDebugDocumentHelper32_AddDBCSText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_SetDebugDocumentHost_Proxy(
+    IDebugDocumentHelper32* This,
+    IDebugDocumentHost *pddh);
+void __RPC_STUB IDebugDocumentHelper32_SetDebugDocumentHost_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_AddDeferredText_Proxy(
+    IDebugDocumentHelper32* This,
+    ULONG cChars,
+    DWORD dwTextStartCookie);
+void __RPC_STUB IDebugDocumentHelper32_AddDeferredText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_DefineScriptBlock_Proxy(
+    IDebugDocumentHelper32* This,
+    ULONG ulCharOffset,
+    ULONG cChars,
+    IActiveScript *pas,
+    WINBOOL fScriptlet,
+    DWORD *pdwSourceContext);
+void __RPC_STUB IDebugDocumentHelper32_DefineScriptBlock_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_SetDefaultTextAttr_Proxy(
+    IDebugDocumentHelper32* This,
+    SOURCE_TEXT_ATTR staTextAttr);
+void __RPC_STUB IDebugDocumentHelper32_SetDefaultTextAttr_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_SetTextAttributes_Proxy(
+    IDebugDocumentHelper32* This,
+    ULONG ulCharOffset,
+    ULONG cChars,
+    SOURCE_TEXT_ATTR *pstaTextAttr);
+void __RPC_STUB IDebugDocumentHelper32_SetTextAttributes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_SetLongName_Proxy(
+    IDebugDocumentHelper32* This,
+    LPCOLESTR pszLongName);
+void __RPC_STUB IDebugDocumentHelper32_SetLongName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_SetShortName_Proxy(
+    IDebugDocumentHelper32* This,
+    LPCOLESTR pszShortName);
+void __RPC_STUB IDebugDocumentHelper32_SetShortName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_SetDocumentAttr_Proxy(
+    IDebugDocumentHelper32* This,
+    TEXT_DOC_ATTR pszAttributes);
+void __RPC_STUB IDebugDocumentHelper32_SetDocumentAttr_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_GetDebugApplicationNode_Proxy(
+    IDebugDocumentHelper32* This,
+    IDebugApplicationNode **ppdan);
+void __RPC_STUB IDebugDocumentHelper32_GetDebugApplicationNode_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_GetScriptBlockInfo_Proxy(
+    IDebugDocumentHelper32* This,
+    DWORD dwSourceContext,
+    IActiveScript **ppasd,
+    ULONG *piCharPos,
+    ULONG *pcChars);
+void __RPC_STUB IDebugDocumentHelper32_GetScriptBlockInfo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_CreateDebugDocumentContext_Proxy(
+    IDebugDocumentHelper32* This,
+    ULONG iCharPos,
+    ULONG cChars,
+    IDebugDocumentContext **ppddc);
+void __RPC_STUB IDebugDocumentHelper32_CreateDebugDocumentContext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_BringDocumentToTop_Proxy(
+    IDebugDocumentHelper32* This);
+void __RPC_STUB IDebugDocumentHelper32_BringDocumentToTop_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper32_BringDocumentContextToTop_Proxy(
+    IDebugDocumentHelper32* This,
+    IDebugDocumentContext *pddc);
+void __RPC_STUB IDebugDocumentHelper32_BringDocumentContextToTop_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugDocumentHelper32_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugDocumentHelper64 interface
+ */
+#ifndef __IDebugDocumentHelper64_INTERFACE_DEFINED__
+#define __IDebugDocumentHelper64_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugDocumentHelper64, 0xc4c7363c, 0x20fd, 0x47f9, 0xbd,0x82, 0x48,0x55,0xe0,0x15,0x08,0x71);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("c4c7363c-20fd-47f9-bd82-4855e0150871")
+IDebugDocumentHelper64 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Init(
+        IDebugApplication64 *pda,
+        LPCOLESTR pszShortName,
+        LPCOLESTR pszLongName,
+        TEXT_DOC_ATTR docAttr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Attach(
+        IDebugDocumentHelper64 *pddhParent) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Detach(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddUnicodeText(
+        LPCOLESTR pszText) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddDBCSText(
+        LPCSTR pszText) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetDebugDocumentHost(
+        IDebugDocumentHost *pddh) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddDeferredText(
+        ULONG cChars,
+        DWORD dwTextStartCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DefineScriptBlock(
+        ULONG ulCharOffset,
+        ULONG cChars,
+        IActiveScript *pas,
+        WINBOOL fScriptlet,
+        DWORDLONG *pdwSourceContext) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetDefaultTextAttr(
+        SOURCE_TEXT_ATTR staTextAttr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetTextAttributes(
+        ULONG ulCharOffset,
+        ULONG cChars,
+        SOURCE_TEXT_ATTR *pstaTextAttr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetLongName(
+        LPCOLESTR pszLongName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetShortName(
+        LPCOLESTR pszShortName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetDocumentAttr(
+        TEXT_DOC_ATTR pszAttributes) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDebugApplicationNode(
+        IDebugApplicationNode **ppdan) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetScriptBlockInfo(
+        DWORDLONG dwSourceContext,
+        IActiveScript **ppasd,
+        ULONG *piCharPos,
+        ULONG *pcChars) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateDebugDocumentContext(
+        ULONG iCharPos,
+        ULONG cChars,
+        IDebugDocumentContext **ppddc) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BringDocumentToTop(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BringDocumentContextToTop(
+        IDebugDocumentContext *pddc) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugDocumentHelper64, 0xc4c7363c, 0x20fd, 0x47f9, 0xbd,0x82, 0x48,0x55,0xe0,0x15,0x08,0x71)
+#endif
+#else
+typedef struct IDebugDocumentHelper64Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugDocumentHelper64* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugDocumentHelper64* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugDocumentHelper64* This);
+
+    /*** IDebugDocumentHelper64 methods ***/
+    HRESULT (STDMETHODCALLTYPE *Init)(
+        IDebugDocumentHelper64* This,
+        IDebugApplication64 *pda,
+        LPCOLESTR pszShortName,
+        LPCOLESTR pszLongName,
+        TEXT_DOC_ATTR docAttr);
+
+    HRESULT (STDMETHODCALLTYPE *Attach)(
+        IDebugDocumentHelper64* This,
+        IDebugDocumentHelper64 *pddhParent);
+
+    HRESULT (STDMETHODCALLTYPE *Detach)(
+        IDebugDocumentHelper64* This);
+
+    HRESULT (STDMETHODCALLTYPE *AddUnicodeText)(
+        IDebugDocumentHelper64* This,
+        LPCOLESTR pszText);
+
+    HRESULT (STDMETHODCALLTYPE *AddDBCSText)(
+        IDebugDocumentHelper64* This,
+        LPCSTR pszText);
+
+    HRESULT (STDMETHODCALLTYPE *SetDebugDocumentHost)(
+        IDebugDocumentHelper64* This,
+        IDebugDocumentHost *pddh);
+
+    HRESULT (STDMETHODCALLTYPE *AddDeferredText)(
+        IDebugDocumentHelper64* This,
+        ULONG cChars,
+        DWORD dwTextStartCookie);
+
+    HRESULT (STDMETHODCALLTYPE *DefineScriptBlock)(
+        IDebugDocumentHelper64* This,
+        ULONG ulCharOffset,
+        ULONG cChars,
+        IActiveScript *pas,
+        WINBOOL fScriptlet,
+        DWORDLONG *pdwSourceContext);
+
+    HRESULT (STDMETHODCALLTYPE *SetDefaultTextAttr)(
+        IDebugDocumentHelper64* This,
+        SOURCE_TEXT_ATTR staTextAttr);
+
+    HRESULT (STDMETHODCALLTYPE *SetTextAttributes)(
+        IDebugDocumentHelper64* This,
+        ULONG ulCharOffset,
+        ULONG cChars,
+        SOURCE_TEXT_ATTR *pstaTextAttr);
+
+    HRESULT (STDMETHODCALLTYPE *SetLongName)(
+        IDebugDocumentHelper64* This,
+        LPCOLESTR pszLongName);
+
+    HRESULT (STDMETHODCALLTYPE *SetShortName)(
+        IDebugDocumentHelper64* This,
+        LPCOLESTR pszShortName);
+
+    HRESULT (STDMETHODCALLTYPE *SetDocumentAttr)(
+        IDebugDocumentHelper64* This,
+        TEXT_DOC_ATTR pszAttributes);
+
+    HRESULT (STDMETHODCALLTYPE *GetDebugApplicationNode)(
+        IDebugDocumentHelper64* This,
+        IDebugApplicationNode **ppdan);
+
+    HRESULT (STDMETHODCALLTYPE *GetScriptBlockInfo)(
+        IDebugDocumentHelper64* This,
+        DWORDLONG dwSourceContext,
+        IActiveScript **ppasd,
+        ULONG *piCharPos,
+        ULONG *pcChars);
+
+    HRESULT (STDMETHODCALLTYPE *CreateDebugDocumentContext)(
+        IDebugDocumentHelper64* This,
+        ULONG iCharPos,
+        ULONG cChars,
+        IDebugDocumentContext **ppddc);
+
+    HRESULT (STDMETHODCALLTYPE *BringDocumentToTop)(
+        IDebugDocumentHelper64* This);
+
+    HRESULT (STDMETHODCALLTYPE *BringDocumentContextToTop)(
+        IDebugDocumentHelper64* This,
+        IDebugDocumentContext *pddc);
+
+    END_INTERFACE
+} IDebugDocumentHelper64Vtbl;
+interface IDebugDocumentHelper64 {
+    CONST_VTBL IDebugDocumentHelper64Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugDocumentHelper64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugDocumentHelper64_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugDocumentHelper64_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugDocumentHelper64 methods ***/
+#define IDebugDocumentHelper64_Init(This,pda,pszShortName,pszLongName,docAttr) (This)->lpVtbl->Init(This,pda,pszShortName,pszLongName,docAttr)
+#define IDebugDocumentHelper64_Attach(This,pddhParent) (This)->lpVtbl->Attach(This,pddhParent)
+#define IDebugDocumentHelper64_Detach(This) (This)->lpVtbl->Detach(This)
+#define IDebugDocumentHelper64_AddUnicodeText(This,pszText) (This)->lpVtbl->AddUnicodeText(This,pszText)
+#define IDebugDocumentHelper64_AddDBCSText(This,pszText) (This)->lpVtbl->AddDBCSText(This,pszText)
+#define IDebugDocumentHelper64_SetDebugDocumentHost(This,pddh) (This)->lpVtbl->SetDebugDocumentHost(This,pddh)
+#define IDebugDocumentHelper64_AddDeferredText(This,cChars,dwTextStartCookie) (This)->lpVtbl->AddDeferredText(This,cChars,dwTextStartCookie)
+#define IDebugDocumentHelper64_DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext) (This)->lpVtbl->DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext)
+#define IDebugDocumentHelper64_SetDefaultTextAttr(This,staTextAttr) (This)->lpVtbl->SetDefaultTextAttr(This,staTextAttr)
+#define IDebugDocumentHelper64_SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr) (This)->lpVtbl->SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr)
+#define IDebugDocumentHelper64_SetLongName(This,pszLongName) (This)->lpVtbl->SetLongName(This,pszLongName)
+#define IDebugDocumentHelper64_SetShortName(This,pszShortName) (This)->lpVtbl->SetShortName(This,pszShortName)
+#define IDebugDocumentHelper64_SetDocumentAttr(This,pszAttributes) (This)->lpVtbl->SetDocumentAttr(This,pszAttributes)
+#define IDebugDocumentHelper64_GetDebugApplicationNode(This,ppdan) (This)->lpVtbl->GetDebugApplicationNode(This,ppdan)
+#define IDebugDocumentHelper64_GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars) (This)->lpVtbl->GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars)
+#define IDebugDocumentHelper64_CreateDebugDocumentContext(This,iCharPos,cChars,ppddc) (This)->lpVtbl->CreateDebugDocumentContext(This,iCharPos,cChars,ppddc)
+#define IDebugDocumentHelper64_BringDocumentToTop(This) (This)->lpVtbl->BringDocumentToTop(This)
+#define IDebugDocumentHelper64_BringDocumentContextToTop(This,pddc) (This)->lpVtbl->BringDocumentContextToTop(This,pddc)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugDocumentHelper64_QueryInterface(IDebugDocumentHelper64* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugDocumentHelper64_AddRef(IDebugDocumentHelper64* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugDocumentHelper64_Release(IDebugDocumentHelper64* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugDocumentHelper64 methods ***/
+static FORCEINLINE HRESULT IDebugDocumentHelper64_Init(IDebugDocumentHelper64* This,IDebugApplication64 *pda,LPCOLESTR pszShortName,LPCOLESTR pszLongName,TEXT_DOC_ATTR docAttr) {
+    return This->lpVtbl->Init(This,pda,pszShortName,pszLongName,docAttr);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_Attach(IDebugDocumentHelper64* This,IDebugDocumentHelper64 *pddhParent) {
+    return This->lpVtbl->Attach(This,pddhParent);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_Detach(IDebugDocumentHelper64* This) {
+    return This->lpVtbl->Detach(This);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_AddUnicodeText(IDebugDocumentHelper64* This,LPCOLESTR pszText) {
+    return This->lpVtbl->AddUnicodeText(This,pszText);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_AddDBCSText(IDebugDocumentHelper64* This,LPCSTR pszText) {
+    return This->lpVtbl->AddDBCSText(This,pszText);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_SetDebugDocumentHost(IDebugDocumentHelper64* This,IDebugDocumentHost *pddh) {
+    return This->lpVtbl->SetDebugDocumentHost(This,pddh);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_AddDeferredText(IDebugDocumentHelper64* This,ULONG cChars,DWORD dwTextStartCookie) {
+    return This->lpVtbl->AddDeferredText(This,cChars,dwTextStartCookie);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_DefineScriptBlock(IDebugDocumentHelper64* This,ULONG ulCharOffset,ULONG cChars,IActiveScript *pas,WINBOOL fScriptlet,DWORDLONG *pdwSourceContext) {
+    return This->lpVtbl->DefineScriptBlock(This,ulCharOffset,cChars,pas,fScriptlet,pdwSourceContext);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_SetDefaultTextAttr(IDebugDocumentHelper64* This,SOURCE_TEXT_ATTR staTextAttr) {
+    return This->lpVtbl->SetDefaultTextAttr(This,staTextAttr);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_SetTextAttributes(IDebugDocumentHelper64* This,ULONG ulCharOffset,ULONG cChars,SOURCE_TEXT_ATTR *pstaTextAttr) {
+    return This->lpVtbl->SetTextAttributes(This,ulCharOffset,cChars,pstaTextAttr);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_SetLongName(IDebugDocumentHelper64* This,LPCOLESTR pszLongName) {
+    return This->lpVtbl->SetLongName(This,pszLongName);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_SetShortName(IDebugDocumentHelper64* This,LPCOLESTR pszShortName) {
+    return This->lpVtbl->SetShortName(This,pszShortName);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_SetDocumentAttr(IDebugDocumentHelper64* This,TEXT_DOC_ATTR pszAttributes) {
+    return This->lpVtbl->SetDocumentAttr(This,pszAttributes);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_GetDebugApplicationNode(IDebugDocumentHelper64* This,IDebugApplicationNode **ppdan) {
+    return This->lpVtbl->GetDebugApplicationNode(This,ppdan);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_GetScriptBlockInfo(IDebugDocumentHelper64* This,DWORDLONG dwSourceContext,IActiveScript **ppasd,ULONG *piCharPos,ULONG *pcChars) {
+    return This->lpVtbl->GetScriptBlockInfo(This,dwSourceContext,ppasd,piCharPos,pcChars);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_CreateDebugDocumentContext(IDebugDocumentHelper64* This,ULONG iCharPos,ULONG cChars,IDebugDocumentContext **ppddc) {
+    return This->lpVtbl->CreateDebugDocumentContext(This,iCharPos,cChars,ppddc);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_BringDocumentToTop(IDebugDocumentHelper64* This) {
+    return This->lpVtbl->BringDocumentToTop(This);
+}
+static FORCEINLINE HRESULT IDebugDocumentHelper64_BringDocumentContextToTop(IDebugDocumentHelper64* This,IDebugDocumentContext *pddc) {
+    return This->lpVtbl->BringDocumentContextToTop(This,pddc);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_Init_Proxy(
+    IDebugDocumentHelper64* This,
+    IDebugApplication64 *pda,
+    LPCOLESTR pszShortName,
+    LPCOLESTR pszLongName,
+    TEXT_DOC_ATTR docAttr);
+void __RPC_STUB IDebugDocumentHelper64_Init_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_Attach_Proxy(
+    IDebugDocumentHelper64* This,
+    IDebugDocumentHelper64 *pddhParent);
+void __RPC_STUB IDebugDocumentHelper64_Attach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_Detach_Proxy(
+    IDebugDocumentHelper64* This);
+void __RPC_STUB IDebugDocumentHelper64_Detach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_AddUnicodeText_Proxy(
+    IDebugDocumentHelper64* This,
+    LPCOLESTR pszText);
+void __RPC_STUB IDebugDocumentHelper64_AddUnicodeText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_AddDBCSText_Proxy(
+    IDebugDocumentHelper64* This,
+    LPCSTR pszText);
+void __RPC_STUB IDebugDocumentHelper64_AddDBCSText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_SetDebugDocumentHost_Proxy(
+    IDebugDocumentHelper64* This,
+    IDebugDocumentHost *pddh);
+void __RPC_STUB IDebugDocumentHelper64_SetDebugDocumentHost_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_AddDeferredText_Proxy(
+    IDebugDocumentHelper64* This,
+    ULONG cChars,
+    DWORD dwTextStartCookie);
+void __RPC_STUB IDebugDocumentHelper64_AddDeferredText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_DefineScriptBlock_Proxy(
+    IDebugDocumentHelper64* This,
+    ULONG ulCharOffset,
+    ULONG cChars,
+    IActiveScript *pas,
+    WINBOOL fScriptlet,
+    DWORDLONG *pdwSourceContext);
+void __RPC_STUB IDebugDocumentHelper64_DefineScriptBlock_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_SetDefaultTextAttr_Proxy(
+    IDebugDocumentHelper64* This,
+    SOURCE_TEXT_ATTR staTextAttr);
+void __RPC_STUB IDebugDocumentHelper64_SetDefaultTextAttr_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_SetTextAttributes_Proxy(
+    IDebugDocumentHelper64* This,
+    ULONG ulCharOffset,
+    ULONG cChars,
+    SOURCE_TEXT_ATTR *pstaTextAttr);
+void __RPC_STUB IDebugDocumentHelper64_SetTextAttributes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_SetLongName_Proxy(
+    IDebugDocumentHelper64* This,
+    LPCOLESTR pszLongName);
+void __RPC_STUB IDebugDocumentHelper64_SetLongName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_SetShortName_Proxy(
+    IDebugDocumentHelper64* This,
+    LPCOLESTR pszShortName);
+void __RPC_STUB IDebugDocumentHelper64_SetShortName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_SetDocumentAttr_Proxy(
+    IDebugDocumentHelper64* This,
+    TEXT_DOC_ATTR pszAttributes);
+void __RPC_STUB IDebugDocumentHelper64_SetDocumentAttr_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_GetDebugApplicationNode_Proxy(
+    IDebugDocumentHelper64* This,
+    IDebugApplicationNode **ppdan);
+void __RPC_STUB IDebugDocumentHelper64_GetDebugApplicationNode_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_GetScriptBlockInfo_Proxy(
+    IDebugDocumentHelper64* This,
+    DWORDLONG dwSourceContext,
+    IActiveScript **ppasd,
+    ULONG *piCharPos,
+    ULONG *pcChars);
+void __RPC_STUB IDebugDocumentHelper64_GetScriptBlockInfo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_CreateDebugDocumentContext_Proxy(
+    IDebugDocumentHelper64* This,
+    ULONG iCharPos,
+    ULONG cChars,
+    IDebugDocumentContext **ppddc);
+void __RPC_STUB IDebugDocumentHelper64_CreateDebugDocumentContext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_BringDocumentToTop_Proxy(
+    IDebugDocumentHelper64* This);
+void __RPC_STUB IDebugDocumentHelper64_BringDocumentToTop_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHelper64_BringDocumentContextToTop_Proxy(
+    IDebugDocumentHelper64* This,
+    IDebugDocumentContext *pddc);
+void __RPC_STUB IDebugDocumentHelper64_BringDocumentContextToTop_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugDocumentHelper64_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugDocumentHost interface
+ */
+#ifndef __IDebugDocumentHost_INTERFACE_DEFINED__
+#define __IDebugDocumentHost_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugDocumentHost, 0x51973c27, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c27-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugDocumentHost : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetDeferredText(
+        DWORD dwTextStartCookie,
+        WCHAR *pcharText,
+        SOURCE_TEXT_ATTR *pstaTextAttr,
+        ULONG *pcNumChars,
+        ULONG cMaxChars) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetScriptTextAttributes(
+        LPCOLESTR pstrCode,
+        ULONG uNumCodeChars,
+        LPCOLESTR pstrDelimiter,
+        DWORD dwFlags,
+        SOURCE_TEXT_ATTR *pattr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnCreateDocumentContext(
+        IUnknown **ppunkOuter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetPathName(
+        BSTR *pbstrLongName,
+        WINBOOL *pfIsOriginalFile) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetFileName(
+        BSTR *pbstrShortName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE NotifyChanged(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugDocumentHost, 0x51973c27, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugDocumentHostVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugDocumentHost* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugDocumentHost* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugDocumentHost* This);
+
+    /*** IDebugDocumentHost methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetDeferredText)(
+        IDebugDocumentHost* This,
+        DWORD dwTextStartCookie,
+        WCHAR *pcharText,
+        SOURCE_TEXT_ATTR *pstaTextAttr,
+        ULONG *pcNumChars,
+        ULONG cMaxChars);
+
+    HRESULT (STDMETHODCALLTYPE *GetScriptTextAttributes)(
+        IDebugDocumentHost* This,
+        LPCOLESTR pstrCode,
+        ULONG uNumCodeChars,
+        LPCOLESTR pstrDelimiter,
+        DWORD dwFlags,
+        SOURCE_TEXT_ATTR *pattr);
+
+    HRESULT (STDMETHODCALLTYPE *OnCreateDocumentContext)(
+        IDebugDocumentHost* This,
+        IUnknown **ppunkOuter);
+
+    HRESULT (STDMETHODCALLTYPE *GetPathName)(
+        IDebugDocumentHost* This,
+        BSTR *pbstrLongName,
+        WINBOOL *pfIsOriginalFile);
+
+    HRESULT (STDMETHODCALLTYPE *GetFileName)(
+        IDebugDocumentHost* This,
+        BSTR *pbstrShortName);
+
+    HRESULT (STDMETHODCALLTYPE *NotifyChanged)(
+        IDebugDocumentHost* This);
+
+    END_INTERFACE
+} IDebugDocumentHostVtbl;
+interface IDebugDocumentHost {
+    CONST_VTBL IDebugDocumentHostVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugDocumentHost_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugDocumentHost_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugDocumentHost_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugDocumentHost methods ***/
+#define IDebugDocumentHost_GetDeferredText(This,dwTextStartCookie,pcharText,pstaTextAttr,pcNumChars,cMaxChars) (This)->lpVtbl->GetDeferredText(This,dwTextStartCookie,pcharText,pstaTextAttr,pcNumChars,cMaxChars)
+#define IDebugDocumentHost_GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr) (This)->lpVtbl->GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr)
+#define IDebugDocumentHost_OnCreateDocumentContext(This,ppunkOuter) (This)->lpVtbl->OnCreateDocumentContext(This,ppunkOuter)
+#define IDebugDocumentHost_GetPathName(This,pbstrLongName,pfIsOriginalFile) (This)->lpVtbl->GetPathName(This,pbstrLongName,pfIsOriginalFile)
+#define IDebugDocumentHost_GetFileName(This,pbstrShortName) (This)->lpVtbl->GetFileName(This,pbstrShortName)
+#define IDebugDocumentHost_NotifyChanged(This) (This)->lpVtbl->NotifyChanged(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugDocumentHost_QueryInterface(IDebugDocumentHost* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugDocumentHost_AddRef(IDebugDocumentHost* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugDocumentHost_Release(IDebugDocumentHost* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugDocumentHost methods ***/
+static FORCEINLINE HRESULT IDebugDocumentHost_GetDeferredText(IDebugDocumentHost* This,DWORD dwTextStartCookie,WCHAR *pcharText,SOURCE_TEXT_ATTR *pstaTextAttr,ULONG *pcNumChars,ULONG cMaxChars) {
+    return This->lpVtbl->GetDeferredText(This,dwTextStartCookie,pcharText,pstaTextAttr,pcNumChars,cMaxChars);
+}
+static FORCEINLINE HRESULT IDebugDocumentHost_GetScriptTextAttributes(IDebugDocumentHost* This,LPCOLESTR pstrCode,ULONG uNumCodeChars,LPCOLESTR pstrDelimiter,DWORD dwFlags,SOURCE_TEXT_ATTR *pattr) {
+    return This->lpVtbl->GetScriptTextAttributes(This,pstrCode,uNumCodeChars,pstrDelimiter,dwFlags,pattr);
+}
+static FORCEINLINE HRESULT IDebugDocumentHost_OnCreateDocumentContext(IDebugDocumentHost* This,IUnknown **ppunkOuter) {
+    return This->lpVtbl->OnCreateDocumentContext(This,ppunkOuter);
+}
+static FORCEINLINE HRESULT IDebugDocumentHost_GetPathName(IDebugDocumentHost* This,BSTR *pbstrLongName,WINBOOL *pfIsOriginalFile) {
+    return This->lpVtbl->GetPathName(This,pbstrLongName,pfIsOriginalFile);
+}
+static FORCEINLINE HRESULT IDebugDocumentHost_GetFileName(IDebugDocumentHost* This,BSTR *pbstrShortName) {
+    return This->lpVtbl->GetFileName(This,pbstrShortName);
+}
+static FORCEINLINE HRESULT IDebugDocumentHost_NotifyChanged(IDebugDocumentHost* This) {
+    return This->lpVtbl->NotifyChanged(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugDocumentHost_GetDeferredText_Proxy(
+    IDebugDocumentHost* This,
+    DWORD dwTextStartCookie,
+    WCHAR *pcharText,
+    SOURCE_TEXT_ATTR *pstaTextAttr,
+    ULONG *pcNumChars,
+    ULONG cMaxChars);
+void __RPC_STUB IDebugDocumentHost_GetDeferredText_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHost_GetScriptTextAttributes_Proxy(
+    IDebugDocumentHost* This,
+    LPCOLESTR pstrCode,
+    ULONG uNumCodeChars,
+    LPCOLESTR pstrDelimiter,
+    DWORD dwFlags,
+    SOURCE_TEXT_ATTR *pattr);
+void __RPC_STUB IDebugDocumentHost_GetScriptTextAttributes_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHost_OnCreateDocumentContext_Proxy(
+    IDebugDocumentHost* This,
+    IUnknown **ppunkOuter);
+void __RPC_STUB IDebugDocumentHost_OnCreateDocumentContext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHost_GetPathName_Proxy(
+    IDebugDocumentHost* This,
+    BSTR *pbstrLongName,
+    WINBOOL *pfIsOriginalFile);
+void __RPC_STUB IDebugDocumentHost_GetPathName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHost_GetFileName_Proxy(
+    IDebugDocumentHost* This,
+    BSTR *pbstrShortName);
+void __RPC_STUB IDebugDocumentHost_GetFileName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentHost_NotifyChanged_Proxy(
+    IDebugDocumentHost* This);
+void __RPC_STUB IDebugDocumentHost_NotifyChanged_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugDocumentHost_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugDocumentContext interface
+ */
+#ifndef __IDebugDocumentContext_INTERFACE_DEFINED__
+#define __IDebugDocumentContext_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugDocumentContext, 0x51973c28, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c28-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugDocumentContext : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetDocument(
+        IDebugDocument **ppsd) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumCodeContexts(
+        IEnumDebugCodeContexts **ppescc) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugDocumentContext, 0x51973c28, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugDocumentContextVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugDocumentContext* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugDocumentContext* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugDocumentContext* This);
+
+    /*** IDebugDocumentContext methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetDocument)(
+        IDebugDocumentContext* This,
+        IDebugDocument **ppsd);
+
+    HRESULT (STDMETHODCALLTYPE *EnumCodeContexts)(
+        IDebugDocumentContext* This,
+        IEnumDebugCodeContexts **ppescc);
+
+    END_INTERFACE
+} IDebugDocumentContextVtbl;
+interface IDebugDocumentContext {
+    CONST_VTBL IDebugDocumentContextVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugDocumentContext_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugDocumentContext_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugDocumentContext_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugDocumentContext methods ***/
+#define IDebugDocumentContext_GetDocument(This,ppsd) (This)->lpVtbl->GetDocument(This,ppsd)
+#define IDebugDocumentContext_EnumCodeContexts(This,ppescc) (This)->lpVtbl->EnumCodeContexts(This,ppescc)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugDocumentContext_QueryInterface(IDebugDocumentContext* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugDocumentContext_AddRef(IDebugDocumentContext* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugDocumentContext_Release(IDebugDocumentContext* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugDocumentContext methods ***/
+static FORCEINLINE HRESULT IDebugDocumentContext_GetDocument(IDebugDocumentContext* This,IDebugDocument **ppsd) {
+    return This->lpVtbl->GetDocument(This,ppsd);
+}
+static FORCEINLINE HRESULT IDebugDocumentContext_EnumCodeContexts(IDebugDocumentContext* This,IEnumDebugCodeContexts **ppescc) {
+    return This->lpVtbl->EnumCodeContexts(This,ppescc);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugDocumentContext_GetDocument_Proxy(
+    IDebugDocumentContext* This,
+    IDebugDocument **ppsd);
+void __RPC_STUB IDebugDocumentContext_GetDocument_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugDocumentContext_EnumCodeContexts_Proxy(
+    IDebugDocumentContext* This,
+    IEnumDebugCodeContexts **ppescc);
+void __RPC_STUB IDebugDocumentContext_EnumCodeContexts_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugDocumentContext_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugSessionProvider interface
+ */
+#ifndef __IDebugSessionProvider_INTERFACE_DEFINED__
+#define __IDebugSessionProvider_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugSessionProvider, 0x51973c29, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c29-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugSessionProvider : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE StartDebugSession(
+        IRemoteDebugApplication *pda) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugSessionProvider, 0x51973c29, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugSessionProviderVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugSessionProvider* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugSessionProvider* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugSessionProvider* This);
+
+    /*** IDebugSessionProvider methods ***/
+    HRESULT (STDMETHODCALLTYPE *StartDebugSession)(
+        IDebugSessionProvider* This,
+        IRemoteDebugApplication *pda);
+
+    END_INTERFACE
+} IDebugSessionProviderVtbl;
+interface IDebugSessionProvider {
+    CONST_VTBL IDebugSessionProviderVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugSessionProvider_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugSessionProvider_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugSessionProvider_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugSessionProvider methods ***/
+#define IDebugSessionProvider_StartDebugSession(This,pda) (This)->lpVtbl->StartDebugSession(This,pda)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugSessionProvider_QueryInterface(IDebugSessionProvider* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugSessionProvider_AddRef(IDebugSessionProvider* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugSessionProvider_Release(IDebugSessionProvider* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugSessionProvider methods ***/
+static FORCEINLINE HRESULT IDebugSessionProvider_StartDebugSession(IDebugSessionProvider* This,IRemoteDebugApplication *pda) {
+    return This->lpVtbl->StartDebugSession(This,pda);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugSessionProvider_StartDebugSession_Proxy(
+    IDebugSessionProvider* This,
+    IRemoteDebugApplication *pda);
+void __RPC_STUB IDebugSessionProvider_StartDebugSession_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugSessionProvider_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IApplicationDebugger interface
+ */
+#ifndef __IApplicationDebugger_INTERFACE_DEFINED__
+#define __IApplicationDebugger_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IApplicationDebugger, 0x51973c2a, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c2a-cb0c-11d0-b5c9-00a0244a0e7a")
+IApplicationDebugger : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE QueryAlive(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateInstanceAtDebugger(
+        REFCLSID rclsid,
+        IUnknown *pUnkOuter,
+        DWORD dwClsContext,
+        REFIID riid,
+        IUnknown **ppvObject) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onDebugOutput(
+        LPCOLESTR pstr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onHandleBreakPoint(
+        IRemoteDebugApplicationThread *prpt,
+        BREAKREASON br,
+        IActiveScriptErrorDebug *pError) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onClose(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onDebuggerEvent(
+        REFIID riid,
+        IUnknown *punk) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IApplicationDebugger, 0x51973c2a, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IApplicationDebuggerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IApplicationDebugger* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IApplicationDebugger* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IApplicationDebugger* This);
+
+    /*** IApplicationDebugger methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryAlive)(
+        IApplicationDebugger* This);
+
+    HRESULT (STDMETHODCALLTYPE *CreateInstanceAtDebugger)(
+        IApplicationDebugger* This,
+        REFCLSID rclsid,
+        IUnknown *pUnkOuter,
+        DWORD dwClsContext,
+        REFIID riid,
+        IUnknown **ppvObject);
+
+    HRESULT (STDMETHODCALLTYPE *onDebugOutput)(
+        IApplicationDebugger* This,
+        LPCOLESTR pstr);
+
+    HRESULT (STDMETHODCALLTYPE *onHandleBreakPoint)(
+        IApplicationDebugger* This,
+        IRemoteDebugApplicationThread *prpt,
+        BREAKREASON br,
+        IActiveScriptErrorDebug *pError);
+
+    HRESULT (STDMETHODCALLTYPE *onClose)(
+        IApplicationDebugger* This);
+
+    HRESULT (STDMETHODCALLTYPE *onDebuggerEvent)(
+        IApplicationDebugger* This,
+        REFIID riid,
+        IUnknown *punk);
+
+    END_INTERFACE
+} IApplicationDebuggerVtbl;
+interface IApplicationDebugger {
+    CONST_VTBL IApplicationDebuggerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IApplicationDebugger_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IApplicationDebugger_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IApplicationDebugger_Release(This) (This)->lpVtbl->Release(This)
+/*** IApplicationDebugger methods ***/
+#define IApplicationDebugger_QueryAlive(This) (This)->lpVtbl->QueryAlive(This)
+#define IApplicationDebugger_CreateInstanceAtDebugger(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject) (This)->lpVtbl->CreateInstanceAtDebugger(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject)
+#define IApplicationDebugger_onDebugOutput(This,pstr) (This)->lpVtbl->onDebugOutput(This,pstr)
+#define IApplicationDebugger_onHandleBreakPoint(This,prpt,br,pError) (This)->lpVtbl->onHandleBreakPoint(This,prpt,br,pError)
+#define IApplicationDebugger_onClose(This) (This)->lpVtbl->onClose(This)
+#define IApplicationDebugger_onDebuggerEvent(This,riid,punk) (This)->lpVtbl->onDebuggerEvent(This,riid,punk)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IApplicationDebugger_QueryInterface(IApplicationDebugger* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IApplicationDebugger_AddRef(IApplicationDebugger* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IApplicationDebugger_Release(IApplicationDebugger* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IApplicationDebugger methods ***/
+static FORCEINLINE HRESULT IApplicationDebugger_QueryAlive(IApplicationDebugger* This) {
+    return This->lpVtbl->QueryAlive(This);
+}
+static FORCEINLINE HRESULT IApplicationDebugger_CreateInstanceAtDebugger(IApplicationDebugger* This,REFCLSID rclsid,IUnknown *pUnkOuter,DWORD dwClsContext,REFIID riid,IUnknown **ppvObject) {
+    return This->lpVtbl->CreateInstanceAtDebugger(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject);
+}
+static FORCEINLINE HRESULT IApplicationDebugger_onDebugOutput(IApplicationDebugger* This,LPCOLESTR pstr) {
+    return This->lpVtbl->onDebugOutput(This,pstr);
+}
+static FORCEINLINE HRESULT IApplicationDebugger_onHandleBreakPoint(IApplicationDebugger* This,IRemoteDebugApplicationThread *prpt,BREAKREASON br,IActiveScriptErrorDebug *pError) {
+    return This->lpVtbl->onHandleBreakPoint(This,prpt,br,pError);
+}
+static FORCEINLINE HRESULT IApplicationDebugger_onClose(IApplicationDebugger* This) {
+    return This->lpVtbl->onClose(This);
+}
+static FORCEINLINE HRESULT IApplicationDebugger_onDebuggerEvent(IApplicationDebugger* This,REFIID riid,IUnknown *punk) {
+    return This->lpVtbl->onDebuggerEvent(This,riid,punk);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IApplicationDebugger_QueryAlive_Proxy(
+    IApplicationDebugger* This);
+void __RPC_STUB IApplicationDebugger_QueryAlive_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationDebugger_CreateInstanceAtDebugger_Proxy(
+    IApplicationDebugger* This,
+    REFCLSID rclsid,
+    IUnknown *pUnkOuter,
+    DWORD dwClsContext,
+    REFIID riid,
+    IUnknown **ppvObject);
+void __RPC_STUB IApplicationDebugger_CreateInstanceAtDebugger_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationDebugger_onDebugOutput_Proxy(
+    IApplicationDebugger* This,
+    LPCOLESTR pstr);
+void __RPC_STUB IApplicationDebugger_onDebugOutput_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationDebugger_onHandleBreakPoint_Proxy(
+    IApplicationDebugger* This,
+    IRemoteDebugApplicationThread *prpt,
+    BREAKREASON br,
+    IActiveScriptErrorDebug *pError);
+void __RPC_STUB IApplicationDebugger_onHandleBreakPoint_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationDebugger_onClose_Proxy(
+    IApplicationDebugger* This);
+void __RPC_STUB IApplicationDebugger_onClose_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationDebugger_onDebuggerEvent_Proxy(
+    IApplicationDebugger* This,
+    REFIID riid,
+    IUnknown *punk);
+void __RPC_STUB IApplicationDebugger_onDebuggerEvent_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IApplicationDebugger_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IApplicationDebuggerUI interface
+ */
+#ifndef __IApplicationDebuggerUI_INTERFACE_DEFINED__
+#define __IApplicationDebuggerUI_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IApplicationDebuggerUI, 0x51973c2b, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c2b-cb0c-11d0-b5c9-00a0244a0e7a")
+IApplicationDebuggerUI : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE BringDocumentToTop(
+        IDebugDocumentText *pddt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE BringDocumentContextToTop(
+        IDebugDocumentContext *pddc) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IApplicationDebuggerUI, 0x51973c2b, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IApplicationDebuggerUIVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IApplicationDebuggerUI* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IApplicationDebuggerUI* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IApplicationDebuggerUI* This);
+
+    /*** IApplicationDebuggerUI methods ***/
+    HRESULT (STDMETHODCALLTYPE *BringDocumentToTop)(
+        IApplicationDebuggerUI* This,
+        IDebugDocumentText *pddt);
+
+    HRESULT (STDMETHODCALLTYPE *BringDocumentContextToTop)(
+        IApplicationDebuggerUI* This,
+        IDebugDocumentContext *pddc);
+
+    END_INTERFACE
+} IApplicationDebuggerUIVtbl;
+interface IApplicationDebuggerUI {
+    CONST_VTBL IApplicationDebuggerUIVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IApplicationDebuggerUI_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IApplicationDebuggerUI_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IApplicationDebuggerUI_Release(This) (This)->lpVtbl->Release(This)
+/*** IApplicationDebuggerUI methods ***/
+#define IApplicationDebuggerUI_BringDocumentToTop(This,pddt) (This)->lpVtbl->BringDocumentToTop(This,pddt)
+#define IApplicationDebuggerUI_BringDocumentContextToTop(This,pddc) (This)->lpVtbl->BringDocumentContextToTop(This,pddc)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IApplicationDebuggerUI_QueryInterface(IApplicationDebuggerUI* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IApplicationDebuggerUI_AddRef(IApplicationDebuggerUI* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IApplicationDebuggerUI_Release(IApplicationDebuggerUI* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IApplicationDebuggerUI methods ***/
+static FORCEINLINE HRESULT IApplicationDebuggerUI_BringDocumentToTop(IApplicationDebuggerUI* This,IDebugDocumentText *pddt) {
+    return This->lpVtbl->BringDocumentToTop(This,pddt);
+}
+static FORCEINLINE HRESULT IApplicationDebuggerUI_BringDocumentContextToTop(IApplicationDebuggerUI* This,IDebugDocumentContext *pddc) {
+    return This->lpVtbl->BringDocumentContextToTop(This,pddc);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IApplicationDebuggerUI_BringDocumentToTop_Proxy(
+    IApplicationDebuggerUI* This,
+    IDebugDocumentText *pddt);
+void __RPC_STUB IApplicationDebuggerUI_BringDocumentToTop_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IApplicationDebuggerUI_BringDocumentContextToTop_Proxy(
+    IApplicationDebuggerUI* This,
+    IDebugDocumentContext *pddc);
+void __RPC_STUB IApplicationDebuggerUI_BringDocumentContextToTop_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IApplicationDebuggerUI_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IMachineDebugManager interface
+ */
+#ifndef __IMachineDebugManager_INTERFACE_DEFINED__
+#define __IMachineDebugManager_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IMachineDebugManager, 0x51973c2c, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c2c-cb0c-11d0-b5c9-00a0244a0e7a")
+IMachineDebugManager : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AddApplication(
+        IRemoteDebugApplication *pda,
+        DWORD *pdwAppCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveApplication(
+        DWORD dwAppCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumApplications(
+        IEnumRemoteDebugApplications **ppeda) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IMachineDebugManager, 0x51973c2c, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IMachineDebugManagerVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IMachineDebugManager* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IMachineDebugManager* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IMachineDebugManager* This);
+
+    /*** IMachineDebugManager methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddApplication)(
+        IMachineDebugManager* This,
+        IRemoteDebugApplication *pda,
+        DWORD *pdwAppCookie);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveApplication)(
+        IMachineDebugManager* This,
+        DWORD dwAppCookie);
+
+    HRESULT (STDMETHODCALLTYPE *EnumApplications)(
+        IMachineDebugManager* This,
+        IEnumRemoteDebugApplications **ppeda);
+
+    END_INTERFACE
+} IMachineDebugManagerVtbl;
+interface IMachineDebugManager {
+    CONST_VTBL IMachineDebugManagerVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IMachineDebugManager_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IMachineDebugManager_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IMachineDebugManager_Release(This) (This)->lpVtbl->Release(This)
+/*** IMachineDebugManager methods ***/
+#define IMachineDebugManager_AddApplication(This,pda,pdwAppCookie) (This)->lpVtbl->AddApplication(This,pda,pdwAppCookie)
+#define IMachineDebugManager_RemoveApplication(This,dwAppCookie) (This)->lpVtbl->RemoveApplication(This,dwAppCookie)
+#define IMachineDebugManager_EnumApplications(This,ppeda) (This)->lpVtbl->EnumApplications(This,ppeda)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IMachineDebugManager_QueryInterface(IMachineDebugManager* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IMachineDebugManager_AddRef(IMachineDebugManager* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IMachineDebugManager_Release(IMachineDebugManager* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IMachineDebugManager methods ***/
+static FORCEINLINE HRESULT IMachineDebugManager_AddApplication(IMachineDebugManager* This,IRemoteDebugApplication *pda,DWORD *pdwAppCookie) {
+    return This->lpVtbl->AddApplication(This,pda,pdwAppCookie);
+}
+static FORCEINLINE HRESULT IMachineDebugManager_RemoveApplication(IMachineDebugManager* This,DWORD dwAppCookie) {
+    return This->lpVtbl->RemoveApplication(This,dwAppCookie);
+}
+static FORCEINLINE HRESULT IMachineDebugManager_EnumApplications(IMachineDebugManager* This,IEnumRemoteDebugApplications **ppeda) {
+    return This->lpVtbl->EnumApplications(This,ppeda);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IMachineDebugManager_AddApplication_Proxy(
+    IMachineDebugManager* This,
+    IRemoteDebugApplication *pda,
+    DWORD *pdwAppCookie);
+void __RPC_STUB IMachineDebugManager_AddApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IMachineDebugManager_RemoveApplication_Proxy(
+    IMachineDebugManager* This,
+    DWORD dwAppCookie);
+void __RPC_STUB IMachineDebugManager_RemoveApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IMachineDebugManager_EnumApplications_Proxy(
+    IMachineDebugManager* This,
+    IEnumRemoteDebugApplications **ppeda);
+void __RPC_STUB IMachineDebugManager_EnumApplications_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IMachineDebugManager_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IMachineDebugManagerCookie interface
+ */
+#ifndef __IMachineDebugManagerCookie_INTERFACE_DEFINED__
+#define __IMachineDebugManagerCookie_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IMachineDebugManagerCookie, 0x51973c2d, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c2d-cb0c-11d0-b5c9-00a0244a0e7a")
+IMachineDebugManagerCookie : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE AddApplication(
+        IRemoteDebugApplication *pda,
+        DWORD dwDebugAppCookie,
+        DWORD *pdwAppCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveApplication(
+        DWORD dwDebugAppCookie,
+        DWORD dwAppCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumApplications(
+        IEnumRemoteDebugApplications **ppeda) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IMachineDebugManagerCookie, 0x51973c2d, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IMachineDebugManagerCookieVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IMachineDebugManagerCookie* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IMachineDebugManagerCookie* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IMachineDebugManagerCookie* This);
+
+    /*** IMachineDebugManagerCookie methods ***/
+    HRESULT (STDMETHODCALLTYPE *AddApplication)(
+        IMachineDebugManagerCookie* This,
+        IRemoteDebugApplication *pda,
+        DWORD dwDebugAppCookie,
+        DWORD *pdwAppCookie);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveApplication)(
+        IMachineDebugManagerCookie* This,
+        DWORD dwDebugAppCookie,
+        DWORD dwAppCookie);
+
+    HRESULT (STDMETHODCALLTYPE *EnumApplications)(
+        IMachineDebugManagerCookie* This,
+        IEnumRemoteDebugApplications **ppeda);
+
+    END_INTERFACE
+} IMachineDebugManagerCookieVtbl;
+interface IMachineDebugManagerCookie {
+    CONST_VTBL IMachineDebugManagerCookieVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IMachineDebugManagerCookie_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IMachineDebugManagerCookie_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IMachineDebugManagerCookie_Release(This) (This)->lpVtbl->Release(This)
+/*** IMachineDebugManagerCookie methods ***/
+#define IMachineDebugManagerCookie_AddApplication(This,pda,dwDebugAppCookie,pdwAppCookie) (This)->lpVtbl->AddApplication(This,pda,dwDebugAppCookie,pdwAppCookie)
+#define IMachineDebugManagerCookie_RemoveApplication(This,dwDebugAppCookie,dwAppCookie) (This)->lpVtbl->RemoveApplication(This,dwDebugAppCookie,dwAppCookie)
+#define IMachineDebugManagerCookie_EnumApplications(This,ppeda) (This)->lpVtbl->EnumApplications(This,ppeda)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IMachineDebugManagerCookie_QueryInterface(IMachineDebugManagerCookie* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IMachineDebugManagerCookie_AddRef(IMachineDebugManagerCookie* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IMachineDebugManagerCookie_Release(IMachineDebugManagerCookie* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IMachineDebugManagerCookie methods ***/
+static FORCEINLINE HRESULT IMachineDebugManagerCookie_AddApplication(IMachineDebugManagerCookie* This,IRemoteDebugApplication *pda,DWORD dwDebugAppCookie,DWORD *pdwAppCookie) {
+    return This->lpVtbl->AddApplication(This,pda,dwDebugAppCookie,pdwAppCookie);
+}
+static FORCEINLINE HRESULT IMachineDebugManagerCookie_RemoveApplication(IMachineDebugManagerCookie* This,DWORD dwDebugAppCookie,DWORD dwAppCookie) {
+    return This->lpVtbl->RemoveApplication(This,dwDebugAppCookie,dwAppCookie);
+}
+static FORCEINLINE HRESULT IMachineDebugManagerCookie_EnumApplications(IMachineDebugManagerCookie* This,IEnumRemoteDebugApplications **ppeda) {
+    return This->lpVtbl->EnumApplications(This,ppeda);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IMachineDebugManagerCookie_AddApplication_Proxy(
+    IMachineDebugManagerCookie* This,
+    IRemoteDebugApplication *pda,
+    DWORD dwDebugAppCookie,
+    DWORD *pdwAppCookie);
+void __RPC_STUB IMachineDebugManagerCookie_AddApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IMachineDebugManagerCookie_RemoveApplication_Proxy(
+    IMachineDebugManagerCookie* This,
+    DWORD dwDebugAppCookie,
+    DWORD dwAppCookie);
+void __RPC_STUB IMachineDebugManagerCookie_RemoveApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IMachineDebugManagerCookie_EnumApplications_Proxy(
+    IMachineDebugManagerCookie* This,
+    IEnumRemoteDebugApplications **ppeda);
+void __RPC_STUB IMachineDebugManagerCookie_EnumApplications_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IMachineDebugManagerCookie_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IMachineDebugManagerEvents interface
+ */
+#ifndef __IMachineDebugManagerEvents_INTERFACE_DEFINED__
+#define __IMachineDebugManagerEvents_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IMachineDebugManagerEvents, 0x51973c2e, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c2e-cb0c-11d0-b5c9-00a0244a0e7a")
+IMachineDebugManagerEvents : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE onAddApplication(
+        IRemoteDebugApplication *pda,
+        DWORD dwAppCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onRemoveApplication(
+        IRemoteDebugApplication *pda,
+        DWORD dwAppCookie) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IMachineDebugManagerEvents, 0x51973c2e, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IMachineDebugManagerEventsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IMachineDebugManagerEvents* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IMachineDebugManagerEvents* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IMachineDebugManagerEvents* This);
+
+    /*** IMachineDebugManagerEvents methods ***/
+    HRESULT (STDMETHODCALLTYPE *onAddApplication)(
+        IMachineDebugManagerEvents* This,
+        IRemoteDebugApplication *pda,
+        DWORD dwAppCookie);
+
+    HRESULT (STDMETHODCALLTYPE *onRemoveApplication)(
+        IMachineDebugManagerEvents* This,
+        IRemoteDebugApplication *pda,
+        DWORD dwAppCookie);
+
+    END_INTERFACE
+} IMachineDebugManagerEventsVtbl;
+interface IMachineDebugManagerEvents {
+    CONST_VTBL IMachineDebugManagerEventsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IMachineDebugManagerEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IMachineDebugManagerEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IMachineDebugManagerEvents_Release(This) (This)->lpVtbl->Release(This)
+/*** IMachineDebugManagerEvents methods ***/
+#define IMachineDebugManagerEvents_onAddApplication(This,pda,dwAppCookie) (This)->lpVtbl->onAddApplication(This,pda,dwAppCookie)
+#define IMachineDebugManagerEvents_onRemoveApplication(This,pda,dwAppCookie) (This)->lpVtbl->onRemoveApplication(This,pda,dwAppCookie)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IMachineDebugManagerEvents_QueryInterface(IMachineDebugManagerEvents* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IMachineDebugManagerEvents_AddRef(IMachineDebugManagerEvents* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IMachineDebugManagerEvents_Release(IMachineDebugManagerEvents* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IMachineDebugManagerEvents methods ***/
+static FORCEINLINE HRESULT IMachineDebugManagerEvents_onAddApplication(IMachineDebugManagerEvents* This,IRemoteDebugApplication *pda,DWORD dwAppCookie) {
+    return This->lpVtbl->onAddApplication(This,pda,dwAppCookie);
+}
+static FORCEINLINE HRESULT IMachineDebugManagerEvents_onRemoveApplication(IMachineDebugManagerEvents* This,IRemoteDebugApplication *pda,DWORD dwAppCookie) {
+    return This->lpVtbl->onRemoveApplication(This,pda,dwAppCookie);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IMachineDebugManagerEvents_onAddApplication_Proxy(
+    IMachineDebugManagerEvents* This,
+    IRemoteDebugApplication *pda,
+    DWORD dwAppCookie);
+void __RPC_STUB IMachineDebugManagerEvents_onAddApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IMachineDebugManagerEvents_onRemoveApplication_Proxy(
+    IMachineDebugManagerEvents* This,
+    IRemoteDebugApplication *pda,
+    DWORD dwAppCookie);
+void __RPC_STUB IMachineDebugManagerEvents_onRemoveApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IMachineDebugManagerEvents_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IProcessDebugManager32 interface
+ */
+#ifndef __IProcessDebugManager32_INTERFACE_DEFINED__
+#define __IProcessDebugManager32_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IProcessDebugManager32, 0x51973c2f, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c2f-cb0c-11d0-b5c9-00a0244a0e7a")
+IProcessDebugManager32 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateApplication(
+        IDebugApplication32 **ppda) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDefaultApplication(
+        IDebugApplication32 **ppda) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddApplication(
+        IDebugApplication32 *pda,
+        DWORD *pdwAppCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveApplication(
+        DWORD dwAppCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateDebugDocumentHelper(
+        IUnknown *punkOuter,
+        IDebugDocumentHelper32 **pddh) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IProcessDebugManager32, 0x51973c2f, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IProcessDebugManager32Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IProcessDebugManager32* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IProcessDebugManager32* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IProcessDebugManager32* This);
+
+    /*** IProcessDebugManager32 methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateApplication)(
+        IProcessDebugManager32* This,
+        IDebugApplication32 **ppda);
+
+    HRESULT (STDMETHODCALLTYPE *GetDefaultApplication)(
+        IProcessDebugManager32* This,
+        IDebugApplication32 **ppda);
+
+    HRESULT (STDMETHODCALLTYPE *AddApplication)(
+        IProcessDebugManager32* This,
+        IDebugApplication32 *pda,
+        DWORD *pdwAppCookie);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveApplication)(
+        IProcessDebugManager32* This,
+        DWORD dwAppCookie);
+
+    HRESULT (STDMETHODCALLTYPE *CreateDebugDocumentHelper)(
+        IProcessDebugManager32* This,
+        IUnknown *punkOuter,
+        IDebugDocumentHelper32 **pddh);
+
+    END_INTERFACE
+} IProcessDebugManager32Vtbl;
+interface IProcessDebugManager32 {
+    CONST_VTBL IProcessDebugManager32Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IProcessDebugManager32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IProcessDebugManager32_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IProcessDebugManager32_Release(This) (This)->lpVtbl->Release(This)
+/*** IProcessDebugManager32 methods ***/
+#define IProcessDebugManager32_CreateApplication(This,ppda) (This)->lpVtbl->CreateApplication(This,ppda)
+#define IProcessDebugManager32_GetDefaultApplication(This,ppda) (This)->lpVtbl->GetDefaultApplication(This,ppda)
+#define IProcessDebugManager32_AddApplication(This,pda,pdwAppCookie) (This)->lpVtbl->AddApplication(This,pda,pdwAppCookie)
+#define IProcessDebugManager32_RemoveApplication(This,dwAppCookie) (This)->lpVtbl->RemoveApplication(This,dwAppCookie)
+#define IProcessDebugManager32_CreateDebugDocumentHelper(This,punkOuter,pddh) (This)->lpVtbl->CreateDebugDocumentHelper(This,punkOuter,pddh)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IProcessDebugManager32_QueryInterface(IProcessDebugManager32* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IProcessDebugManager32_AddRef(IProcessDebugManager32* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IProcessDebugManager32_Release(IProcessDebugManager32* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IProcessDebugManager32 methods ***/
+static FORCEINLINE HRESULT IProcessDebugManager32_CreateApplication(IProcessDebugManager32* This,IDebugApplication32 **ppda) {
+    return This->lpVtbl->CreateApplication(This,ppda);
+}
+static FORCEINLINE HRESULT IProcessDebugManager32_GetDefaultApplication(IProcessDebugManager32* This,IDebugApplication32 **ppda) {
+    return This->lpVtbl->GetDefaultApplication(This,ppda);
+}
+static FORCEINLINE HRESULT IProcessDebugManager32_AddApplication(IProcessDebugManager32* This,IDebugApplication32 *pda,DWORD *pdwAppCookie) {
+    return This->lpVtbl->AddApplication(This,pda,pdwAppCookie);
+}
+static FORCEINLINE HRESULT IProcessDebugManager32_RemoveApplication(IProcessDebugManager32* This,DWORD dwAppCookie) {
+    return This->lpVtbl->RemoveApplication(This,dwAppCookie);
+}
+static FORCEINLINE HRESULT IProcessDebugManager32_CreateDebugDocumentHelper(IProcessDebugManager32* This,IUnknown *punkOuter,IDebugDocumentHelper32 **pddh) {
+    return This->lpVtbl->CreateDebugDocumentHelper(This,punkOuter,pddh);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IProcessDebugManager32_CreateApplication_Proxy(
+    IProcessDebugManager32* This,
+    IDebugApplication32 **ppda);
+void __RPC_STUB IProcessDebugManager32_CreateApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IProcessDebugManager32_GetDefaultApplication_Proxy(
+    IProcessDebugManager32* This,
+    IDebugApplication32 **ppda);
+void __RPC_STUB IProcessDebugManager32_GetDefaultApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IProcessDebugManager32_AddApplication_Proxy(
+    IProcessDebugManager32* This,
+    IDebugApplication32 *pda,
+    DWORD *pdwAppCookie);
+void __RPC_STUB IProcessDebugManager32_AddApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IProcessDebugManager32_RemoveApplication_Proxy(
+    IProcessDebugManager32* This,
+    DWORD dwAppCookie);
+void __RPC_STUB IProcessDebugManager32_RemoveApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IProcessDebugManager32_CreateDebugDocumentHelper_Proxy(
+    IProcessDebugManager32* This,
+    IUnknown *punkOuter,
+    IDebugDocumentHelper32 **pddh);
+void __RPC_STUB IProcessDebugManager32_CreateDebugDocumentHelper_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IProcessDebugManager32_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IProcessDebugManager64 interface
+ */
+#ifndef __IProcessDebugManager64_INTERFACE_DEFINED__
+#define __IProcessDebugManager64_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IProcessDebugManager64, 0x56b9fc1c, 0x63a9, 0x4cc1, 0xac,0x21, 0x08,0x7d,0x69,0xa1,0x7f,0xab);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("56b9fc1c-63a9-4cc1-ac21-087d69a17fab")
+IProcessDebugManager64 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE CreateApplication(
+        IDebugApplication64 **ppda) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDefaultApplication(
+        IDebugApplication64 **ppda) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddApplication(
+        IDebugApplication64 *pda,
+        DWORD *pdwAppCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveApplication(
+        DWORD dwAppCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateDebugDocumentHelper(
+        IUnknown *punkOuter,
+        IDebugDocumentHelper64 **pddh) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IProcessDebugManager64, 0x56b9fc1c, 0x63a9, 0x4cc1, 0xac,0x21, 0x08,0x7d,0x69,0xa1,0x7f,0xab)
+#endif
+#else
+typedef struct IProcessDebugManager64Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IProcessDebugManager64* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IProcessDebugManager64* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IProcessDebugManager64* This);
+
+    /*** IProcessDebugManager64 methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreateApplication)(
+        IProcessDebugManager64* This,
+        IDebugApplication64 **ppda);
+
+    HRESULT (STDMETHODCALLTYPE *GetDefaultApplication)(
+        IProcessDebugManager64* This,
+        IDebugApplication64 **ppda);
+
+    HRESULT (STDMETHODCALLTYPE *AddApplication)(
+        IProcessDebugManager64* This,
+        IDebugApplication64 *pda,
+        DWORD *pdwAppCookie);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveApplication)(
+        IProcessDebugManager64* This,
+        DWORD dwAppCookie);
+
+    HRESULT (STDMETHODCALLTYPE *CreateDebugDocumentHelper)(
+        IProcessDebugManager64* This,
+        IUnknown *punkOuter,
+        IDebugDocumentHelper64 **pddh);
+
+    END_INTERFACE
+} IProcessDebugManager64Vtbl;
+interface IProcessDebugManager64 {
+    CONST_VTBL IProcessDebugManager64Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IProcessDebugManager64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IProcessDebugManager64_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IProcessDebugManager64_Release(This) (This)->lpVtbl->Release(This)
+/*** IProcessDebugManager64 methods ***/
+#define IProcessDebugManager64_CreateApplication(This,ppda) (This)->lpVtbl->CreateApplication(This,ppda)
+#define IProcessDebugManager64_GetDefaultApplication(This,ppda) (This)->lpVtbl->GetDefaultApplication(This,ppda)
+#define IProcessDebugManager64_AddApplication(This,pda,pdwAppCookie) (This)->lpVtbl->AddApplication(This,pda,pdwAppCookie)
+#define IProcessDebugManager64_RemoveApplication(This,dwAppCookie) (This)->lpVtbl->RemoveApplication(This,dwAppCookie)
+#define IProcessDebugManager64_CreateDebugDocumentHelper(This,punkOuter,pddh) (This)->lpVtbl->CreateDebugDocumentHelper(This,punkOuter,pddh)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IProcessDebugManager64_QueryInterface(IProcessDebugManager64* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IProcessDebugManager64_AddRef(IProcessDebugManager64* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IProcessDebugManager64_Release(IProcessDebugManager64* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IProcessDebugManager64 methods ***/
+static FORCEINLINE HRESULT IProcessDebugManager64_CreateApplication(IProcessDebugManager64* This,IDebugApplication64 **ppda) {
+    return This->lpVtbl->CreateApplication(This,ppda);
+}
+static FORCEINLINE HRESULT IProcessDebugManager64_GetDefaultApplication(IProcessDebugManager64* This,IDebugApplication64 **ppda) {
+    return This->lpVtbl->GetDefaultApplication(This,ppda);
+}
+static FORCEINLINE HRESULT IProcessDebugManager64_AddApplication(IProcessDebugManager64* This,IDebugApplication64 *pda,DWORD *pdwAppCookie) {
+    return This->lpVtbl->AddApplication(This,pda,pdwAppCookie);
+}
+static FORCEINLINE HRESULT IProcessDebugManager64_RemoveApplication(IProcessDebugManager64* This,DWORD dwAppCookie) {
+    return This->lpVtbl->RemoveApplication(This,dwAppCookie);
+}
+static FORCEINLINE HRESULT IProcessDebugManager64_CreateDebugDocumentHelper(IProcessDebugManager64* This,IUnknown *punkOuter,IDebugDocumentHelper64 **pddh) {
+    return This->lpVtbl->CreateDebugDocumentHelper(This,punkOuter,pddh);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IProcessDebugManager64_CreateApplication_Proxy(
+    IProcessDebugManager64* This,
+    IDebugApplication64 **ppda);
+void __RPC_STUB IProcessDebugManager64_CreateApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IProcessDebugManager64_GetDefaultApplication_Proxy(
+    IProcessDebugManager64* This,
+    IDebugApplication64 **ppda);
+void __RPC_STUB IProcessDebugManager64_GetDefaultApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IProcessDebugManager64_AddApplication_Proxy(
+    IProcessDebugManager64* This,
+    IDebugApplication64 *pda,
+    DWORD *pdwAppCookie);
+void __RPC_STUB IProcessDebugManager64_AddApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IProcessDebugManager64_RemoveApplication_Proxy(
+    IProcessDebugManager64* This,
+    DWORD dwAppCookie);
+void __RPC_STUB IProcessDebugManager64_RemoveApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IProcessDebugManager64_CreateDebugDocumentHelper_Proxy(
+    IProcessDebugManager64* This,
+    IUnknown *punkOuter,
+    IDebugDocumentHelper64 **pddh);
+void __RPC_STUB IProcessDebugManager64_CreateDebugDocumentHelper_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IProcessDebugManager64_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IRemoteDebugApplication interface
+ */
+#ifndef __IRemoteDebugApplication_INTERFACE_DEFINED__
+#define __IRemoteDebugApplication_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IRemoteDebugApplication, 0x51973c30, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c30-cb0c-11d0-b5c9-00a0244a0e7a")
+IRemoteDebugApplication : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE ResumeFromBreakPoint(
+        IRemoteDebugApplicationThread *prptFocus,
+        BREAKRESUMEACTION bra,
+        ERRORRESUMEACTION era) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CauseBreak(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE ConnectDebugger(
+        IApplicationDebugger *pad) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DisconnectDebugger(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDebugger(
+        IApplicationDebugger **pad) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateInstanceAtApplication(
+        REFCLSID rclsid,
+        IUnknown *pUnkOuter,
+        DWORD dwClsContext,
+        REFIID riid,
+        IUnknown **ppvObject) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryAlive(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumThreads(
+        IEnumRemoteDebugApplicationThreads **pperdat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetName(
+        BSTR *pbstrName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRootNode(
+        IDebugApplicationNode **ppdanRoot) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumGlobalExpressionContexts(
+        IEnumDebugExpressionContexts **ppedec) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IRemoteDebugApplication, 0x51973c30, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IRemoteDebugApplicationVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IRemoteDebugApplication* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IRemoteDebugApplication* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IRemoteDebugApplication* This);
+
+    /*** IRemoteDebugApplication methods ***/
+    HRESULT (STDMETHODCALLTYPE *ResumeFromBreakPoint)(
+        IRemoteDebugApplication* This,
+        IRemoteDebugApplicationThread *prptFocus,
+        BREAKRESUMEACTION bra,
+        ERRORRESUMEACTION era);
+
+    HRESULT (STDMETHODCALLTYPE *CauseBreak)(
+        IRemoteDebugApplication* This);
+
+    HRESULT (STDMETHODCALLTYPE *ConnectDebugger)(
+        IRemoteDebugApplication* This,
+        IApplicationDebugger *pad);
+
+    HRESULT (STDMETHODCALLTYPE *DisconnectDebugger)(
+        IRemoteDebugApplication* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDebugger)(
+        IRemoteDebugApplication* This,
+        IApplicationDebugger **pad);
+
+    HRESULT (STDMETHODCALLTYPE *CreateInstanceAtApplication)(
+        IRemoteDebugApplication* This,
+        REFCLSID rclsid,
+        IUnknown *pUnkOuter,
+        DWORD dwClsContext,
+        REFIID riid,
+        IUnknown **ppvObject);
+
+    HRESULT (STDMETHODCALLTYPE *QueryAlive)(
+        IRemoteDebugApplication* This);
+
+    HRESULT (STDMETHODCALLTYPE *EnumThreads)(
+        IRemoteDebugApplication* This,
+        IEnumRemoteDebugApplicationThreads **pperdat);
+
+    HRESULT (STDMETHODCALLTYPE *GetName)(
+        IRemoteDebugApplication* This,
+        BSTR *pbstrName);
+
+    HRESULT (STDMETHODCALLTYPE *GetRootNode)(
+        IRemoteDebugApplication* This,
+        IDebugApplicationNode **ppdanRoot);
+
+    HRESULT (STDMETHODCALLTYPE *EnumGlobalExpressionContexts)(
+        IRemoteDebugApplication* This,
+        IEnumDebugExpressionContexts **ppedec);
+
+    END_INTERFACE
+} IRemoteDebugApplicationVtbl;
+interface IRemoteDebugApplication {
+    CONST_VTBL IRemoteDebugApplicationVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IRemoteDebugApplication_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IRemoteDebugApplication_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRemoteDebugApplication_Release(This) (This)->lpVtbl->Release(This)
+/*** IRemoteDebugApplication methods ***/
+#define IRemoteDebugApplication_ResumeFromBreakPoint(This,prptFocus,bra,era) (This)->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era)
+#define IRemoteDebugApplication_CauseBreak(This) (This)->lpVtbl->CauseBreak(This)
+#define IRemoteDebugApplication_ConnectDebugger(This,pad) (This)->lpVtbl->ConnectDebugger(This,pad)
+#define IRemoteDebugApplication_DisconnectDebugger(This) (This)->lpVtbl->DisconnectDebugger(This)
+#define IRemoteDebugApplication_GetDebugger(This,pad) (This)->lpVtbl->GetDebugger(This,pad)
+#define IRemoteDebugApplication_CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject) (This)->lpVtbl->CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject)
+#define IRemoteDebugApplication_QueryAlive(This) (This)->lpVtbl->QueryAlive(This)
+#define IRemoteDebugApplication_EnumThreads(This,pperdat) (This)->lpVtbl->EnumThreads(This,pperdat)
+#define IRemoteDebugApplication_GetName(This,pbstrName) (This)->lpVtbl->GetName(This,pbstrName)
+#define IRemoteDebugApplication_GetRootNode(This,ppdanRoot) (This)->lpVtbl->GetRootNode(This,ppdanRoot)
+#define IRemoteDebugApplication_EnumGlobalExpressionContexts(This,ppedec) (This)->lpVtbl->EnumGlobalExpressionContexts(This,ppedec)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IRemoteDebugApplication_QueryInterface(IRemoteDebugApplication* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IRemoteDebugApplication_AddRef(IRemoteDebugApplication* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IRemoteDebugApplication_Release(IRemoteDebugApplication* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRemoteDebugApplication methods ***/
+static FORCEINLINE HRESULT IRemoteDebugApplication_ResumeFromBreakPoint(IRemoteDebugApplication* This,IRemoteDebugApplicationThread *prptFocus,BREAKRESUMEACTION bra,ERRORRESUMEACTION era) {
+    return This->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplication_CauseBreak(IRemoteDebugApplication* This) {
+    return This->lpVtbl->CauseBreak(This);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplication_ConnectDebugger(IRemoteDebugApplication* This,IApplicationDebugger *pad) {
+    return This->lpVtbl->ConnectDebugger(This,pad);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplication_DisconnectDebugger(IRemoteDebugApplication* This) {
+    return This->lpVtbl->DisconnectDebugger(This);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplication_GetDebugger(IRemoteDebugApplication* This,IApplicationDebugger **pad) {
+    return This->lpVtbl->GetDebugger(This,pad);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplication_CreateInstanceAtApplication(IRemoteDebugApplication* This,REFCLSID rclsid,IUnknown *pUnkOuter,DWORD dwClsContext,REFIID riid,IUnknown **ppvObject) {
+    return This->lpVtbl->CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplication_QueryAlive(IRemoteDebugApplication* This) {
+    return This->lpVtbl->QueryAlive(This);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplication_EnumThreads(IRemoteDebugApplication* This,IEnumRemoteDebugApplicationThreads **pperdat) {
+    return This->lpVtbl->EnumThreads(This,pperdat);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplication_GetName(IRemoteDebugApplication* This,BSTR *pbstrName) {
+    return This->lpVtbl->GetName(This,pbstrName);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplication_GetRootNode(IRemoteDebugApplication* This,IDebugApplicationNode **ppdanRoot) {
+    return This->lpVtbl->GetRootNode(This,ppdanRoot);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplication_EnumGlobalExpressionContexts(IRemoteDebugApplication* This,IEnumDebugExpressionContexts **ppedec) {
+    return This->lpVtbl->EnumGlobalExpressionContexts(This,ppedec);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_ResumeFromBreakPoint_Proxy(
+    IRemoteDebugApplication* This,
+    IRemoteDebugApplicationThread *prptFocus,
+    BREAKRESUMEACTION bra,
+    ERRORRESUMEACTION era);
+void __RPC_STUB IRemoteDebugApplication_ResumeFromBreakPoint_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_CauseBreak_Proxy(
+    IRemoteDebugApplication* This);
+void __RPC_STUB IRemoteDebugApplication_CauseBreak_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_ConnectDebugger_Proxy(
+    IRemoteDebugApplication* This,
+    IApplicationDebugger *pad);
+void __RPC_STUB IRemoteDebugApplication_ConnectDebugger_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_DisconnectDebugger_Proxy(
+    IRemoteDebugApplication* This);
+void __RPC_STUB IRemoteDebugApplication_DisconnectDebugger_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_GetDebugger_Proxy(
+    IRemoteDebugApplication* This,
+    IApplicationDebugger **pad);
+void __RPC_STUB IRemoteDebugApplication_GetDebugger_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_CreateInstanceAtApplication_Proxy(
+    IRemoteDebugApplication* This,
+    REFCLSID rclsid,
+    IUnknown *pUnkOuter,
+    DWORD dwClsContext,
+    REFIID riid,
+    IUnknown **ppvObject);
+void __RPC_STUB IRemoteDebugApplication_CreateInstanceAtApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_QueryAlive_Proxy(
+    IRemoteDebugApplication* This);
+void __RPC_STUB IRemoteDebugApplication_QueryAlive_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_EnumThreads_Proxy(
+    IRemoteDebugApplication* This,
+    IEnumRemoteDebugApplicationThreads **pperdat);
+void __RPC_STUB IRemoteDebugApplication_EnumThreads_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_GetName_Proxy(
+    IRemoteDebugApplication* This,
+    BSTR *pbstrName);
+void __RPC_STUB IRemoteDebugApplication_GetName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_GetRootNode_Proxy(
+    IRemoteDebugApplication* This,
+    IDebugApplicationNode **ppdanRoot);
+void __RPC_STUB IRemoteDebugApplication_GetRootNode_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication_EnumGlobalExpressionContexts_Proxy(
+    IRemoteDebugApplication* This,
+    IEnumDebugExpressionContexts **ppedec);
+void __RPC_STUB IRemoteDebugApplication_EnumGlobalExpressionContexts_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IRemoteDebugApplication_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugApplication32 interface
+ */
+#ifndef __IDebugApplication32_INTERFACE_DEFINED__
+#define __IDebugApplication32_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugApplication32, 0x51973c32, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c32-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugApplication32 : public IRemoteDebugApplication
+{
+    virtual HRESULT STDMETHODCALLTYPE SetName(
+        LPCOLESTR pstrName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE StepOutComplete(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DebugOutput(
+        LPCOLESTR pstr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE StartDebugSession(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE HandleBreakPoint(
+        BREAKREASON br,
+        BREAKRESUMEACTION *pbra) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Close(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetBreakFlags(
+        APPBREAKFLAGS *pabf,
+        IRemoteDebugApplicationThread **pprdatSteppingThread) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCurrentThread(
+        IDebugApplicationThread **pat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateAsyncDebugOperation(
+        IDebugSyncOperation *psdo,
+        IDebugAsyncOperation **ppado) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddStackFrameSniffer(
+        IDebugStackFrameSniffer *pdsfs,
+        DWORD *pdwCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveStackFrameSniffer(
+        DWORD dwCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryCurrentThreadIsDebuggerThread(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SynchronousCallInDebuggerThread(
+        IDebugThreadCall32 *pptc,
+        DWORD dwParam1,
+        DWORD dwParam2,
+        DWORD dwParam3) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateApplicationNode(
+        IDebugApplicationNode **ppdanNew) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE FireDebuggerEvent(
+        REFGUID riid,
+        IUnknown *punk) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE HandleRuntimeError(
+        IActiveScriptErrorDebug *pErrorDebug,
+        IActiveScriptSite *pScriptSite,
+        BREAKRESUMEACTION *pbra,
+        ERRORRESUMEACTION *perra,
+        WINBOOL *pfCallOnScriptError) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE FCanJitDebug(
+        ) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE FIsAutoJitDebugEnabled(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddGlobalExpressionContextProvider(
+        IProvideExpressionContexts *pdsfs,
+        DWORD *pdwCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveGlobalExpressionContextProvider(
+        DWORD dwCookie) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugApplication32, 0x51973c32, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugApplication32Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugApplication32* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugApplication32* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugApplication32* This);
+
+    /*** IRemoteDebugApplication methods ***/
+    HRESULT (STDMETHODCALLTYPE *ResumeFromBreakPoint)(
+        IDebugApplication32* This,
+        IRemoteDebugApplicationThread *prptFocus,
+        BREAKRESUMEACTION bra,
+        ERRORRESUMEACTION era);
+
+    HRESULT (STDMETHODCALLTYPE *CauseBreak)(
+        IDebugApplication32* This);
+
+    HRESULT (STDMETHODCALLTYPE *ConnectDebugger)(
+        IDebugApplication32* This,
+        IApplicationDebugger *pad);
+
+    HRESULT (STDMETHODCALLTYPE *DisconnectDebugger)(
+        IDebugApplication32* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDebugger)(
+        IDebugApplication32* This,
+        IApplicationDebugger **pad);
+
+    HRESULT (STDMETHODCALLTYPE *CreateInstanceAtApplication)(
+        IDebugApplication32* This,
+        REFCLSID rclsid,
+        IUnknown *pUnkOuter,
+        DWORD dwClsContext,
+        REFIID riid,
+        IUnknown **ppvObject);
+
+    HRESULT (STDMETHODCALLTYPE *QueryAlive)(
+        IDebugApplication32* This);
+
+    HRESULT (STDMETHODCALLTYPE *EnumThreads)(
+        IDebugApplication32* This,
+        IEnumRemoteDebugApplicationThreads **pperdat);
+
+    HRESULT (STDMETHODCALLTYPE *GetName)(
+        IDebugApplication32* This,
+        BSTR *pbstrName);
+
+    HRESULT (STDMETHODCALLTYPE *GetRootNode)(
+        IDebugApplication32* This,
+        IDebugApplicationNode **ppdanRoot);
+
+    HRESULT (STDMETHODCALLTYPE *EnumGlobalExpressionContexts)(
+        IDebugApplication32* This,
+        IEnumDebugExpressionContexts **ppedec);
+
+    /*** IDebugApplication32 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetName)(
+        IDebugApplication32* This,
+        LPCOLESTR pstrName);
+
+    HRESULT (STDMETHODCALLTYPE *StepOutComplete)(
+        IDebugApplication32* This);
+
+    HRESULT (STDMETHODCALLTYPE *DebugOutput)(
+        IDebugApplication32* This,
+        LPCOLESTR pstr);
+
+    HRESULT (STDMETHODCALLTYPE *StartDebugSession)(
+        IDebugApplication32* This);
+
+    HRESULT (STDMETHODCALLTYPE *HandleBreakPoint)(
+        IDebugApplication32* This,
+        BREAKREASON br,
+        BREAKRESUMEACTION *pbra);
+
+    HRESULT (STDMETHODCALLTYPE *Close)(
+        IDebugApplication32* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetBreakFlags)(
+        IDebugApplication32* This,
+        APPBREAKFLAGS *pabf,
+        IRemoteDebugApplicationThread **pprdatSteppingThread);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentThread)(
+        IDebugApplication32* This,
+        IDebugApplicationThread **pat);
+
+    HRESULT (STDMETHODCALLTYPE *CreateAsyncDebugOperation)(
+        IDebugApplication32* This,
+        IDebugSyncOperation *psdo,
+        IDebugAsyncOperation **ppado);
+
+    HRESULT (STDMETHODCALLTYPE *AddStackFrameSniffer)(
+        IDebugApplication32* This,
+        IDebugStackFrameSniffer *pdsfs,
+        DWORD *pdwCookie);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveStackFrameSniffer)(
+        IDebugApplication32* This,
+        DWORD dwCookie);
+
+    HRESULT (STDMETHODCALLTYPE *QueryCurrentThreadIsDebuggerThread)(
+        IDebugApplication32* This);
+
+    HRESULT (STDMETHODCALLTYPE *SynchronousCallInDebuggerThread)(
+        IDebugApplication32* This,
+        IDebugThreadCall32 *pptc,
+        DWORD dwParam1,
+        DWORD dwParam2,
+        DWORD dwParam3);
+
+    HRESULT (STDMETHODCALLTYPE *CreateApplicationNode)(
+        IDebugApplication32* This,
+        IDebugApplicationNode **ppdanNew);
+
+    HRESULT (STDMETHODCALLTYPE *FireDebuggerEvent)(
+        IDebugApplication32* This,
+        REFGUID riid,
+        IUnknown *punk);
+
+    HRESULT (STDMETHODCALLTYPE *HandleRuntimeError)(
+        IDebugApplication32* This,
+        IActiveScriptErrorDebug *pErrorDebug,
+        IActiveScriptSite *pScriptSite,
+        BREAKRESUMEACTION *pbra,
+        ERRORRESUMEACTION *perra,
+        WINBOOL *pfCallOnScriptError);
+
+    WINBOOL (STDMETHODCALLTYPE *FCanJitDebug)(
+        IDebugApplication32* This);
+
+    WINBOOL (STDMETHODCALLTYPE *FIsAutoJitDebugEnabled)(
+        IDebugApplication32* This);
+
+    HRESULT (STDMETHODCALLTYPE *AddGlobalExpressionContextProvider)(
+        IDebugApplication32* This,
+        IProvideExpressionContexts *pdsfs,
+        DWORD *pdwCookie);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveGlobalExpressionContextProvider)(
+        IDebugApplication32* This,
+        DWORD dwCookie);
+
+    END_INTERFACE
+} IDebugApplication32Vtbl;
+interface IDebugApplication32 {
+    CONST_VTBL IDebugApplication32Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugApplication32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugApplication32_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugApplication32_Release(This) (This)->lpVtbl->Release(This)
+/*** IRemoteDebugApplication methods ***/
+#define IDebugApplication32_ResumeFromBreakPoint(This,prptFocus,bra,era) (This)->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era)
+#define IDebugApplication32_CauseBreak(This) (This)->lpVtbl->CauseBreak(This)
+#define IDebugApplication32_ConnectDebugger(This,pad) (This)->lpVtbl->ConnectDebugger(This,pad)
+#define IDebugApplication32_DisconnectDebugger(This) (This)->lpVtbl->DisconnectDebugger(This)
+#define IDebugApplication32_GetDebugger(This,pad) (This)->lpVtbl->GetDebugger(This,pad)
+#define IDebugApplication32_CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject) (This)->lpVtbl->CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject)
+#define IDebugApplication32_QueryAlive(This) (This)->lpVtbl->QueryAlive(This)
+#define IDebugApplication32_EnumThreads(This,pperdat) (This)->lpVtbl->EnumThreads(This,pperdat)
+#define IDebugApplication32_GetName(This,pbstrName) (This)->lpVtbl->GetName(This,pbstrName)
+#define IDebugApplication32_GetRootNode(This,ppdanRoot) (This)->lpVtbl->GetRootNode(This,ppdanRoot)
+#define IDebugApplication32_EnumGlobalExpressionContexts(This,ppedec) (This)->lpVtbl->EnumGlobalExpressionContexts(This,ppedec)
+/*** IDebugApplication32 methods ***/
+#define IDebugApplication32_SetName(This,pstrName) (This)->lpVtbl->SetName(This,pstrName)
+#define IDebugApplication32_StepOutComplete(This) (This)->lpVtbl->StepOutComplete(This)
+#define IDebugApplication32_DebugOutput(This,pstr) (This)->lpVtbl->DebugOutput(This,pstr)
+#define IDebugApplication32_StartDebugSession(This) (This)->lpVtbl->StartDebugSession(This)
+#define IDebugApplication32_HandleBreakPoint(This,br,pbra) (This)->lpVtbl->HandleBreakPoint(This,br,pbra)
+#define IDebugApplication32_Close(This) (This)->lpVtbl->Close(This)
+#define IDebugApplication32_GetBreakFlags(This,pabf,pprdatSteppingThread) (This)->lpVtbl->GetBreakFlags(This,pabf,pprdatSteppingThread)
+#define IDebugApplication32_GetCurrentThread(This,pat) (This)->lpVtbl->GetCurrentThread(This,pat)
+#define IDebugApplication32_CreateAsyncDebugOperation(This,psdo,ppado) (This)->lpVtbl->CreateAsyncDebugOperation(This,psdo,ppado)
+#define IDebugApplication32_AddStackFrameSniffer(This,pdsfs,pdwCookie) (This)->lpVtbl->AddStackFrameSniffer(This,pdsfs,pdwCookie)
+#define IDebugApplication32_RemoveStackFrameSniffer(This,dwCookie) (This)->lpVtbl->RemoveStackFrameSniffer(This,dwCookie)
+#define IDebugApplication32_QueryCurrentThreadIsDebuggerThread(This) (This)->lpVtbl->QueryCurrentThreadIsDebuggerThread(This)
+#define IDebugApplication32_SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3)
+#define IDebugApplication32_CreateApplicationNode(This,ppdanNew) (This)->lpVtbl->CreateApplicationNode(This,ppdanNew)
+#define IDebugApplication32_FireDebuggerEvent(This,riid,punk) (This)->lpVtbl->FireDebuggerEvent(This,riid,punk)
+#define IDebugApplication32_HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError) (This)->lpVtbl->HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError)
+#define IDebugApplication32_FCanJitDebug(This) (This)->lpVtbl->FCanJitDebug(This)
+#define IDebugApplication32_FIsAutoJitDebugEnabled(This) (This)->lpVtbl->FIsAutoJitDebugEnabled(This)
+#define IDebugApplication32_AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie) (This)->lpVtbl->AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie)
+#define IDebugApplication32_RemoveGlobalExpressionContextProvider(This,dwCookie) (This)->lpVtbl->RemoveGlobalExpressionContextProvider(This,dwCookie)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugApplication32_QueryInterface(IDebugApplication32* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugApplication32_AddRef(IDebugApplication32* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugApplication32_Release(IDebugApplication32* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRemoteDebugApplication methods ***/
+static FORCEINLINE HRESULT IDebugApplication32_ResumeFromBreakPoint(IDebugApplication32* This,IRemoteDebugApplicationThread *prptFocus,BREAKRESUMEACTION bra,ERRORRESUMEACTION era) {
+    return This->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era);
+}
+static FORCEINLINE HRESULT IDebugApplication32_CauseBreak(IDebugApplication32* This) {
+    return This->lpVtbl->CauseBreak(This);
+}
+static FORCEINLINE HRESULT IDebugApplication32_ConnectDebugger(IDebugApplication32* This,IApplicationDebugger *pad) {
+    return This->lpVtbl->ConnectDebugger(This,pad);
+}
+static FORCEINLINE HRESULT IDebugApplication32_DisconnectDebugger(IDebugApplication32* This) {
+    return This->lpVtbl->DisconnectDebugger(This);
+}
+static FORCEINLINE HRESULT IDebugApplication32_GetDebugger(IDebugApplication32* This,IApplicationDebugger **pad) {
+    return This->lpVtbl->GetDebugger(This,pad);
+}
+static FORCEINLINE HRESULT IDebugApplication32_CreateInstanceAtApplication(IDebugApplication32* This,REFCLSID rclsid,IUnknown *pUnkOuter,DWORD dwClsContext,REFIID riid,IUnknown **ppvObject) {
+    return This->lpVtbl->CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject);
+}
+static FORCEINLINE HRESULT IDebugApplication32_QueryAlive(IDebugApplication32* This) {
+    return This->lpVtbl->QueryAlive(This);
+}
+static FORCEINLINE HRESULT IDebugApplication32_EnumThreads(IDebugApplication32* This,IEnumRemoteDebugApplicationThreads **pperdat) {
+    return This->lpVtbl->EnumThreads(This,pperdat);
+}
+static FORCEINLINE HRESULT IDebugApplication32_GetName(IDebugApplication32* This,BSTR *pbstrName) {
+    return This->lpVtbl->GetName(This,pbstrName);
+}
+static FORCEINLINE HRESULT IDebugApplication32_GetRootNode(IDebugApplication32* This,IDebugApplicationNode **ppdanRoot) {
+    return This->lpVtbl->GetRootNode(This,ppdanRoot);
+}
+static FORCEINLINE HRESULT IDebugApplication32_EnumGlobalExpressionContexts(IDebugApplication32* This,IEnumDebugExpressionContexts **ppedec) {
+    return This->lpVtbl->EnumGlobalExpressionContexts(This,ppedec);
+}
+/*** IDebugApplication32 methods ***/
+static FORCEINLINE HRESULT IDebugApplication32_SetName(IDebugApplication32* This,LPCOLESTR pstrName) {
+    return This->lpVtbl->SetName(This,pstrName);
+}
+static FORCEINLINE HRESULT IDebugApplication32_StepOutComplete(IDebugApplication32* This) {
+    return This->lpVtbl->StepOutComplete(This);
+}
+static FORCEINLINE HRESULT IDebugApplication32_DebugOutput(IDebugApplication32* This,LPCOLESTR pstr) {
+    return This->lpVtbl->DebugOutput(This,pstr);
+}
+static FORCEINLINE HRESULT IDebugApplication32_StartDebugSession(IDebugApplication32* This) {
+    return This->lpVtbl->StartDebugSession(This);
+}
+static FORCEINLINE HRESULT IDebugApplication32_HandleBreakPoint(IDebugApplication32* This,BREAKREASON br,BREAKRESUMEACTION *pbra) {
+    return This->lpVtbl->HandleBreakPoint(This,br,pbra);
+}
+static FORCEINLINE HRESULT IDebugApplication32_Close(IDebugApplication32* This) {
+    return This->lpVtbl->Close(This);
+}
+static FORCEINLINE HRESULT IDebugApplication32_GetBreakFlags(IDebugApplication32* This,APPBREAKFLAGS *pabf,IRemoteDebugApplicationThread **pprdatSteppingThread) {
+    return This->lpVtbl->GetBreakFlags(This,pabf,pprdatSteppingThread);
+}
+static FORCEINLINE HRESULT IDebugApplication32_GetCurrentThread(IDebugApplication32* This,IDebugApplicationThread **pat) {
+    return This->lpVtbl->GetCurrentThread(This,pat);
+}
+static FORCEINLINE HRESULT IDebugApplication32_CreateAsyncDebugOperation(IDebugApplication32* This,IDebugSyncOperation *psdo,IDebugAsyncOperation **ppado) {
+    return This->lpVtbl->CreateAsyncDebugOperation(This,psdo,ppado);
+}
+static FORCEINLINE HRESULT IDebugApplication32_AddStackFrameSniffer(IDebugApplication32* This,IDebugStackFrameSniffer *pdsfs,DWORD *pdwCookie) {
+    return This->lpVtbl->AddStackFrameSniffer(This,pdsfs,pdwCookie);
+}
+static FORCEINLINE HRESULT IDebugApplication32_RemoveStackFrameSniffer(IDebugApplication32* This,DWORD dwCookie) {
+    return This->lpVtbl->RemoveStackFrameSniffer(This,dwCookie);
+}
+static FORCEINLINE HRESULT IDebugApplication32_QueryCurrentThreadIsDebuggerThread(IDebugApplication32* This) {
+    return This->lpVtbl->QueryCurrentThreadIsDebuggerThread(This);
+}
+static FORCEINLINE HRESULT IDebugApplication32_SynchronousCallInDebuggerThread(IDebugApplication32* This,IDebugThreadCall32 *pptc,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3) {
+    return This->lpVtbl->SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3);
+}
+static FORCEINLINE HRESULT IDebugApplication32_CreateApplicationNode(IDebugApplication32* This,IDebugApplicationNode **ppdanNew) {
+    return This->lpVtbl->CreateApplicationNode(This,ppdanNew);
+}
+static FORCEINLINE HRESULT IDebugApplication32_FireDebuggerEvent(IDebugApplication32* This,REFGUID riid,IUnknown *punk) {
+    return This->lpVtbl->FireDebuggerEvent(This,riid,punk);
+}
+static FORCEINLINE HRESULT IDebugApplication32_HandleRuntimeError(IDebugApplication32* This,IActiveScriptErrorDebug *pErrorDebug,IActiveScriptSite *pScriptSite,BREAKRESUMEACTION *pbra,ERRORRESUMEACTION *perra,WINBOOL *pfCallOnScriptError) {
+    return This->lpVtbl->HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError);
+}
+static FORCEINLINE WINBOOL IDebugApplication32_FCanJitDebug(IDebugApplication32* This) {
+    return This->lpVtbl->FCanJitDebug(This);
+}
+static FORCEINLINE WINBOOL IDebugApplication32_FIsAutoJitDebugEnabled(IDebugApplication32* This) {
+    return This->lpVtbl->FIsAutoJitDebugEnabled(This);
+}
+static FORCEINLINE HRESULT IDebugApplication32_AddGlobalExpressionContextProvider(IDebugApplication32* This,IProvideExpressionContexts *pdsfs,DWORD *pdwCookie) {
+    return This->lpVtbl->AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie);
+}
+static FORCEINLINE HRESULT IDebugApplication32_RemoveGlobalExpressionContextProvider(IDebugApplication32* This,DWORD dwCookie) {
+    return This->lpVtbl->RemoveGlobalExpressionContextProvider(This,dwCookie);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugApplication32_SetName_Proxy(
+    IDebugApplication32* This,
+    LPCOLESTR pstrName);
+void __RPC_STUB IDebugApplication32_SetName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_StepOutComplete_Proxy(
+    IDebugApplication32* This);
+void __RPC_STUB IDebugApplication32_StepOutComplete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_DebugOutput_Proxy(
+    IDebugApplication32* This,
+    LPCOLESTR pstr);
+void __RPC_STUB IDebugApplication32_DebugOutput_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_StartDebugSession_Proxy(
+    IDebugApplication32* This);
+void __RPC_STUB IDebugApplication32_StartDebugSession_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_HandleBreakPoint_Proxy(
+    IDebugApplication32* This,
+    BREAKREASON br,
+    BREAKRESUMEACTION *pbra);
+void __RPC_STUB IDebugApplication32_HandleBreakPoint_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_Close_Proxy(
+    IDebugApplication32* This);
+void __RPC_STUB IDebugApplication32_Close_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_GetBreakFlags_Proxy(
+    IDebugApplication32* This,
+    APPBREAKFLAGS *pabf,
+    IRemoteDebugApplicationThread **pprdatSteppingThread);
+void __RPC_STUB IDebugApplication32_GetBreakFlags_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_GetCurrentThread_Proxy(
+    IDebugApplication32* This,
+    IDebugApplicationThread **pat);
+void __RPC_STUB IDebugApplication32_GetCurrentThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_CreateAsyncDebugOperation_Proxy(
+    IDebugApplication32* This,
+    IDebugSyncOperation *psdo,
+    IDebugAsyncOperation **ppado);
+void __RPC_STUB IDebugApplication32_CreateAsyncDebugOperation_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_AddStackFrameSniffer_Proxy(
+    IDebugApplication32* This,
+    IDebugStackFrameSniffer *pdsfs,
+    DWORD *pdwCookie);
+void __RPC_STUB IDebugApplication32_AddStackFrameSniffer_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_RemoveStackFrameSniffer_Proxy(
+    IDebugApplication32* This,
+    DWORD dwCookie);
+void __RPC_STUB IDebugApplication32_RemoveStackFrameSniffer_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_QueryCurrentThreadIsDebuggerThread_Proxy(
+    IDebugApplication32* This);
+void __RPC_STUB IDebugApplication32_QueryCurrentThreadIsDebuggerThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_SynchronousCallInDebuggerThread_Proxy(
+    IDebugApplication32* This,
+    IDebugThreadCall32 *pptc,
+    DWORD dwParam1,
+    DWORD dwParam2,
+    DWORD dwParam3);
+void __RPC_STUB IDebugApplication32_SynchronousCallInDebuggerThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_CreateApplicationNode_Proxy(
+    IDebugApplication32* This,
+    IDebugApplicationNode **ppdanNew);
+void __RPC_STUB IDebugApplication32_CreateApplicationNode_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_FireDebuggerEvent_Proxy(
+    IDebugApplication32* This,
+    REFGUID riid,
+    IUnknown *punk);
+void __RPC_STUB IDebugApplication32_FireDebuggerEvent_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_HandleRuntimeError_Proxy(
+    IDebugApplication32* This,
+    IActiveScriptErrorDebug *pErrorDebug,
+    IActiveScriptSite *pScriptSite,
+    BREAKRESUMEACTION *pbra,
+    ERRORRESUMEACTION *perra,
+    WINBOOL *pfCallOnScriptError);
+void __RPC_STUB IDebugApplication32_HandleRuntimeError_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+WINBOOL STDMETHODCALLTYPE IDebugApplication32_FCanJitDebug_Proxy(
+    IDebugApplication32* This);
+void __RPC_STUB IDebugApplication32_FCanJitDebug_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+WINBOOL STDMETHODCALLTYPE IDebugApplication32_FIsAutoJitDebugEnabled_Proxy(
+    IDebugApplication32* This);
+void __RPC_STUB IDebugApplication32_FIsAutoJitDebugEnabled_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_AddGlobalExpressionContextProvider_Proxy(
+    IDebugApplication32* This,
+    IProvideExpressionContexts *pdsfs,
+    DWORD *pdwCookie);
+void __RPC_STUB IDebugApplication32_AddGlobalExpressionContextProvider_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication32_RemoveGlobalExpressionContextProvider_Proxy(
+    IDebugApplication32* This,
+    DWORD dwCookie);
+void __RPC_STUB IDebugApplication32_RemoveGlobalExpressionContextProvider_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugApplication32_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugApplication64 interface
+ */
+#ifndef __IDebugApplication64_INTERFACE_DEFINED__
+#define __IDebugApplication64_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugApplication64, 0x4dedc754, 0x04c7, 0x4f10, 0x9e,0x60, 0x16,0xa3,0x90,0xfe,0x6e,0x62);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("4dedc754-04c7-4f10-9e60-16a390fe6e62")
+IDebugApplication64 : public IRemoteDebugApplication
+{
+    virtual HRESULT STDMETHODCALLTYPE SetName(
+        LPCOLESTR pstrName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE StepOutComplete(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DebugOutput(
+        LPCOLESTR pstr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE StartDebugSession(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE HandleBreakPoint(
+        BREAKREASON br,
+        BREAKRESUMEACTION *pbra) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Close(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetBreakFlags(
+        APPBREAKFLAGS *pabf,
+        IRemoteDebugApplicationThread **pprdatSteppingThread) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCurrentThread(
+        IDebugApplicationThread **pat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateAsyncDebugOperation(
+        IDebugSyncOperation *psdo,
+        IDebugAsyncOperation **ppado) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddStackFrameSniffer(
+        IDebugStackFrameSniffer *pdsfs,
+        DWORD *pdwCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveStackFrameSniffer(
+        DWORD dwCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryCurrentThreadIsDebuggerThread(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SynchronousCallInDebuggerThread(
+        IDebugThreadCall64 *pptc,
+        DWORDLONG dwParam1,
+        DWORDLONG dwParam2,
+        DWORDLONG dwParam3) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateApplicationNode(
+        IDebugApplicationNode **ppdanNew) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE FireDebuggerEvent(
+        REFGUID riid,
+        IUnknown *punk) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE HandleRuntimeError(
+        IActiveScriptErrorDebug *pErrorDebug,
+        IActiveScriptSite *pScriptSite,
+        BREAKRESUMEACTION *pbra,
+        ERRORRESUMEACTION *perra,
+        WINBOOL *pfCallOnScriptError) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE FCanJitDebug(
+        ) = 0;
+
+    virtual WINBOOL STDMETHODCALLTYPE FIsAutoJitDebugEnabled(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AddGlobalExpressionContextProvider(
+        IProvideExpressionContexts *pdsfs,
+        DWORDLONG *pdwCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE RemoveGlobalExpressionContextProvider(
+        DWORDLONG dwCookie) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugApplication64, 0x4dedc754, 0x04c7, 0x4f10, 0x9e,0x60, 0x16,0xa3,0x90,0xfe,0x6e,0x62)
+#endif
+#else
+typedef struct IDebugApplication64Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugApplication64* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugApplication64* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugApplication64* This);
+
+    /*** IRemoteDebugApplication methods ***/
+    HRESULT (STDMETHODCALLTYPE *ResumeFromBreakPoint)(
+        IDebugApplication64* This,
+        IRemoteDebugApplicationThread *prptFocus,
+        BREAKRESUMEACTION bra,
+        ERRORRESUMEACTION era);
+
+    HRESULT (STDMETHODCALLTYPE *CauseBreak)(
+        IDebugApplication64* This);
+
+    HRESULT (STDMETHODCALLTYPE *ConnectDebugger)(
+        IDebugApplication64* This,
+        IApplicationDebugger *pad);
+
+    HRESULT (STDMETHODCALLTYPE *DisconnectDebugger)(
+        IDebugApplication64* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetDebugger)(
+        IDebugApplication64* This,
+        IApplicationDebugger **pad);
+
+    HRESULT (STDMETHODCALLTYPE *CreateInstanceAtApplication)(
+        IDebugApplication64* This,
+        REFCLSID rclsid,
+        IUnknown *pUnkOuter,
+        DWORD dwClsContext,
+        REFIID riid,
+        IUnknown **ppvObject);
+
+    HRESULT (STDMETHODCALLTYPE *QueryAlive)(
+        IDebugApplication64* This);
+
+    HRESULT (STDMETHODCALLTYPE *EnumThreads)(
+        IDebugApplication64* This,
+        IEnumRemoteDebugApplicationThreads **pperdat);
+
+    HRESULT (STDMETHODCALLTYPE *GetName)(
+        IDebugApplication64* This,
+        BSTR *pbstrName);
+
+    HRESULT (STDMETHODCALLTYPE *GetRootNode)(
+        IDebugApplication64* This,
+        IDebugApplicationNode **ppdanRoot);
+
+    HRESULT (STDMETHODCALLTYPE *EnumGlobalExpressionContexts)(
+        IDebugApplication64* This,
+        IEnumDebugExpressionContexts **ppedec);
+
+    /*** IDebugApplication64 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetName)(
+        IDebugApplication64* This,
+        LPCOLESTR pstrName);
+
+    HRESULT (STDMETHODCALLTYPE *StepOutComplete)(
+        IDebugApplication64* This);
+
+    HRESULT (STDMETHODCALLTYPE *DebugOutput)(
+        IDebugApplication64* This,
+        LPCOLESTR pstr);
+
+    HRESULT (STDMETHODCALLTYPE *StartDebugSession)(
+        IDebugApplication64* This);
+
+    HRESULT (STDMETHODCALLTYPE *HandleBreakPoint)(
+        IDebugApplication64* This,
+        BREAKREASON br,
+        BREAKRESUMEACTION *pbra);
+
+    HRESULT (STDMETHODCALLTYPE *Close)(
+        IDebugApplication64* This);
+
+    HRESULT (STDMETHODCALLTYPE *GetBreakFlags)(
+        IDebugApplication64* This,
+        APPBREAKFLAGS *pabf,
+        IRemoteDebugApplicationThread **pprdatSteppingThread);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentThread)(
+        IDebugApplication64* This,
+        IDebugApplicationThread **pat);
+
+    HRESULT (STDMETHODCALLTYPE *CreateAsyncDebugOperation)(
+        IDebugApplication64* This,
+        IDebugSyncOperation *psdo,
+        IDebugAsyncOperation **ppado);
+
+    HRESULT (STDMETHODCALLTYPE *AddStackFrameSniffer)(
+        IDebugApplication64* This,
+        IDebugStackFrameSniffer *pdsfs,
+        DWORD *pdwCookie);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveStackFrameSniffer)(
+        IDebugApplication64* This,
+        DWORD dwCookie);
+
+    HRESULT (STDMETHODCALLTYPE *QueryCurrentThreadIsDebuggerThread)(
+        IDebugApplication64* This);
+
+    HRESULT (STDMETHODCALLTYPE *SynchronousCallInDebuggerThread)(
+        IDebugApplication64* This,
+        IDebugThreadCall64 *pptc,
+        DWORDLONG dwParam1,
+        DWORDLONG dwParam2,
+        DWORDLONG dwParam3);
+
+    HRESULT (STDMETHODCALLTYPE *CreateApplicationNode)(
+        IDebugApplication64* This,
+        IDebugApplicationNode **ppdanNew);
+
+    HRESULT (STDMETHODCALLTYPE *FireDebuggerEvent)(
+        IDebugApplication64* This,
+        REFGUID riid,
+        IUnknown *punk);
+
+    HRESULT (STDMETHODCALLTYPE *HandleRuntimeError)(
+        IDebugApplication64* This,
+        IActiveScriptErrorDebug *pErrorDebug,
+        IActiveScriptSite *pScriptSite,
+        BREAKRESUMEACTION *pbra,
+        ERRORRESUMEACTION *perra,
+        WINBOOL *pfCallOnScriptError);
+
+    WINBOOL (STDMETHODCALLTYPE *FCanJitDebug)(
+        IDebugApplication64* This);
+
+    WINBOOL (STDMETHODCALLTYPE *FIsAutoJitDebugEnabled)(
+        IDebugApplication64* This);
+
+    HRESULT (STDMETHODCALLTYPE *AddGlobalExpressionContextProvider)(
+        IDebugApplication64* This,
+        IProvideExpressionContexts *pdsfs,
+        DWORDLONG *pdwCookie);
+
+    HRESULT (STDMETHODCALLTYPE *RemoveGlobalExpressionContextProvider)(
+        IDebugApplication64* This,
+        DWORDLONG dwCookie);
+
+    END_INTERFACE
+} IDebugApplication64Vtbl;
+interface IDebugApplication64 {
+    CONST_VTBL IDebugApplication64Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugApplication64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugApplication64_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugApplication64_Release(This) (This)->lpVtbl->Release(This)
+/*** IRemoteDebugApplication methods ***/
+#define IDebugApplication64_ResumeFromBreakPoint(This,prptFocus,bra,era) (This)->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era)
+#define IDebugApplication64_CauseBreak(This) (This)->lpVtbl->CauseBreak(This)
+#define IDebugApplication64_ConnectDebugger(This,pad) (This)->lpVtbl->ConnectDebugger(This,pad)
+#define IDebugApplication64_DisconnectDebugger(This) (This)->lpVtbl->DisconnectDebugger(This)
+#define IDebugApplication64_GetDebugger(This,pad) (This)->lpVtbl->GetDebugger(This,pad)
+#define IDebugApplication64_CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject) (This)->lpVtbl->CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject)
+#define IDebugApplication64_QueryAlive(This) (This)->lpVtbl->QueryAlive(This)
+#define IDebugApplication64_EnumThreads(This,pperdat) (This)->lpVtbl->EnumThreads(This,pperdat)
+#define IDebugApplication64_GetName(This,pbstrName) (This)->lpVtbl->GetName(This,pbstrName)
+#define IDebugApplication64_GetRootNode(This,ppdanRoot) (This)->lpVtbl->GetRootNode(This,ppdanRoot)
+#define IDebugApplication64_EnumGlobalExpressionContexts(This,ppedec) (This)->lpVtbl->EnumGlobalExpressionContexts(This,ppedec)
+/*** IDebugApplication64 methods ***/
+#define IDebugApplication64_SetName(This,pstrName) (This)->lpVtbl->SetName(This,pstrName)
+#define IDebugApplication64_StepOutComplete(This) (This)->lpVtbl->StepOutComplete(This)
+#define IDebugApplication64_DebugOutput(This,pstr) (This)->lpVtbl->DebugOutput(This,pstr)
+#define IDebugApplication64_StartDebugSession(This) (This)->lpVtbl->StartDebugSession(This)
+#define IDebugApplication64_HandleBreakPoint(This,br,pbra) (This)->lpVtbl->HandleBreakPoint(This,br,pbra)
+#define IDebugApplication64_Close(This) (This)->lpVtbl->Close(This)
+#define IDebugApplication64_GetBreakFlags(This,pabf,pprdatSteppingThread) (This)->lpVtbl->GetBreakFlags(This,pabf,pprdatSteppingThread)
+#define IDebugApplication64_GetCurrentThread(This,pat) (This)->lpVtbl->GetCurrentThread(This,pat)
+#define IDebugApplication64_CreateAsyncDebugOperation(This,psdo,ppado) (This)->lpVtbl->CreateAsyncDebugOperation(This,psdo,ppado)
+#define IDebugApplication64_AddStackFrameSniffer(This,pdsfs,pdwCookie) (This)->lpVtbl->AddStackFrameSniffer(This,pdsfs,pdwCookie)
+#define IDebugApplication64_RemoveStackFrameSniffer(This,dwCookie) (This)->lpVtbl->RemoveStackFrameSniffer(This,dwCookie)
+#define IDebugApplication64_QueryCurrentThreadIsDebuggerThread(This) (This)->lpVtbl->QueryCurrentThreadIsDebuggerThread(This)
+#define IDebugApplication64_SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3)
+#define IDebugApplication64_CreateApplicationNode(This,ppdanNew) (This)->lpVtbl->CreateApplicationNode(This,ppdanNew)
+#define IDebugApplication64_FireDebuggerEvent(This,riid,punk) (This)->lpVtbl->FireDebuggerEvent(This,riid,punk)
+#define IDebugApplication64_HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError) (This)->lpVtbl->HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError)
+#define IDebugApplication64_FCanJitDebug(This) (This)->lpVtbl->FCanJitDebug(This)
+#define IDebugApplication64_FIsAutoJitDebugEnabled(This) (This)->lpVtbl->FIsAutoJitDebugEnabled(This)
+#define IDebugApplication64_AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie) (This)->lpVtbl->AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie)
+#define IDebugApplication64_RemoveGlobalExpressionContextProvider(This,dwCookie) (This)->lpVtbl->RemoveGlobalExpressionContextProvider(This,dwCookie)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugApplication64_QueryInterface(IDebugApplication64* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugApplication64_AddRef(IDebugApplication64* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugApplication64_Release(IDebugApplication64* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRemoteDebugApplication methods ***/
+static FORCEINLINE HRESULT IDebugApplication64_ResumeFromBreakPoint(IDebugApplication64* This,IRemoteDebugApplicationThread *prptFocus,BREAKRESUMEACTION bra,ERRORRESUMEACTION era) {
+    return This->lpVtbl->ResumeFromBreakPoint(This,prptFocus,bra,era);
+}
+static FORCEINLINE HRESULT IDebugApplication64_CauseBreak(IDebugApplication64* This) {
+    return This->lpVtbl->CauseBreak(This);
+}
+static FORCEINLINE HRESULT IDebugApplication64_ConnectDebugger(IDebugApplication64* This,IApplicationDebugger *pad) {
+    return This->lpVtbl->ConnectDebugger(This,pad);
+}
+static FORCEINLINE HRESULT IDebugApplication64_DisconnectDebugger(IDebugApplication64* This) {
+    return This->lpVtbl->DisconnectDebugger(This);
+}
+static FORCEINLINE HRESULT IDebugApplication64_GetDebugger(IDebugApplication64* This,IApplicationDebugger **pad) {
+    return This->lpVtbl->GetDebugger(This,pad);
+}
+static FORCEINLINE HRESULT IDebugApplication64_CreateInstanceAtApplication(IDebugApplication64* This,REFCLSID rclsid,IUnknown *pUnkOuter,DWORD dwClsContext,REFIID riid,IUnknown **ppvObject) {
+    return This->lpVtbl->CreateInstanceAtApplication(This,rclsid,pUnkOuter,dwClsContext,riid,ppvObject);
+}
+static FORCEINLINE HRESULT IDebugApplication64_QueryAlive(IDebugApplication64* This) {
+    return This->lpVtbl->QueryAlive(This);
+}
+static FORCEINLINE HRESULT IDebugApplication64_EnumThreads(IDebugApplication64* This,IEnumRemoteDebugApplicationThreads **pperdat) {
+    return This->lpVtbl->EnumThreads(This,pperdat);
+}
+static FORCEINLINE HRESULT IDebugApplication64_GetName(IDebugApplication64* This,BSTR *pbstrName) {
+    return This->lpVtbl->GetName(This,pbstrName);
+}
+static FORCEINLINE HRESULT IDebugApplication64_GetRootNode(IDebugApplication64* This,IDebugApplicationNode **ppdanRoot) {
+    return This->lpVtbl->GetRootNode(This,ppdanRoot);
+}
+static FORCEINLINE HRESULT IDebugApplication64_EnumGlobalExpressionContexts(IDebugApplication64* This,IEnumDebugExpressionContexts **ppedec) {
+    return This->lpVtbl->EnumGlobalExpressionContexts(This,ppedec);
+}
+/*** IDebugApplication64 methods ***/
+static FORCEINLINE HRESULT IDebugApplication64_SetName(IDebugApplication64* This,LPCOLESTR pstrName) {
+    return This->lpVtbl->SetName(This,pstrName);
+}
+static FORCEINLINE HRESULT IDebugApplication64_StepOutComplete(IDebugApplication64* This) {
+    return This->lpVtbl->StepOutComplete(This);
+}
+static FORCEINLINE HRESULT IDebugApplication64_DebugOutput(IDebugApplication64* This,LPCOLESTR pstr) {
+    return This->lpVtbl->DebugOutput(This,pstr);
+}
+static FORCEINLINE HRESULT IDebugApplication64_StartDebugSession(IDebugApplication64* This) {
+    return This->lpVtbl->StartDebugSession(This);
+}
+static FORCEINLINE HRESULT IDebugApplication64_HandleBreakPoint(IDebugApplication64* This,BREAKREASON br,BREAKRESUMEACTION *pbra) {
+    return This->lpVtbl->HandleBreakPoint(This,br,pbra);
+}
+static FORCEINLINE HRESULT IDebugApplication64_Close(IDebugApplication64* This) {
+    return This->lpVtbl->Close(This);
+}
+static FORCEINLINE HRESULT IDebugApplication64_GetBreakFlags(IDebugApplication64* This,APPBREAKFLAGS *pabf,IRemoteDebugApplicationThread **pprdatSteppingThread) {
+    return This->lpVtbl->GetBreakFlags(This,pabf,pprdatSteppingThread);
+}
+static FORCEINLINE HRESULT IDebugApplication64_GetCurrentThread(IDebugApplication64* This,IDebugApplicationThread **pat) {
+    return This->lpVtbl->GetCurrentThread(This,pat);
+}
+static FORCEINLINE HRESULT IDebugApplication64_CreateAsyncDebugOperation(IDebugApplication64* This,IDebugSyncOperation *psdo,IDebugAsyncOperation **ppado) {
+    return This->lpVtbl->CreateAsyncDebugOperation(This,psdo,ppado);
+}
+static FORCEINLINE HRESULT IDebugApplication64_AddStackFrameSniffer(IDebugApplication64* This,IDebugStackFrameSniffer *pdsfs,DWORD *pdwCookie) {
+    return This->lpVtbl->AddStackFrameSniffer(This,pdsfs,pdwCookie);
+}
+static FORCEINLINE HRESULT IDebugApplication64_RemoveStackFrameSniffer(IDebugApplication64* This,DWORD dwCookie) {
+    return This->lpVtbl->RemoveStackFrameSniffer(This,dwCookie);
+}
+static FORCEINLINE HRESULT IDebugApplication64_QueryCurrentThreadIsDebuggerThread(IDebugApplication64* This) {
+    return This->lpVtbl->QueryCurrentThreadIsDebuggerThread(This);
+}
+static FORCEINLINE HRESULT IDebugApplication64_SynchronousCallInDebuggerThread(IDebugApplication64* This,IDebugThreadCall64 *pptc,DWORDLONG dwParam1,DWORDLONG dwParam2,DWORDLONG dwParam3) {
+    return This->lpVtbl->SynchronousCallInDebuggerThread(This,pptc,dwParam1,dwParam2,dwParam3);
+}
+static FORCEINLINE HRESULT IDebugApplication64_CreateApplicationNode(IDebugApplication64* This,IDebugApplicationNode **ppdanNew) {
+    return This->lpVtbl->CreateApplicationNode(This,ppdanNew);
+}
+static FORCEINLINE HRESULT IDebugApplication64_FireDebuggerEvent(IDebugApplication64* This,REFGUID riid,IUnknown *punk) {
+    return This->lpVtbl->FireDebuggerEvent(This,riid,punk);
+}
+static FORCEINLINE HRESULT IDebugApplication64_HandleRuntimeError(IDebugApplication64* This,IActiveScriptErrorDebug *pErrorDebug,IActiveScriptSite *pScriptSite,BREAKRESUMEACTION *pbra,ERRORRESUMEACTION *perra,WINBOOL *pfCallOnScriptError) {
+    return This->lpVtbl->HandleRuntimeError(This,pErrorDebug,pScriptSite,pbra,perra,pfCallOnScriptError);
+}
+static FORCEINLINE WINBOOL IDebugApplication64_FCanJitDebug(IDebugApplication64* This) {
+    return This->lpVtbl->FCanJitDebug(This);
+}
+static FORCEINLINE WINBOOL IDebugApplication64_FIsAutoJitDebugEnabled(IDebugApplication64* This) {
+    return This->lpVtbl->FIsAutoJitDebugEnabled(This);
+}
+static FORCEINLINE HRESULT IDebugApplication64_AddGlobalExpressionContextProvider(IDebugApplication64* This,IProvideExpressionContexts *pdsfs,DWORDLONG *pdwCookie) {
+    return This->lpVtbl->AddGlobalExpressionContextProvider(This,pdsfs,pdwCookie);
+}
+static FORCEINLINE HRESULT IDebugApplication64_RemoveGlobalExpressionContextProvider(IDebugApplication64* This,DWORDLONG dwCookie) {
+    return This->lpVtbl->RemoveGlobalExpressionContextProvider(This,dwCookie);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugApplication64_SetName_Proxy(
+    IDebugApplication64* This,
+    LPCOLESTR pstrName);
+void __RPC_STUB IDebugApplication64_SetName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_StepOutComplete_Proxy(
+    IDebugApplication64* This);
+void __RPC_STUB IDebugApplication64_StepOutComplete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_DebugOutput_Proxy(
+    IDebugApplication64* This,
+    LPCOLESTR pstr);
+void __RPC_STUB IDebugApplication64_DebugOutput_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_StartDebugSession_Proxy(
+    IDebugApplication64* This);
+void __RPC_STUB IDebugApplication64_StartDebugSession_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_HandleBreakPoint_Proxy(
+    IDebugApplication64* This,
+    BREAKREASON br,
+    BREAKRESUMEACTION *pbra);
+void __RPC_STUB IDebugApplication64_HandleBreakPoint_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_Close_Proxy(
+    IDebugApplication64* This);
+void __RPC_STUB IDebugApplication64_Close_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_GetBreakFlags_Proxy(
+    IDebugApplication64* This,
+    APPBREAKFLAGS *pabf,
+    IRemoteDebugApplicationThread **pprdatSteppingThread);
+void __RPC_STUB IDebugApplication64_GetBreakFlags_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_GetCurrentThread_Proxy(
+    IDebugApplication64* This,
+    IDebugApplicationThread **pat);
+void __RPC_STUB IDebugApplication64_GetCurrentThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_CreateAsyncDebugOperation_Proxy(
+    IDebugApplication64* This,
+    IDebugSyncOperation *psdo,
+    IDebugAsyncOperation **ppado);
+void __RPC_STUB IDebugApplication64_CreateAsyncDebugOperation_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_AddStackFrameSniffer_Proxy(
+    IDebugApplication64* This,
+    IDebugStackFrameSniffer *pdsfs,
+    DWORD *pdwCookie);
+void __RPC_STUB IDebugApplication64_AddStackFrameSniffer_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_RemoveStackFrameSniffer_Proxy(
+    IDebugApplication64* This,
+    DWORD dwCookie);
+void __RPC_STUB IDebugApplication64_RemoveStackFrameSniffer_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_QueryCurrentThreadIsDebuggerThread_Proxy(
+    IDebugApplication64* This);
+void __RPC_STUB IDebugApplication64_QueryCurrentThreadIsDebuggerThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_SynchronousCallInDebuggerThread_Proxy(
+    IDebugApplication64* This,
+    IDebugThreadCall64 *pptc,
+    DWORDLONG dwParam1,
+    DWORDLONG dwParam2,
+    DWORDLONG dwParam3);
+void __RPC_STUB IDebugApplication64_SynchronousCallInDebuggerThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_CreateApplicationNode_Proxy(
+    IDebugApplication64* This,
+    IDebugApplicationNode **ppdanNew);
+void __RPC_STUB IDebugApplication64_CreateApplicationNode_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_FireDebuggerEvent_Proxy(
+    IDebugApplication64* This,
+    REFGUID riid,
+    IUnknown *punk);
+void __RPC_STUB IDebugApplication64_FireDebuggerEvent_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_HandleRuntimeError_Proxy(
+    IDebugApplication64* This,
+    IActiveScriptErrorDebug *pErrorDebug,
+    IActiveScriptSite *pScriptSite,
+    BREAKRESUMEACTION *pbra,
+    ERRORRESUMEACTION *perra,
+    WINBOOL *pfCallOnScriptError);
+void __RPC_STUB IDebugApplication64_HandleRuntimeError_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+WINBOOL STDMETHODCALLTYPE IDebugApplication64_FCanJitDebug_Proxy(
+    IDebugApplication64* This);
+void __RPC_STUB IDebugApplication64_FCanJitDebug_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+WINBOOL STDMETHODCALLTYPE IDebugApplication64_FIsAutoJitDebugEnabled_Proxy(
+    IDebugApplication64* This);
+void __RPC_STUB IDebugApplication64_FIsAutoJitDebugEnabled_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_AddGlobalExpressionContextProvider_Proxy(
+    IDebugApplication64* This,
+    IProvideExpressionContexts *pdsfs,
+    DWORDLONG *pdwCookie);
+void __RPC_STUB IDebugApplication64_AddGlobalExpressionContextProvider_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication64_RemoveGlobalExpressionContextProvider_Proxy(
+    IDebugApplication64* This,
+    DWORDLONG dwCookie);
+void __RPC_STUB IDebugApplication64_RemoveGlobalExpressionContextProvider_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugApplication64_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IRemoteDebugApplicationEvents interface
+ */
+#ifndef __IRemoteDebugApplicationEvents_INTERFACE_DEFINED__
+#define __IRemoteDebugApplicationEvents_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IRemoteDebugApplicationEvents, 0x51973c33, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c33-cb0c-11d0-b5c9-00a0244a0e7a")
+IRemoteDebugApplicationEvents : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnConnectDebugger(
+        IApplicationDebugger *pad) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnDisconnectDebugger(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnSetName(
+        LPCOLESTR pstrName) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnDebugOutput(
+        LPCOLESTR pstr) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnClose(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnEnterBreakPoint(
+        IRemoteDebugApplicationThread *prdat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnLeaveBreakPoint(
+        IRemoteDebugApplicationThread *prdat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnCreateThread(
+        IRemoteDebugApplicationThread *prdat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnDestroyThread(
+        IRemoteDebugApplicationThread *prdat) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnBreakFlagChange(
+        APPBREAKFLAGS abf,
+        IRemoteDebugApplicationThread *prdatSteppingThread) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IRemoteDebugApplicationEvents, 0x51973c33, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IRemoteDebugApplicationEventsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IRemoteDebugApplicationEvents* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IRemoteDebugApplicationEvents* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IRemoteDebugApplicationEvents* This);
+
+    /*** IRemoteDebugApplicationEvents methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnConnectDebugger)(
+        IRemoteDebugApplicationEvents* This,
+        IApplicationDebugger *pad);
+
+    HRESULT (STDMETHODCALLTYPE *OnDisconnectDebugger)(
+        IRemoteDebugApplicationEvents* This);
+
+    HRESULT (STDMETHODCALLTYPE *OnSetName)(
+        IRemoteDebugApplicationEvents* This,
+        LPCOLESTR pstrName);
+
+    HRESULT (STDMETHODCALLTYPE *OnDebugOutput)(
+        IRemoteDebugApplicationEvents* This,
+        LPCOLESTR pstr);
+
+    HRESULT (STDMETHODCALLTYPE *OnClose)(
+        IRemoteDebugApplicationEvents* This);
+
+    HRESULT (STDMETHODCALLTYPE *OnEnterBreakPoint)(
+        IRemoteDebugApplicationEvents* This,
+        IRemoteDebugApplicationThread *prdat);
+
+    HRESULT (STDMETHODCALLTYPE *OnLeaveBreakPoint)(
+        IRemoteDebugApplicationEvents* This,
+        IRemoteDebugApplicationThread *prdat);
+
+    HRESULT (STDMETHODCALLTYPE *OnCreateThread)(
+        IRemoteDebugApplicationEvents* This,
+        IRemoteDebugApplicationThread *prdat);
+
+    HRESULT (STDMETHODCALLTYPE *OnDestroyThread)(
+        IRemoteDebugApplicationEvents* This,
+        IRemoteDebugApplicationThread *prdat);
+
+    HRESULT (STDMETHODCALLTYPE *OnBreakFlagChange)(
+        IRemoteDebugApplicationEvents* This,
+        APPBREAKFLAGS abf,
+        IRemoteDebugApplicationThread *prdatSteppingThread);
+
+    END_INTERFACE
+} IRemoteDebugApplicationEventsVtbl;
+interface IRemoteDebugApplicationEvents {
+    CONST_VTBL IRemoteDebugApplicationEventsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IRemoteDebugApplicationEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IRemoteDebugApplicationEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRemoteDebugApplicationEvents_Release(This) (This)->lpVtbl->Release(This)
+/*** IRemoteDebugApplicationEvents methods ***/
+#define IRemoteDebugApplicationEvents_OnConnectDebugger(This,pad) (This)->lpVtbl->OnConnectDebugger(This,pad)
+#define IRemoteDebugApplicationEvents_OnDisconnectDebugger(This) (This)->lpVtbl->OnDisconnectDebugger(This)
+#define IRemoteDebugApplicationEvents_OnSetName(This,pstrName) (This)->lpVtbl->OnSetName(This,pstrName)
+#define IRemoteDebugApplicationEvents_OnDebugOutput(This,pstr) (This)->lpVtbl->OnDebugOutput(This,pstr)
+#define IRemoteDebugApplicationEvents_OnClose(This) (This)->lpVtbl->OnClose(This)
+#define IRemoteDebugApplicationEvents_OnEnterBreakPoint(This,prdat) (This)->lpVtbl->OnEnterBreakPoint(This,prdat)
+#define IRemoteDebugApplicationEvents_OnLeaveBreakPoint(This,prdat) (This)->lpVtbl->OnLeaveBreakPoint(This,prdat)
+#define IRemoteDebugApplicationEvents_OnCreateThread(This,prdat) (This)->lpVtbl->OnCreateThread(This,prdat)
+#define IRemoteDebugApplicationEvents_OnDestroyThread(This,prdat) (This)->lpVtbl->OnDestroyThread(This,prdat)
+#define IRemoteDebugApplicationEvents_OnBreakFlagChange(This,abf,prdatSteppingThread) (This)->lpVtbl->OnBreakFlagChange(This,abf,prdatSteppingThread)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_QueryInterface(IRemoteDebugApplicationEvents* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IRemoteDebugApplicationEvents_AddRef(IRemoteDebugApplicationEvents* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IRemoteDebugApplicationEvents_Release(IRemoteDebugApplicationEvents* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRemoteDebugApplicationEvents methods ***/
+static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnConnectDebugger(IRemoteDebugApplicationEvents* This,IApplicationDebugger *pad) {
+    return This->lpVtbl->OnConnectDebugger(This,pad);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnDisconnectDebugger(IRemoteDebugApplicationEvents* This) {
+    return This->lpVtbl->OnDisconnectDebugger(This);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnSetName(IRemoteDebugApplicationEvents* This,LPCOLESTR pstrName) {
+    return This->lpVtbl->OnSetName(This,pstrName);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnDebugOutput(IRemoteDebugApplicationEvents* This,LPCOLESTR pstr) {
+    return This->lpVtbl->OnDebugOutput(This,pstr);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnClose(IRemoteDebugApplicationEvents* This) {
+    return This->lpVtbl->OnClose(This);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnEnterBreakPoint(IRemoteDebugApplicationEvents* This,IRemoteDebugApplicationThread *prdat) {
+    return This->lpVtbl->OnEnterBreakPoint(This,prdat);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnLeaveBreakPoint(IRemoteDebugApplicationEvents* This,IRemoteDebugApplicationThread *prdat) {
+    return This->lpVtbl->OnLeaveBreakPoint(This,prdat);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnCreateThread(IRemoteDebugApplicationEvents* This,IRemoteDebugApplicationThread *prdat) {
+    return This->lpVtbl->OnCreateThread(This,prdat);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnDestroyThread(IRemoteDebugApplicationEvents* This,IRemoteDebugApplicationThread *prdat) {
+    return This->lpVtbl->OnDestroyThread(This,prdat);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationEvents_OnBreakFlagChange(IRemoteDebugApplicationEvents* This,APPBREAKFLAGS abf,IRemoteDebugApplicationThread *prdatSteppingThread) {
+    return This->lpVtbl->OnBreakFlagChange(This,abf,prdatSteppingThread);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnConnectDebugger_Proxy(
+    IRemoteDebugApplicationEvents* This,
+    IApplicationDebugger *pad);
+void __RPC_STUB IRemoteDebugApplicationEvents_OnConnectDebugger_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnDisconnectDebugger_Proxy(
+    IRemoteDebugApplicationEvents* This);
+void __RPC_STUB IRemoteDebugApplicationEvents_OnDisconnectDebugger_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnSetName_Proxy(
+    IRemoteDebugApplicationEvents* This,
+    LPCOLESTR pstrName);
+void __RPC_STUB IRemoteDebugApplicationEvents_OnSetName_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnDebugOutput_Proxy(
+    IRemoteDebugApplicationEvents* This,
+    LPCOLESTR pstr);
+void __RPC_STUB IRemoteDebugApplicationEvents_OnDebugOutput_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnClose_Proxy(
+    IRemoteDebugApplicationEvents* This);
+void __RPC_STUB IRemoteDebugApplicationEvents_OnClose_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnEnterBreakPoint_Proxy(
+    IRemoteDebugApplicationEvents* This,
+    IRemoteDebugApplicationThread *prdat);
+void __RPC_STUB IRemoteDebugApplicationEvents_OnEnterBreakPoint_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnLeaveBreakPoint_Proxy(
+    IRemoteDebugApplicationEvents* This,
+    IRemoteDebugApplicationThread *prdat);
+void __RPC_STUB IRemoteDebugApplicationEvents_OnLeaveBreakPoint_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnCreateThread_Proxy(
+    IRemoteDebugApplicationEvents* This,
+    IRemoteDebugApplicationThread *prdat);
+void __RPC_STUB IRemoteDebugApplicationEvents_OnCreateThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnDestroyThread_Proxy(
+    IRemoteDebugApplicationEvents* This,
+    IRemoteDebugApplicationThread *prdat);
+void __RPC_STUB IRemoteDebugApplicationEvents_OnDestroyThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationEvents_OnBreakFlagChange_Proxy(
+    IRemoteDebugApplicationEvents* This,
+    APPBREAKFLAGS abf,
+    IRemoteDebugApplicationThread *prdatSteppingThread);
+void __RPC_STUB IRemoteDebugApplicationEvents_OnBreakFlagChange_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IRemoteDebugApplicationEvents_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugApplicationNode interface
+ */
+#ifndef __IDebugApplicationNode_INTERFACE_DEFINED__
+#define __IDebugApplicationNode_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugApplicationNode, 0x51973c34, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c34-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugApplicationNode : public IDebugDocumentProvider
+{
+    virtual HRESULT STDMETHODCALLTYPE EnumChildren(
+        IEnumDebugApplicationNodes **pperddp) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetParent(
+        IDebugApplicationNode **pprddp) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetDocumentProvider(
+        IDebugDocumentProvider *pddp) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Close(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Attach(
+        IDebugApplicationNode *pdanParent) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Detach(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugApplicationNode, 0x51973c34, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugApplicationNodeVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugApplicationNode* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugApplicationNode* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugApplicationNode* This);
+
+    /*** IDebugDocumentInfo methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetName)(
+        IDebugApplicationNode* This,
+        DOCUMENTNAMETYPE dnt,
+        BSTR *pbstrName);
+
+    HRESULT (STDMETHODCALLTYPE *GetDocumentClassId)(
+        IDebugApplicationNode* This,
+        CLSID *pclsidDocument);
+
+    /*** IDebugDocumentProvider methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetDocument)(
+        IDebugApplicationNode* This,
+        IDebugDocument **ppssd);
+
+    /*** IDebugApplicationNode methods ***/
+    HRESULT (STDMETHODCALLTYPE *EnumChildren)(
+        IDebugApplicationNode* This,
+        IEnumDebugApplicationNodes **pperddp);
+
+    HRESULT (STDMETHODCALLTYPE *GetParent)(
+        IDebugApplicationNode* This,
+        IDebugApplicationNode **pprddp);
+
+    HRESULT (STDMETHODCALLTYPE *SetDocumentProvider)(
+        IDebugApplicationNode* This,
+        IDebugDocumentProvider *pddp);
+
+    HRESULT (STDMETHODCALLTYPE *Close)(
+        IDebugApplicationNode* This);
+
+    HRESULT (STDMETHODCALLTYPE *Attach)(
+        IDebugApplicationNode* This,
+        IDebugApplicationNode *pdanParent);
+
+    HRESULT (STDMETHODCALLTYPE *Detach)(
+        IDebugApplicationNode* This);
+
+    END_INTERFACE
+} IDebugApplicationNodeVtbl;
+interface IDebugApplicationNode {
+    CONST_VTBL IDebugApplicationNodeVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugApplicationNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugApplicationNode_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugApplicationNode_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugDocumentInfo methods ***/
+#define IDebugApplicationNode_GetName(This,dnt,pbstrName) (This)->lpVtbl->GetName(This,dnt,pbstrName)
+#define IDebugApplicationNode_GetDocumentClassId(This,pclsidDocument) (This)->lpVtbl->GetDocumentClassId(This,pclsidDocument)
+/*** IDebugDocumentProvider methods ***/
+#define IDebugApplicationNode_GetDocument(This,ppssd) (This)->lpVtbl->GetDocument(This,ppssd)
+/*** IDebugApplicationNode methods ***/
+#define IDebugApplicationNode_EnumChildren(This,pperddp) (This)->lpVtbl->EnumChildren(This,pperddp)
+#define IDebugApplicationNode_GetParent(This,pprddp) (This)->lpVtbl->GetParent(This,pprddp)
+#define IDebugApplicationNode_SetDocumentProvider(This,pddp) (This)->lpVtbl->SetDocumentProvider(This,pddp)
+#define IDebugApplicationNode_Close(This) (This)->lpVtbl->Close(This)
+#define IDebugApplicationNode_Attach(This,pdanParent) (This)->lpVtbl->Attach(This,pdanParent)
+#define IDebugApplicationNode_Detach(This) (This)->lpVtbl->Detach(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugApplicationNode_QueryInterface(IDebugApplicationNode* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugApplicationNode_AddRef(IDebugApplicationNode* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugApplicationNode_Release(IDebugApplicationNode* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugDocumentInfo methods ***/
+static FORCEINLINE HRESULT IDebugApplicationNode_GetName(IDebugApplicationNode* This,DOCUMENTNAMETYPE dnt,BSTR *pbstrName) {
+    return This->lpVtbl->GetName(This,dnt,pbstrName);
+}
+static FORCEINLINE HRESULT IDebugApplicationNode_GetDocumentClassId(IDebugApplicationNode* This,CLSID *pclsidDocument) {
+    return This->lpVtbl->GetDocumentClassId(This,pclsidDocument);
+}
+/*** IDebugDocumentProvider methods ***/
+static FORCEINLINE HRESULT IDebugApplicationNode_GetDocument(IDebugApplicationNode* This,IDebugDocument **ppssd) {
+    return This->lpVtbl->GetDocument(This,ppssd);
+}
+/*** IDebugApplicationNode methods ***/
+static FORCEINLINE HRESULT IDebugApplicationNode_EnumChildren(IDebugApplicationNode* This,IEnumDebugApplicationNodes **pperddp) {
+    return This->lpVtbl->EnumChildren(This,pperddp);
+}
+static FORCEINLINE HRESULT IDebugApplicationNode_GetParent(IDebugApplicationNode* This,IDebugApplicationNode **pprddp) {
+    return This->lpVtbl->GetParent(This,pprddp);
+}
+static FORCEINLINE HRESULT IDebugApplicationNode_SetDocumentProvider(IDebugApplicationNode* This,IDebugDocumentProvider *pddp) {
+    return This->lpVtbl->SetDocumentProvider(This,pddp);
+}
+static FORCEINLINE HRESULT IDebugApplicationNode_Close(IDebugApplicationNode* This) {
+    return This->lpVtbl->Close(This);
+}
+static FORCEINLINE HRESULT IDebugApplicationNode_Attach(IDebugApplicationNode* This,IDebugApplicationNode *pdanParent) {
+    return This->lpVtbl->Attach(This,pdanParent);
+}
+static FORCEINLINE HRESULT IDebugApplicationNode_Detach(IDebugApplicationNode* This) {
+    return This->lpVtbl->Detach(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugApplicationNode_EnumChildren_Proxy(
+    IDebugApplicationNode* This,
+    IEnumDebugApplicationNodes **pperddp);
+void __RPC_STUB IDebugApplicationNode_EnumChildren_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationNode_GetParent_Proxy(
+    IDebugApplicationNode* This,
+    IDebugApplicationNode **pprddp);
+void __RPC_STUB IDebugApplicationNode_GetParent_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationNode_SetDocumentProvider_Proxy(
+    IDebugApplicationNode* This,
+    IDebugDocumentProvider *pddp);
+void __RPC_STUB IDebugApplicationNode_SetDocumentProvider_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationNode_Close_Proxy(
+    IDebugApplicationNode* This);
+void __RPC_STUB IDebugApplicationNode_Close_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationNode_Attach_Proxy(
+    IDebugApplicationNode* This,
+    IDebugApplicationNode *pdanParent);
+void __RPC_STUB IDebugApplicationNode_Attach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationNode_Detach_Proxy(
+    IDebugApplicationNode* This);
+void __RPC_STUB IDebugApplicationNode_Detach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugApplicationNode_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugApplicationNodeEvents interface
+ */
+#ifndef __IDebugApplicationNodeEvents_INTERFACE_DEFINED__
+#define __IDebugApplicationNodeEvents_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugApplicationNodeEvents, 0x51973c35, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c35-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugApplicationNodeEvents : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE onAddChild(
+        IDebugApplicationNode *prddpChild) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onRemoveChild(
+        IDebugApplicationNode *prddpChild) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onDetach(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE onAttach(
+        IDebugApplicationNode *prddpParent) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugApplicationNodeEvents, 0x51973c35, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugApplicationNodeEventsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugApplicationNodeEvents* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugApplicationNodeEvents* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugApplicationNodeEvents* This);
+
+    /*** IDebugApplicationNodeEvents methods ***/
+    HRESULT (STDMETHODCALLTYPE *onAddChild)(
+        IDebugApplicationNodeEvents* This,
+        IDebugApplicationNode *prddpChild);
+
+    HRESULT (STDMETHODCALLTYPE *onRemoveChild)(
+        IDebugApplicationNodeEvents* This,
+        IDebugApplicationNode *prddpChild);
+
+    HRESULT (STDMETHODCALLTYPE *onDetach)(
+        IDebugApplicationNodeEvents* This);
+
+    HRESULT (STDMETHODCALLTYPE *onAttach)(
+        IDebugApplicationNodeEvents* This,
+        IDebugApplicationNode *prddpParent);
+
+    END_INTERFACE
+} IDebugApplicationNodeEventsVtbl;
+interface IDebugApplicationNodeEvents {
+    CONST_VTBL IDebugApplicationNodeEventsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugApplicationNodeEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugApplicationNodeEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugApplicationNodeEvents_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugApplicationNodeEvents methods ***/
+#define IDebugApplicationNodeEvents_onAddChild(This,prddpChild) (This)->lpVtbl->onAddChild(This,prddpChild)
+#define IDebugApplicationNodeEvents_onRemoveChild(This,prddpChild) (This)->lpVtbl->onRemoveChild(This,prddpChild)
+#define IDebugApplicationNodeEvents_onDetach(This) (This)->lpVtbl->onDetach(This)
+#define IDebugApplicationNodeEvents_onAttach(This,prddpParent) (This)->lpVtbl->onAttach(This,prddpParent)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugApplicationNodeEvents_QueryInterface(IDebugApplicationNodeEvents* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugApplicationNodeEvents_AddRef(IDebugApplicationNodeEvents* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugApplicationNodeEvents_Release(IDebugApplicationNodeEvents* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugApplicationNodeEvents methods ***/
+static FORCEINLINE HRESULT IDebugApplicationNodeEvents_onAddChild(IDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpChild) {
+    return This->lpVtbl->onAddChild(This,prddpChild);
+}
+static FORCEINLINE HRESULT IDebugApplicationNodeEvents_onRemoveChild(IDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpChild) {
+    return This->lpVtbl->onRemoveChild(This,prddpChild);
+}
+static FORCEINLINE HRESULT IDebugApplicationNodeEvents_onDetach(IDebugApplicationNodeEvents* This) {
+    return This->lpVtbl->onDetach(This);
+}
+static FORCEINLINE HRESULT IDebugApplicationNodeEvents_onAttach(IDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpParent) {
+    return This->lpVtbl->onAttach(This,prddpParent);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugApplicationNodeEvents_onAddChild_Proxy(
+    IDebugApplicationNodeEvents* This,
+    IDebugApplicationNode *prddpChild);
+void __RPC_STUB IDebugApplicationNodeEvents_onAddChild_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationNodeEvents_onRemoveChild_Proxy(
+    IDebugApplicationNodeEvents* This,
+    IDebugApplicationNode *prddpChild);
+void __RPC_STUB IDebugApplicationNodeEvents_onRemoveChild_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationNodeEvents_onDetach_Proxy(
+    IDebugApplicationNodeEvents* This);
+void __RPC_STUB IDebugApplicationNodeEvents_onDetach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationNodeEvents_onAttach_Proxy(
+    IDebugApplicationNodeEvents* This,
+    IDebugApplicationNode *prddpParent);
+void __RPC_STUB IDebugApplicationNodeEvents_onAttach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugApplicationNodeEvents_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * AsyncIDebugApplicationNodeEvents interface
+ */
+#ifndef __AsyncIDebugApplicationNodeEvents_INTERFACE_DEFINED__
+#define __AsyncIDebugApplicationNodeEvents_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_AsyncIDebugApplicationNodeEvents, 0xa2e3aa3b, 0xaa8d, 0x4ebf, 0x84,0xcd, 0x64,0x8b,0x73,0x7b,0x8c,0x13);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("a2e3aa3b-aa8d-4ebf-84cd-648b737b8c13")
+AsyncIDebugApplicationNodeEvents : public IUnknown
+{
+    virtual void STDMETHODCALLTYPE Begin_onAddChild(
+        IDebugApplicationNode *prddpChild) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Finish_onAddChild(
+        ) = 0;
+
+    virtual void STDMETHODCALLTYPE Begin_onRemoveChild(
+        IDebugApplicationNode *prddpChild) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Finish_onRemoveChild(
+        ) = 0;
+
+    virtual void STDMETHODCALLTYPE Begin_onDetach(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Finish_onDetach(
+        ) = 0;
+
+    virtual void STDMETHODCALLTYPE Begin_onAttach(
+        IDebugApplicationNode *prddpParent) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Finish_onAttach(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(AsyncIDebugApplicationNodeEvents, 0xa2e3aa3b, 0xaa8d, 0x4ebf, 0x84,0xcd, 0x64,0x8b,0x73,0x7b,0x8c,0x13)
+#endif
+#else
+typedef struct AsyncIDebugApplicationNodeEventsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        AsyncIDebugApplicationNodeEvents* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        AsyncIDebugApplicationNodeEvents* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        AsyncIDebugApplicationNodeEvents* This);
+
+    /*** IDebugApplicationNodeEvents methods ***/
+    void (STDMETHODCALLTYPE *Begin_onAddChild)(
+        AsyncIDebugApplicationNodeEvents* This,
+        IDebugApplicationNode *prddpChild);
+
+    HRESULT (STDMETHODCALLTYPE *Finish_onAddChild)(
+        AsyncIDebugApplicationNodeEvents* This);
+
+    void (STDMETHODCALLTYPE *Begin_onRemoveChild)(
+        AsyncIDebugApplicationNodeEvents* This,
+        IDebugApplicationNode *prddpChild);
+
+    HRESULT (STDMETHODCALLTYPE *Finish_onRemoveChild)(
+        AsyncIDebugApplicationNodeEvents* This);
+
+    void (STDMETHODCALLTYPE *Begin_onDetach)(
+        AsyncIDebugApplicationNodeEvents* This);
+
+    HRESULT (STDMETHODCALLTYPE *Finish_onDetach)(
+        AsyncIDebugApplicationNodeEvents* This);
+
+    void (STDMETHODCALLTYPE *Begin_onAttach)(
+        AsyncIDebugApplicationNodeEvents* This,
+        IDebugApplicationNode *prddpParent);
+
+    HRESULT (STDMETHODCALLTYPE *Finish_onAttach)(
+        AsyncIDebugApplicationNodeEvents* This);
+
+    END_INTERFACE
+} AsyncIDebugApplicationNodeEventsVtbl;
+interface AsyncIDebugApplicationNodeEvents {
+    CONST_VTBL AsyncIDebugApplicationNodeEventsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define AsyncIDebugApplicationNodeEvents_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define AsyncIDebugApplicationNodeEvents_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define AsyncIDebugApplicationNodeEvents_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugApplicationNodeEvents methods ***/
+#define AsyncIDebugApplicationNodeEvents_Begin_onAddChild(This,prddpChild) (This)->lpVtbl->Begin_onAddChild(This,prddpChild)
+#define AsyncIDebugApplicationNodeEvents_Finish_onAddChild(This) (This)->lpVtbl->Finish_onAddChild(This)
+#define AsyncIDebugApplicationNodeEvents_Begin_onRemoveChild(This,prddpChild) (This)->lpVtbl->Begin_onRemoveChild(This,prddpChild)
+#define AsyncIDebugApplicationNodeEvents_Finish_onRemoveChild(This) (This)->lpVtbl->Finish_onRemoveChild(This)
+#define AsyncIDebugApplicationNodeEvents_Begin_onDetach(This) (This)->lpVtbl->Begin_onDetach(This)
+#define AsyncIDebugApplicationNodeEvents_Finish_onDetach(This) (This)->lpVtbl->Finish_onDetach(This)
+#define AsyncIDebugApplicationNodeEvents_Begin_onAttach(This,prddpParent) (This)->lpVtbl->Begin_onAttach(This,prddpParent)
+#define AsyncIDebugApplicationNodeEvents_Finish_onAttach(This) (This)->lpVtbl->Finish_onAttach(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT AsyncIDebugApplicationNodeEvents_QueryInterface(AsyncIDebugApplicationNodeEvents* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG AsyncIDebugApplicationNodeEvents_AddRef(AsyncIDebugApplicationNodeEvents* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG AsyncIDebugApplicationNodeEvents_Release(AsyncIDebugApplicationNodeEvents* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugApplicationNodeEvents methods ***/
+static FORCEINLINE void Begin_AsyncIDebugApplicationNodeEvents_onAddChild(AsyncIDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpChild) {
+    This->lpVtbl->Begin_onAddChild(This,prddpChild);
+}
+static FORCEINLINE HRESULT Finish_AsyncIDebugApplicationNodeEvents_onAddChild(AsyncIDebugApplicationNodeEvents* This) {
+    return This->lpVtbl->Finish_onAddChild(This);
+}
+static FORCEINLINE void Begin_AsyncIDebugApplicationNodeEvents_onRemoveChild(AsyncIDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpChild) {
+    This->lpVtbl->Begin_onRemoveChild(This,prddpChild);
+}
+static FORCEINLINE HRESULT Finish_AsyncIDebugApplicationNodeEvents_onRemoveChild(AsyncIDebugApplicationNodeEvents* This) {
+    return This->lpVtbl->Finish_onRemoveChild(This);
+}
+static FORCEINLINE void Begin_AsyncIDebugApplicationNodeEvents_onDetach(AsyncIDebugApplicationNodeEvents* This) {
+    This->lpVtbl->Begin_onDetach(This);
+}
+static FORCEINLINE HRESULT Finish_AsyncIDebugApplicationNodeEvents_onDetach(AsyncIDebugApplicationNodeEvents* This) {
+    return This->lpVtbl->Finish_onDetach(This);
+}
+static FORCEINLINE void Begin_AsyncIDebugApplicationNodeEvents_onAttach(AsyncIDebugApplicationNodeEvents* This,IDebugApplicationNode *prddpParent) {
+    This->lpVtbl->Begin_onAttach(This,prddpParent);
+}
+static FORCEINLINE HRESULT Finish_AsyncIDebugApplicationNodeEvents_onAttach(AsyncIDebugApplicationNodeEvents* This) {
+    return This->lpVtbl->Finish_onAttach(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE AsyncIDebugApplicationNodeEvents_Begin_onAddChild_Proxy(
+    IDebugApplicationNodeEvents* This,
+    IDebugApplicationNode *prddpChild);
+void __RPC_STUB AsyncIDebugApplicationNodeEvents_Begin_onAddChild_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE AsyncIDebugApplicationNodeEvents_Finish_onAddChild_Proxy(
+    IDebugApplicationNodeEvents* This,
+    IDebugApplicationNode *prddpChild);
+void __RPC_STUB AsyncIDebugApplicationNodeEvents_Finish_onAddChild_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE AsyncIDebugApplicationNodeEvents_Begin_onRemoveChild_Proxy(
+    IDebugApplicationNodeEvents* This,
+    IDebugApplicationNode *prddpChild);
+void __RPC_STUB AsyncIDebugApplicationNodeEvents_Begin_onRemoveChild_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE AsyncIDebugApplicationNodeEvents_Finish_onRemoveChild_Proxy(
+    IDebugApplicationNodeEvents* This,
+    IDebugApplicationNode *prddpChild);
+void __RPC_STUB AsyncIDebugApplicationNodeEvents_Finish_onRemoveChild_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE AsyncIDebugApplicationNodeEvents_Begin_onDetach_Proxy(
+    IDebugApplicationNodeEvents* This);
+void __RPC_STUB AsyncIDebugApplicationNodeEvents_Begin_onDetach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE AsyncIDebugApplicationNodeEvents_Finish_onDetach_Proxy(
+    IDebugApplicationNodeEvents* This);
+void __RPC_STUB AsyncIDebugApplicationNodeEvents_Finish_onDetach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE AsyncIDebugApplicationNodeEvents_Begin_onAttach_Proxy(
+    IDebugApplicationNodeEvents* This,
+    IDebugApplicationNode *prddpParent);
+void __RPC_STUB AsyncIDebugApplicationNodeEvents_Begin_onAttach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE AsyncIDebugApplicationNodeEvents_Finish_onAttach_Proxy(
+    IDebugApplicationNodeEvents* This,
+    IDebugApplicationNode *prddpParent);
+void __RPC_STUB AsyncIDebugApplicationNodeEvents_Finish_onAttach_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __AsyncIDebugApplicationNodeEvents_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugThreadCall32 interface
+ */
+#ifndef __IDebugThreadCall32_INTERFACE_DEFINED__
+#define __IDebugThreadCall32_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugThreadCall32, 0x51973c36, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c36-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugThreadCall32 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE ThreadCallHandler(
+        DWORD dwParam1,
+        DWORD dwParam2,
+        DWORD dwParam3) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugThreadCall32, 0x51973c36, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugThreadCall32Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugThreadCall32* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugThreadCall32* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugThreadCall32* This);
+
+    /*** IDebugThreadCall32 methods ***/
+    HRESULT (STDMETHODCALLTYPE *ThreadCallHandler)(
+        IDebugThreadCall32* This,
+        DWORD dwParam1,
+        DWORD dwParam2,
+        DWORD dwParam3);
+
+    END_INTERFACE
+} IDebugThreadCall32Vtbl;
+interface IDebugThreadCall32 {
+    CONST_VTBL IDebugThreadCall32Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugThreadCall32_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugThreadCall32_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugThreadCall32_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugThreadCall32 methods ***/
+#define IDebugThreadCall32_ThreadCallHandler(This,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->ThreadCallHandler(This,dwParam1,dwParam2,dwParam3)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugThreadCall32_QueryInterface(IDebugThreadCall32* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugThreadCall32_AddRef(IDebugThreadCall32* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugThreadCall32_Release(IDebugThreadCall32* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugThreadCall32 methods ***/
+static FORCEINLINE HRESULT IDebugThreadCall32_ThreadCallHandler(IDebugThreadCall32* This,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3) {
+    return This->lpVtbl->ThreadCallHandler(This,dwParam1,dwParam2,dwParam3);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugThreadCall32_ThreadCallHandler_Proxy(
+    IDebugThreadCall32* This,
+    DWORD dwParam1,
+    DWORD dwParam2,
+    DWORD dwParam3);
+void __RPC_STUB IDebugThreadCall32_ThreadCallHandler_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugThreadCall32_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugThreadCall64 interface
+ */
+#ifndef __IDebugThreadCall64_INTERFACE_DEFINED__
+#define __IDebugThreadCall64_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugThreadCall64, 0xcb3fa335, 0xe979, 0x42fd, 0x9f,0xcf, 0xa7,0x54,0x6a,0x0f,0x39,0x05);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("cb3fa335-e979-42fd-9fcf-a7546a0f3905")
+IDebugThreadCall64 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE ThreadCallHandler(
+        DWORDLONG dwParam1,
+        DWORDLONG dwParam2,
+        DWORDLONG dwParam3) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugThreadCall64, 0xcb3fa335, 0xe979, 0x42fd, 0x9f,0xcf, 0xa7,0x54,0x6a,0x0f,0x39,0x05)
+#endif
+#else
+typedef struct IDebugThreadCall64Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugThreadCall64* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugThreadCall64* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugThreadCall64* This);
+
+    /*** IDebugThreadCall64 methods ***/
+    HRESULT (STDMETHODCALLTYPE *ThreadCallHandler)(
+        IDebugThreadCall64* This,
+        DWORDLONG dwParam1,
+        DWORDLONG dwParam2,
+        DWORDLONG dwParam3);
+
+    END_INTERFACE
+} IDebugThreadCall64Vtbl;
+interface IDebugThreadCall64 {
+    CONST_VTBL IDebugThreadCall64Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugThreadCall64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugThreadCall64_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugThreadCall64_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugThreadCall64 methods ***/
+#define IDebugThreadCall64_ThreadCallHandler(This,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->ThreadCallHandler(This,dwParam1,dwParam2,dwParam3)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugThreadCall64_QueryInterface(IDebugThreadCall64* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugThreadCall64_AddRef(IDebugThreadCall64* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugThreadCall64_Release(IDebugThreadCall64* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugThreadCall64 methods ***/
+static FORCEINLINE HRESULT IDebugThreadCall64_ThreadCallHandler(IDebugThreadCall64* This,DWORDLONG dwParam1,DWORDLONG dwParam2,DWORDLONG dwParam3) {
+    return This->lpVtbl->ThreadCallHandler(This,dwParam1,dwParam2,dwParam3);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugThreadCall64_ThreadCallHandler_Proxy(
+    IDebugThreadCall64* This,
+    DWORDLONG dwParam1,
+    DWORDLONG dwParam2,
+    DWORDLONG dwParam3);
+void __RPC_STUB IDebugThreadCall64_ThreadCallHandler_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugThreadCall64_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IRemoteDebugApplicationThread interface
+ */
+#ifndef __IRemoteDebugApplicationThread_INTERFACE_DEFINED__
+#define __IRemoteDebugApplicationThread_INTERFACE_DEFINED__
+
+typedef DWORD THREAD_STATE;
+#define THREAD_STATE_RUNNING (0x1)
+
+#define THREAD_STATE_SUSPENDED (0x2)
+
+#define THREAD_BLOCKED (0x4)
+
+#define THREAD_OUT_OF_CONTEXT (0x8)
+
+DEFINE_GUID(IID_IRemoteDebugApplicationThread, 0x51973c37, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c37-cb0c-11d0-b5c9-00a0244a0e7a")
+IRemoteDebugApplicationThread : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetSystemThreadId(
+        DWORD *dwThreadId) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetApplication(
+        IRemoteDebugApplication **pprda) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE EnumStackFrames(
+        IEnumDebugStackFrames **ppedsf) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetDescription(
+        BSTR *pbstrDescription,
+        BSTR *pbstrState) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetNextStatement(
+        IDebugStackFrame *pStackFrame,
+        IDebugCodeContext *pCodeContext) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetState(
+        DWORD *pState) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Suspend(
+        DWORD *pdwCount) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Resume(
+        DWORD *pdwCount) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetSuspendCount(
+        DWORD *pdwCount) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IRemoteDebugApplicationThread, 0x51973c37, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IRemoteDebugApplicationThreadVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IRemoteDebugApplicationThread* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IRemoteDebugApplicationThread* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IRemoteDebugApplicationThread* This);
+
+    /*** IRemoteDebugApplicationThread methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemThreadId)(
+        IRemoteDebugApplicationThread* This,
+        DWORD *dwThreadId);
+
+    HRESULT (STDMETHODCALLTYPE *GetApplication)(
+        IRemoteDebugApplicationThread* This,
+        IRemoteDebugApplication **pprda);
+
+    HRESULT (STDMETHODCALLTYPE *EnumStackFrames)(
+        IRemoteDebugApplicationThread* This,
+        IEnumDebugStackFrames **ppedsf);
+
+    HRESULT (STDMETHODCALLTYPE *GetDescription)(
+        IRemoteDebugApplicationThread* This,
+        BSTR *pbstrDescription,
+        BSTR *pbstrState);
+
+    HRESULT (STDMETHODCALLTYPE *SetNextStatement)(
+        IRemoteDebugApplicationThread* This,
+        IDebugStackFrame *pStackFrame,
+        IDebugCodeContext *pCodeContext);
+
+    HRESULT (STDMETHODCALLTYPE *GetState)(
+        IRemoteDebugApplicationThread* This,
+        DWORD *pState);
+
+    HRESULT (STDMETHODCALLTYPE *Suspend)(
+        IRemoteDebugApplicationThread* This,
+        DWORD *pdwCount);
+
+    HRESULT (STDMETHODCALLTYPE *Resume)(
+        IRemoteDebugApplicationThread* This,
+        DWORD *pdwCount);
+
+    HRESULT (STDMETHODCALLTYPE *GetSuspendCount)(
+        IRemoteDebugApplicationThread* This,
+        DWORD *pdwCount);
+
+    END_INTERFACE
+} IRemoteDebugApplicationThreadVtbl;
+interface IRemoteDebugApplicationThread {
+    CONST_VTBL IRemoteDebugApplicationThreadVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IRemoteDebugApplicationThread_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IRemoteDebugApplicationThread_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRemoteDebugApplicationThread_Release(This) (This)->lpVtbl->Release(This)
+/*** IRemoteDebugApplicationThread methods ***/
+#define IRemoteDebugApplicationThread_GetSystemThreadId(This,dwThreadId) (This)->lpVtbl->GetSystemThreadId(This,dwThreadId)
+#define IRemoteDebugApplicationThread_GetApplication(This,pprda) (This)->lpVtbl->GetApplication(This,pprda)
+#define IRemoteDebugApplicationThread_EnumStackFrames(This,ppedsf) (This)->lpVtbl->EnumStackFrames(This,ppedsf)
+#define IRemoteDebugApplicationThread_GetDescription(This,pbstrDescription,pbstrState) (This)->lpVtbl->GetDescription(This,pbstrDescription,pbstrState)
+#define IRemoteDebugApplicationThread_SetNextStatement(This,pStackFrame,pCodeContext) (This)->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext)
+#define IRemoteDebugApplicationThread_GetState(This,pState) (This)->lpVtbl->GetState(This,pState)
+#define IRemoteDebugApplicationThread_Suspend(This,pdwCount) (This)->lpVtbl->Suspend(This,pdwCount)
+#define IRemoteDebugApplicationThread_Resume(This,pdwCount) (This)->lpVtbl->Resume(This,pdwCount)
+#define IRemoteDebugApplicationThread_GetSuspendCount(This,pdwCount) (This)->lpVtbl->GetSuspendCount(This,pdwCount)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IRemoteDebugApplicationThread_QueryInterface(IRemoteDebugApplicationThread* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IRemoteDebugApplicationThread_AddRef(IRemoteDebugApplicationThread* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IRemoteDebugApplicationThread_Release(IRemoteDebugApplicationThread* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRemoteDebugApplicationThread methods ***/
+static FORCEINLINE HRESULT IRemoteDebugApplicationThread_GetSystemThreadId(IRemoteDebugApplicationThread* This,DWORD *dwThreadId) {
+    return This->lpVtbl->GetSystemThreadId(This,dwThreadId);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationThread_GetApplication(IRemoteDebugApplicationThread* This,IRemoteDebugApplication **pprda) {
+    return This->lpVtbl->GetApplication(This,pprda);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationThread_EnumStackFrames(IRemoteDebugApplicationThread* This,IEnumDebugStackFrames **ppedsf) {
+    return This->lpVtbl->EnumStackFrames(This,ppedsf);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationThread_GetDescription(IRemoteDebugApplicationThread* This,BSTR *pbstrDescription,BSTR *pbstrState) {
+    return This->lpVtbl->GetDescription(This,pbstrDescription,pbstrState);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationThread_SetNextStatement(IRemoteDebugApplicationThread* This,IDebugStackFrame *pStackFrame,IDebugCodeContext *pCodeContext) {
+    return This->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationThread_GetState(IRemoteDebugApplicationThread* This,DWORD *pState) {
+    return This->lpVtbl->GetState(This,pState);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationThread_Suspend(IRemoteDebugApplicationThread* This,DWORD *pdwCount) {
+    return This->lpVtbl->Suspend(This,pdwCount);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationThread_Resume(IRemoteDebugApplicationThread* This,DWORD *pdwCount) {
+    return This->lpVtbl->Resume(This,pdwCount);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplicationThread_GetSuspendCount(IRemoteDebugApplicationThread* This,DWORD *pdwCount) {
+    return This->lpVtbl->GetSuspendCount(This,pdwCount);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetSystemThreadId_Proxy(
+    IRemoteDebugApplicationThread* This,
+    DWORD *dwThreadId);
+void __RPC_STUB IRemoteDebugApplicationThread_GetSystemThreadId_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetApplication_Proxy(
+    IRemoteDebugApplicationThread* This,
+    IRemoteDebugApplication **pprda);
+void __RPC_STUB IRemoteDebugApplicationThread_GetApplication_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_EnumStackFrames_Proxy(
+    IRemoteDebugApplicationThread* This,
+    IEnumDebugStackFrames **ppedsf);
+void __RPC_STUB IRemoteDebugApplicationThread_EnumStackFrames_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetDescription_Proxy(
+    IRemoteDebugApplicationThread* This,
+    BSTR *pbstrDescription,
+    BSTR *pbstrState);
+void __RPC_STUB IRemoteDebugApplicationThread_GetDescription_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_SetNextStatement_Proxy(
+    IRemoteDebugApplicationThread* This,
+    IDebugStackFrame *pStackFrame,
+    IDebugCodeContext *pCodeContext);
+void __RPC_STUB IRemoteDebugApplicationThread_SetNextStatement_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetState_Proxy(
+    IRemoteDebugApplicationThread* This,
+    DWORD *pState);
+void __RPC_STUB IRemoteDebugApplicationThread_GetState_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_Suspend_Proxy(
+    IRemoteDebugApplicationThread* This,
+    DWORD *pdwCount);
+void __RPC_STUB IRemoteDebugApplicationThread_Suspend_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_Resume_Proxy(
+    IRemoteDebugApplicationThread* This,
+    DWORD *pdwCount);
+void __RPC_STUB IRemoteDebugApplicationThread_Resume_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplicationThread_GetSuspendCount_Proxy(
+    IRemoteDebugApplicationThread* This,
+    DWORD *pdwCount);
+void __RPC_STUB IRemoteDebugApplicationThread_GetSuspendCount_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IRemoteDebugApplicationThread_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugApplicationThread interface
+ */
+#ifndef __IDebugApplicationThread_INTERFACE_DEFINED__
+#define __IDebugApplicationThread_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugApplicationThread, 0x51973c38, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c38-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugApplicationThread : public IRemoteDebugApplicationThread
+{
+    virtual HRESULT STDMETHODCALLTYPE SynchronousCallIntoThread32(
+        IDebugThreadCall32 *pstcb,
+        DWORD dwParam1,
+        DWORD dwParam2,
+        DWORD dwParam3) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryIsCurrentThread(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryIsDebuggerThread(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetDescription(
+        LPCOLESTR pstrDescription) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE SetStateString(
+        LPCOLESTR pstrState) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugApplicationThread, 0x51973c38, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugApplicationThreadVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugApplicationThread* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugApplicationThread* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugApplicationThread* This);
+
+    /*** IRemoteDebugApplicationThread methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemThreadId)(
+        IDebugApplicationThread* This,
+        DWORD *dwThreadId);
+
+    HRESULT (STDMETHODCALLTYPE *GetApplication)(
+        IDebugApplicationThread* This,
+        IRemoteDebugApplication **pprda);
+
+    HRESULT (STDMETHODCALLTYPE *EnumStackFrames)(
+        IDebugApplicationThread* This,
+        IEnumDebugStackFrames **ppedsf);
+
+    HRESULT (STDMETHODCALLTYPE *GetDescription)(
+        IDebugApplicationThread* This,
+        BSTR *pbstrDescription,
+        BSTR *pbstrState);
+
+    HRESULT (STDMETHODCALLTYPE *SetNextStatement)(
+        IDebugApplicationThread* This,
+        IDebugStackFrame *pStackFrame,
+        IDebugCodeContext *pCodeContext);
+
+    HRESULT (STDMETHODCALLTYPE *GetState)(
+        IDebugApplicationThread* This,
+        DWORD *pState);
+
+    HRESULT (STDMETHODCALLTYPE *Suspend)(
+        IDebugApplicationThread* This,
+        DWORD *pdwCount);
+
+    HRESULT (STDMETHODCALLTYPE *Resume)(
+        IDebugApplicationThread* This,
+        DWORD *pdwCount);
+
+    HRESULT (STDMETHODCALLTYPE *GetSuspendCount)(
+        IDebugApplicationThread* This,
+        DWORD *pdwCount);
+
+    /*** IDebugApplicationThread methods ***/
+    HRESULT (STDMETHODCALLTYPE *SynchronousCallIntoThread32)(
+        IDebugApplicationThread* This,
+        IDebugThreadCall32 *pstcb,
+        DWORD dwParam1,
+        DWORD dwParam2,
+        DWORD dwParam3);
+
+    HRESULT (STDMETHODCALLTYPE *QueryIsCurrentThread)(
+        IDebugApplicationThread* This);
+
+    HRESULT (STDMETHODCALLTYPE *QueryIsDebuggerThread)(
+        IDebugApplicationThread* This);
+
+    HRESULT (STDMETHODCALLTYPE *SetDescription)(
+        IDebugApplicationThread* This,
+        LPCOLESTR pstrDescription);
+
+    HRESULT (STDMETHODCALLTYPE *SetStateString)(
+        IDebugApplicationThread* This,
+        LPCOLESTR pstrState);
+
+    END_INTERFACE
+} IDebugApplicationThreadVtbl;
+interface IDebugApplicationThread {
+    CONST_VTBL IDebugApplicationThreadVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugApplicationThread_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugApplicationThread_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugApplicationThread_Release(This) (This)->lpVtbl->Release(This)
+/*** IRemoteDebugApplicationThread methods ***/
+#define IDebugApplicationThread_GetSystemThreadId(This,dwThreadId) (This)->lpVtbl->GetSystemThreadId(This,dwThreadId)
+#define IDebugApplicationThread_GetApplication(This,pprda) (This)->lpVtbl->GetApplication(This,pprda)
+#define IDebugApplicationThread_EnumStackFrames(This,ppedsf) (This)->lpVtbl->EnumStackFrames(This,ppedsf)
+#define IDebugApplicationThread_GetDescription(This,pbstrDescription,pbstrState) (This)->lpVtbl->GetDescription(This,pbstrDescription,pbstrState)
+#define IDebugApplicationThread_SetNextStatement(This,pStackFrame,pCodeContext) (This)->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext)
+#define IDebugApplicationThread_GetState(This,pState) (This)->lpVtbl->GetState(This,pState)
+#define IDebugApplicationThread_Suspend(This,pdwCount) (This)->lpVtbl->Suspend(This,pdwCount)
+#define IDebugApplicationThread_Resume(This,pdwCount) (This)->lpVtbl->Resume(This,pdwCount)
+#define IDebugApplicationThread_GetSuspendCount(This,pdwCount) (This)->lpVtbl->GetSuspendCount(This,pdwCount)
+/*** IDebugApplicationThread methods ***/
+#define IDebugApplicationThread_SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3)
+#define IDebugApplicationThread_QueryIsCurrentThread(This) (This)->lpVtbl->QueryIsCurrentThread(This)
+#define IDebugApplicationThread_QueryIsDebuggerThread(This) (This)->lpVtbl->QueryIsDebuggerThread(This)
+#define IDebugApplicationThread_SetDescription(This,pstrDescription) (This)->lpVtbl->SetDescription(This,pstrDescription)
+#define IDebugApplicationThread_SetStateString(This,pstrState) (This)->lpVtbl->SetStateString(This,pstrState)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThread_QueryInterface(IDebugApplicationThread* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugApplicationThread_AddRef(IDebugApplicationThread* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugApplicationThread_Release(IDebugApplicationThread* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRemoteDebugApplicationThread methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThread_GetSystemThreadId(IDebugApplicationThread* This,DWORD *dwThreadId) {
+    return This->lpVtbl->GetSystemThreadId(This,dwThreadId);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread_GetApplication(IDebugApplicationThread* This,IRemoteDebugApplication **pprda) {
+    return This->lpVtbl->GetApplication(This,pprda);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread_EnumStackFrames(IDebugApplicationThread* This,IEnumDebugStackFrames **ppedsf) {
+    return This->lpVtbl->EnumStackFrames(This,ppedsf);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread_GetDescription(IDebugApplicationThread* This,BSTR *pbstrDescription,BSTR *pbstrState) {
+    return This->lpVtbl->GetDescription(This,pbstrDescription,pbstrState);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread_SetNextStatement(IDebugApplicationThread* This,IDebugStackFrame *pStackFrame,IDebugCodeContext *pCodeContext) {
+    return This->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread_GetState(IDebugApplicationThread* This,DWORD *pState) {
+    return This->lpVtbl->GetState(This,pState);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread_Suspend(IDebugApplicationThread* This,DWORD *pdwCount) {
+    return This->lpVtbl->Suspend(This,pdwCount);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread_Resume(IDebugApplicationThread* This,DWORD *pdwCount) {
+    return This->lpVtbl->Resume(This,pdwCount);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread_GetSuspendCount(IDebugApplicationThread* This,DWORD *pdwCount) {
+    return This->lpVtbl->GetSuspendCount(This,pdwCount);
+}
+/*** IDebugApplicationThread methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThread_SynchronousCallIntoThread32(IDebugApplicationThread* This,IDebugThreadCall32 *pstcb,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3) {
+    return This->lpVtbl->SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread_QueryIsCurrentThread(IDebugApplicationThread* This) {
+    return This->lpVtbl->QueryIsCurrentThread(This);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread_QueryIsDebuggerThread(IDebugApplicationThread* This) {
+    return This->lpVtbl->QueryIsDebuggerThread(This);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread_SetDescription(IDebugApplicationThread* This,LPCOLESTR pstrDescription) {
+    return This->lpVtbl->SetDescription(This,pstrDescription);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread_SetStateString(IDebugApplicationThread* This,LPCOLESTR pstrState) {
+    return This->lpVtbl->SetStateString(This,pstrState);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread_SynchronousCallIntoThread32_Proxy(
+    IDebugApplicationThread* This,
+    IDebugThreadCall32 *pstcb,
+    DWORD dwParam1,
+    DWORD dwParam2,
+    DWORD dwParam3);
+void __RPC_STUB IDebugApplicationThread_SynchronousCallIntoThread32_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread_QueryIsCurrentThread_Proxy(
+    IDebugApplicationThread* This);
+void __RPC_STUB IDebugApplicationThread_QueryIsCurrentThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread_QueryIsDebuggerThread_Proxy(
+    IDebugApplicationThread* This);
+void __RPC_STUB IDebugApplicationThread_QueryIsDebuggerThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread_SetDescription_Proxy(
+    IDebugApplicationThread* This,
+    LPCOLESTR pstrDescription);
+void __RPC_STUB IDebugApplicationThread_SetDescription_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread_SetStateString_Proxy(
+    IDebugApplicationThread* This,
+    LPCOLESTR pstrState);
+void __RPC_STUB IDebugApplicationThread_SetStateString_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugApplicationThread_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugApplicationThread64 interface
+ */
+#ifndef __IDebugApplicationThread64_INTERFACE_DEFINED__
+#define __IDebugApplicationThread64_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugApplicationThread64, 0x9dac5886, 0xdbad, 0x456d, 0x9d,0xee, 0x5d,0xec,0x39,0xab,0x3d,0xda);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("9dac5886-dbad-456d-9dee-5dec39ab3dda")
+IDebugApplicationThread64 : public IDebugApplicationThread
+{
+    virtual HRESULT STDMETHODCALLTYPE SynchronousCallIntoThread64(
+        IDebugThreadCall64 *pstcb,
+        DWORDLONG dwParam1,
+        DWORDLONG dwParam2,
+        DWORDLONG dwParam3) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugApplicationThread64, 0x9dac5886, 0xdbad, 0x456d, 0x9d,0xee, 0x5d,0xec,0x39,0xab,0x3d,0xda)
+#endif
+#else
+typedef struct IDebugApplicationThread64Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugApplicationThread64* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugApplicationThread64* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugApplicationThread64* This);
+
+    /*** IRemoteDebugApplicationThread methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetSystemThreadId)(
+        IDebugApplicationThread64* This,
+        DWORD *dwThreadId);
+
+    HRESULT (STDMETHODCALLTYPE *GetApplication)(
+        IDebugApplicationThread64* This,
+        IRemoteDebugApplication **pprda);
+
+    HRESULT (STDMETHODCALLTYPE *EnumStackFrames)(
+        IDebugApplicationThread64* This,
+        IEnumDebugStackFrames **ppedsf);
+
+    HRESULT (STDMETHODCALLTYPE *GetDescription)(
+        IDebugApplicationThread64* This,
+        BSTR *pbstrDescription,
+        BSTR *pbstrState);
+
+    HRESULT (STDMETHODCALLTYPE *SetNextStatement)(
+        IDebugApplicationThread64* This,
+        IDebugStackFrame *pStackFrame,
+        IDebugCodeContext *pCodeContext);
+
+    HRESULT (STDMETHODCALLTYPE *GetState)(
+        IDebugApplicationThread64* This,
+        DWORD *pState);
+
+    HRESULT (STDMETHODCALLTYPE *Suspend)(
+        IDebugApplicationThread64* This,
+        DWORD *pdwCount);
+
+    HRESULT (STDMETHODCALLTYPE *Resume)(
+        IDebugApplicationThread64* This,
+        DWORD *pdwCount);
+
+    HRESULT (STDMETHODCALLTYPE *GetSuspendCount)(
+        IDebugApplicationThread64* This,
+        DWORD *pdwCount);
+
+    /*** IDebugApplicationThread methods ***/
+    HRESULT (STDMETHODCALLTYPE *SynchronousCallIntoThread32)(
+        IDebugApplicationThread64* This,
+        IDebugThreadCall32 *pstcb,
+        DWORD dwParam1,
+        DWORD dwParam2,
+        DWORD dwParam3);
+
+    HRESULT (STDMETHODCALLTYPE *QueryIsCurrentThread)(
+        IDebugApplicationThread64* This);
+
+    HRESULT (STDMETHODCALLTYPE *QueryIsDebuggerThread)(
+        IDebugApplicationThread64* This);
+
+    HRESULT (STDMETHODCALLTYPE *SetDescription)(
+        IDebugApplicationThread64* This,
+        LPCOLESTR pstrDescription);
+
+    HRESULT (STDMETHODCALLTYPE *SetStateString)(
+        IDebugApplicationThread64* This,
+        LPCOLESTR pstrState);
+
+    /*** IDebugApplicationThread64 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SynchronousCallIntoThread64)(
+        IDebugApplicationThread64* This,
+        IDebugThreadCall64 *pstcb,
+        DWORDLONG dwParam1,
+        DWORDLONG dwParam2,
+        DWORDLONG dwParam3);
+
+    END_INTERFACE
+} IDebugApplicationThread64Vtbl;
+interface IDebugApplicationThread64 {
+    CONST_VTBL IDebugApplicationThread64Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugApplicationThread64_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugApplicationThread64_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugApplicationThread64_Release(This) (This)->lpVtbl->Release(This)
+/*** IRemoteDebugApplicationThread methods ***/
+#define IDebugApplicationThread64_GetSystemThreadId(This,dwThreadId) (This)->lpVtbl->GetSystemThreadId(This,dwThreadId)
+#define IDebugApplicationThread64_GetApplication(This,pprda) (This)->lpVtbl->GetApplication(This,pprda)
+#define IDebugApplicationThread64_EnumStackFrames(This,ppedsf) (This)->lpVtbl->EnumStackFrames(This,ppedsf)
+#define IDebugApplicationThread64_GetDescription(This,pbstrDescription,pbstrState) (This)->lpVtbl->GetDescription(This,pbstrDescription,pbstrState)
+#define IDebugApplicationThread64_SetNextStatement(This,pStackFrame,pCodeContext) (This)->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext)
+#define IDebugApplicationThread64_GetState(This,pState) (This)->lpVtbl->GetState(This,pState)
+#define IDebugApplicationThread64_Suspend(This,pdwCount) (This)->lpVtbl->Suspend(This,pdwCount)
+#define IDebugApplicationThread64_Resume(This,pdwCount) (This)->lpVtbl->Resume(This,pdwCount)
+#define IDebugApplicationThread64_GetSuspendCount(This,pdwCount) (This)->lpVtbl->GetSuspendCount(This,pdwCount)
+/*** IDebugApplicationThread methods ***/
+#define IDebugApplicationThread64_SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3)
+#define IDebugApplicationThread64_QueryIsCurrentThread(This) (This)->lpVtbl->QueryIsCurrentThread(This)
+#define IDebugApplicationThread64_QueryIsDebuggerThread(This) (This)->lpVtbl->QueryIsDebuggerThread(This)
+#define IDebugApplicationThread64_SetDescription(This,pstrDescription) (This)->lpVtbl->SetDescription(This,pstrDescription)
+#define IDebugApplicationThread64_SetStateString(This,pstrState) (This)->lpVtbl->SetStateString(This,pstrState)
+/*** IDebugApplicationThread64 methods ***/
+#define IDebugApplicationThread64_SynchronousCallIntoThread64(This,pstcb,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallIntoThread64(This,pstcb,dwParam1,dwParam2,dwParam3)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThread64_QueryInterface(IDebugApplicationThread64* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugApplicationThread64_AddRef(IDebugApplicationThread64* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugApplicationThread64_Release(IDebugApplicationThread64* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRemoteDebugApplicationThread methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThread64_GetSystemThreadId(IDebugApplicationThread64* This,DWORD *dwThreadId) {
+    return This->lpVtbl->GetSystemThreadId(This,dwThreadId);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread64_GetApplication(IDebugApplicationThread64* This,IRemoteDebugApplication **pprda) {
+    return This->lpVtbl->GetApplication(This,pprda);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread64_EnumStackFrames(IDebugApplicationThread64* This,IEnumDebugStackFrames **ppedsf) {
+    return This->lpVtbl->EnumStackFrames(This,ppedsf);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread64_GetDescription(IDebugApplicationThread64* This,BSTR *pbstrDescription,BSTR *pbstrState) {
+    return This->lpVtbl->GetDescription(This,pbstrDescription,pbstrState);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread64_SetNextStatement(IDebugApplicationThread64* This,IDebugStackFrame *pStackFrame,IDebugCodeContext *pCodeContext) {
+    return This->lpVtbl->SetNextStatement(This,pStackFrame,pCodeContext);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread64_GetState(IDebugApplicationThread64* This,DWORD *pState) {
+    return This->lpVtbl->GetState(This,pState);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread64_Suspend(IDebugApplicationThread64* This,DWORD *pdwCount) {
+    return This->lpVtbl->Suspend(This,pdwCount);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread64_Resume(IDebugApplicationThread64* This,DWORD *pdwCount) {
+    return This->lpVtbl->Resume(This,pdwCount);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread64_GetSuspendCount(IDebugApplicationThread64* This,DWORD *pdwCount) {
+    return This->lpVtbl->GetSuspendCount(This,pdwCount);
+}
+/*** IDebugApplicationThread methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThread64_SynchronousCallIntoThread32(IDebugApplicationThread64* This,IDebugThreadCall32 *pstcb,DWORD dwParam1,DWORD dwParam2,DWORD dwParam3) {
+    return This->lpVtbl->SynchronousCallIntoThread32(This,pstcb,dwParam1,dwParam2,dwParam3);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread64_QueryIsCurrentThread(IDebugApplicationThread64* This) {
+    return This->lpVtbl->QueryIsCurrentThread(This);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread64_QueryIsDebuggerThread(IDebugApplicationThread64* This) {
+    return This->lpVtbl->QueryIsDebuggerThread(This);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread64_SetDescription(IDebugApplicationThread64* This,LPCOLESTR pstrDescription) {
+    return This->lpVtbl->SetDescription(This,pstrDescription);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread64_SetStateString(IDebugApplicationThread64* This,LPCOLESTR pstrState) {
+    return This->lpVtbl->SetStateString(This,pstrState);
+}
+/*** IDebugApplicationThread64 methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThread64_SynchronousCallIntoThread64(IDebugApplicationThread64* This,IDebugThreadCall64 *pstcb,DWORDLONG dwParam1,DWORDLONG dwParam2,DWORDLONG dwParam3) {
+    return This->lpVtbl->SynchronousCallIntoThread64(This,pstcb,dwParam1,dwParam2,dwParam3);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread64_SynchronousCallIntoThread64_Proxy(
+    IDebugApplicationThread64* This,
+    IDebugThreadCall64 *pstcb,
+    DWORDLONG dwParam1,
+    DWORDLONG dwParam2,
+    DWORDLONG dwParam3);
+void __RPC_STUB IDebugApplicationThread64_SynchronousCallIntoThread64_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugApplicationThread64_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugCookie interface
+ */
+#ifndef __IDebugCookie_INTERFACE_DEFINED__
+#define __IDebugCookie_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugCookie, 0x51973c39, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c39-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugCookie : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetDebugCookie(
+        DWORD dwDebugAppCookie) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugCookie, 0x51973c39, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugCookieVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugCookie* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugCookie* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugCookie* This);
+
+    /*** IDebugCookie methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetDebugCookie)(
+        IDebugCookie* This,
+        DWORD dwDebugAppCookie);
+
+    END_INTERFACE
+} IDebugCookieVtbl;
+interface IDebugCookie {
+    CONST_VTBL IDebugCookieVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugCookie_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugCookie_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugCookie_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugCookie methods ***/
+#define IDebugCookie_SetDebugCookie(This,dwDebugAppCookie) (This)->lpVtbl->SetDebugCookie(This,dwDebugAppCookie)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugCookie_QueryInterface(IDebugCookie* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugCookie_AddRef(IDebugCookie* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugCookie_Release(IDebugCookie* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugCookie methods ***/
+static FORCEINLINE HRESULT IDebugCookie_SetDebugCookie(IDebugCookie* This,DWORD dwDebugAppCookie) {
+    return This->lpVtbl->SetDebugCookie(This,dwDebugAppCookie);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugCookie_SetDebugCookie_Proxy(
+    IDebugCookie* This,
+    DWORD dwDebugAppCookie);
+void __RPC_STUB IDebugCookie_SetDebugCookie_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugCookie_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IEnumDebugApplicationNodes interface
+ */
+#ifndef __IEnumDebugApplicationNodes_INTERFACE_DEFINED__
+#define __IEnumDebugApplicationNodes_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IEnumDebugApplicationNodes, 0x51973c3a, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c3a-cb0c-11d0-b5c9-00a0244a0e7a")
+IEnumDebugApplicationNodes : public IUnknown
+{
+    virtual HRESULT __stdcall Next(
+        ULONG celt,
+        IDebugApplicationNode **pprddp,
+        ULONG *pceltFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG celt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumDebugApplicationNodes **pperddp) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IEnumDebugApplicationNodes, 0x51973c3a, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IEnumDebugApplicationNodesVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumDebugApplicationNodes* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumDebugApplicationNodes* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumDebugApplicationNodes* This);
+
+    /*** IEnumDebugApplicationNodes methods ***/
+    HRESULT (__stdcall *Next)(
+        IEnumDebugApplicationNodes* This,
+        ULONG celt,
+        IDebugApplicationNode **pprddp,
+        ULONG *pceltFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumDebugApplicationNodes* This,
+        ULONG celt);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumDebugApplicationNodes* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumDebugApplicationNodes* This,
+        IEnumDebugApplicationNodes **pperddp);
+
+    END_INTERFACE
+} IEnumDebugApplicationNodesVtbl;
+interface IEnumDebugApplicationNodes {
+    CONST_VTBL IEnumDebugApplicationNodesVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IEnumDebugApplicationNodes_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IEnumDebugApplicationNodes_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumDebugApplicationNodes_Release(This) (This)->lpVtbl->Release(This)
+/*** IEnumDebugApplicationNodes methods ***/
+#define IEnumDebugApplicationNodes_Next(This,celt,pprddp,pceltFetched) (This)->lpVtbl->Next(This,celt,pprddp,pceltFetched)
+#define IEnumDebugApplicationNodes_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumDebugApplicationNodes_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumDebugApplicationNodes_Clone(This,pperddp) (This)->lpVtbl->Clone(This,pperddp)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IEnumDebugApplicationNodes_QueryInterface(IEnumDebugApplicationNodes* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IEnumDebugApplicationNodes_AddRef(IEnumDebugApplicationNodes* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IEnumDebugApplicationNodes_Release(IEnumDebugApplicationNodes* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IEnumDebugApplicationNodes methods ***/
+static FORCEINLINE HRESULT IEnumDebugApplicationNodes_Next(IEnumDebugApplicationNodes* This,ULONG celt,IDebugApplicationNode **pprddp,ULONG *pceltFetched) {
+    return This->lpVtbl->Next(This,celt,pprddp,pceltFetched);
+}
+static FORCEINLINE HRESULT IEnumDebugApplicationNodes_Skip(IEnumDebugApplicationNodes* This,ULONG celt) {
+    return This->lpVtbl->Skip(This,celt);
+}
+static FORCEINLINE HRESULT IEnumDebugApplicationNodes_Reset(IEnumDebugApplicationNodes* This) {
+    return This->lpVtbl->Reset(This);
+}
+static FORCEINLINE HRESULT IEnumDebugApplicationNodes_Clone(IEnumDebugApplicationNodes* This,IEnumDebugApplicationNodes **pperddp) {
+    return This->lpVtbl->Clone(This,pperddp);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT __stdcall IEnumDebugApplicationNodes_RemoteNext_Proxy(
+    IEnumDebugApplicationNodes* This,
+    ULONG celt,
+    IDebugApplicationNode **pprddp,
+    ULONG *pceltFetched);
+void __RPC_STUB IEnumDebugApplicationNodes_RemoteNext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDebugApplicationNodes_Skip_Proxy(
+    IEnumDebugApplicationNodes* This,
+    ULONG celt);
+void __RPC_STUB IEnumDebugApplicationNodes_Skip_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDebugApplicationNodes_Reset_Proxy(
+    IEnumDebugApplicationNodes* This);
+void __RPC_STUB IEnumDebugApplicationNodes_Reset_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDebugApplicationNodes_Clone_Proxy(
+    IEnumDebugApplicationNodes* This,
+    IEnumDebugApplicationNodes **pperddp);
+void __RPC_STUB IEnumDebugApplicationNodes_Clone_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumDebugApplicationNodes_Next_Proxy(
+    IEnumDebugApplicationNodes* This,
+    ULONG celt,
+    IDebugApplicationNode **pprddp,
+    ULONG *pceltFetched);
+HRESULT __RPC_STUB IEnumDebugApplicationNodes_Next_Stub(
+    IEnumDebugApplicationNodes* This,
+    ULONG celt,
+    IDebugApplicationNode **pprddp,
+    ULONG *pceltFetched);
+
+#endif  /* __IEnumDebugApplicationNodes_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IEnumRemoteDebugApplications interface
+ */
+#ifndef __IEnumRemoteDebugApplications_INTERFACE_DEFINED__
+#define __IEnumRemoteDebugApplications_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IEnumRemoteDebugApplications, 0x51973c3b, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c3b-cb0c-11d0-b5c9-00a0244a0e7a")
+IEnumRemoteDebugApplications : public IUnknown
+{
+    virtual HRESULT __stdcall Next(
+        ULONG celt,
+        IRemoteDebugApplication **ppda,
+        ULONG *pceltFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG celt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumRemoteDebugApplications **ppessd) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IEnumRemoteDebugApplications, 0x51973c3b, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IEnumRemoteDebugApplicationsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumRemoteDebugApplications* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumRemoteDebugApplications* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumRemoteDebugApplications* This);
+
+    /*** IEnumRemoteDebugApplications methods ***/
+    HRESULT (__stdcall *Next)(
+        IEnumRemoteDebugApplications* This,
+        ULONG celt,
+        IRemoteDebugApplication **ppda,
+        ULONG *pceltFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumRemoteDebugApplications* This,
+        ULONG celt);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumRemoteDebugApplications* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumRemoteDebugApplications* This,
+        IEnumRemoteDebugApplications **ppessd);
+
+    END_INTERFACE
+} IEnumRemoteDebugApplicationsVtbl;
+interface IEnumRemoteDebugApplications {
+    CONST_VTBL IEnumRemoteDebugApplicationsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IEnumRemoteDebugApplications_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IEnumRemoteDebugApplications_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumRemoteDebugApplications_Release(This) (This)->lpVtbl->Release(This)
+/*** IEnumRemoteDebugApplications methods ***/
+#define IEnumRemoteDebugApplications_Next(This,celt,ppda,pceltFetched) (This)->lpVtbl->Next(This,celt,ppda,pceltFetched)
+#define IEnumRemoteDebugApplications_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumRemoteDebugApplications_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumRemoteDebugApplications_Clone(This,ppessd) (This)->lpVtbl->Clone(This,ppessd)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IEnumRemoteDebugApplications_QueryInterface(IEnumRemoteDebugApplications* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IEnumRemoteDebugApplications_AddRef(IEnumRemoteDebugApplications* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IEnumRemoteDebugApplications_Release(IEnumRemoteDebugApplications* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IEnumRemoteDebugApplications methods ***/
+static FORCEINLINE HRESULT IEnumRemoteDebugApplications_Next(IEnumRemoteDebugApplications* This,ULONG celt,IRemoteDebugApplication **ppda,ULONG *pceltFetched) {
+    return This->lpVtbl->Next(This,celt,ppda,pceltFetched);
+}
+static FORCEINLINE HRESULT IEnumRemoteDebugApplications_Skip(IEnumRemoteDebugApplications* This,ULONG celt) {
+    return This->lpVtbl->Skip(This,celt);
+}
+static FORCEINLINE HRESULT IEnumRemoteDebugApplications_Reset(IEnumRemoteDebugApplications* This) {
+    return This->lpVtbl->Reset(This);
+}
+static FORCEINLINE HRESULT IEnumRemoteDebugApplications_Clone(IEnumRemoteDebugApplications* This,IEnumRemoteDebugApplications **ppessd) {
+    return This->lpVtbl->Clone(This,ppessd);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT __stdcall IEnumRemoteDebugApplications_RemoteNext_Proxy(
+    IEnumRemoteDebugApplications* This,
+    ULONG celt,
+    IRemoteDebugApplication **ppda,
+    ULONG *pceltFetched);
+void __RPC_STUB IEnumRemoteDebugApplications_RemoteNext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplications_Skip_Proxy(
+    IEnumRemoteDebugApplications* This,
+    ULONG celt);
+void __RPC_STUB IEnumRemoteDebugApplications_Skip_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplications_Reset_Proxy(
+    IEnumRemoteDebugApplications* This);
+void __RPC_STUB IEnumRemoteDebugApplications_Reset_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplications_Clone_Proxy(
+    IEnumRemoteDebugApplications* This,
+    IEnumRemoteDebugApplications **ppessd);
+void __RPC_STUB IEnumRemoteDebugApplications_Clone_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumRemoteDebugApplications_Next_Proxy(
+    IEnumRemoteDebugApplications* This,
+    ULONG celt,
+    IRemoteDebugApplication **ppda,
+    ULONG *pceltFetched);
+HRESULT __RPC_STUB IEnumRemoteDebugApplications_Next_Stub(
+    IEnumRemoteDebugApplications* This,
+    ULONG celt,
+    IRemoteDebugApplication **ppda,
+    ULONG *pceltFetched);
+
+#endif  /* __IEnumRemoteDebugApplications_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IEnumRemoteDebugApplicationThreads interface
+ */
+#ifndef __IEnumRemoteDebugApplicationThreads_INTERFACE_DEFINED__
+#define __IEnumRemoteDebugApplicationThreads_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IEnumRemoteDebugApplicationThreads, 0x51973c3c, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c3c-cb0c-11d0-b5c9-00a0244a0e7a")
+IEnumRemoteDebugApplicationThreads : public IUnknown
+{
+    virtual HRESULT __stdcall Next(
+        ULONG celt,
+        IRemoteDebugApplicationThread **pprdat,
+        ULONG *pceltFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG celt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumRemoteDebugApplicationThreads **pperdat) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IEnumRemoteDebugApplicationThreads, 0x51973c3c, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IEnumRemoteDebugApplicationThreadsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumRemoteDebugApplicationThreads* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumRemoteDebugApplicationThreads* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumRemoteDebugApplicationThreads* This);
+
+    /*** IEnumRemoteDebugApplicationThreads methods ***/
+    HRESULT (__stdcall *Next)(
+        IEnumRemoteDebugApplicationThreads* This,
+        ULONG celt,
+        IRemoteDebugApplicationThread **pprdat,
+        ULONG *pceltFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumRemoteDebugApplicationThreads* This,
+        ULONG celt);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumRemoteDebugApplicationThreads* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumRemoteDebugApplicationThreads* This,
+        IEnumRemoteDebugApplicationThreads **pperdat);
+
+    END_INTERFACE
+} IEnumRemoteDebugApplicationThreadsVtbl;
+interface IEnumRemoteDebugApplicationThreads {
+    CONST_VTBL IEnumRemoteDebugApplicationThreadsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IEnumRemoteDebugApplicationThreads_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IEnumRemoteDebugApplicationThreads_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumRemoteDebugApplicationThreads_Release(This) (This)->lpVtbl->Release(This)
+/*** IEnumRemoteDebugApplicationThreads methods ***/
+#define IEnumRemoteDebugApplicationThreads_Next(This,celt,pprdat,pceltFetched) (This)->lpVtbl->Next(This,celt,pprdat,pceltFetched)
+#define IEnumRemoteDebugApplicationThreads_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumRemoteDebugApplicationThreads_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumRemoteDebugApplicationThreads_Clone(This,pperdat) (This)->lpVtbl->Clone(This,pperdat)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IEnumRemoteDebugApplicationThreads_QueryInterface(IEnumRemoteDebugApplicationThreads* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IEnumRemoteDebugApplicationThreads_AddRef(IEnumRemoteDebugApplicationThreads* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IEnumRemoteDebugApplicationThreads_Release(IEnumRemoteDebugApplicationThreads* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IEnumRemoteDebugApplicationThreads methods ***/
+static FORCEINLINE HRESULT IEnumRemoteDebugApplicationThreads_Next(IEnumRemoteDebugApplicationThreads* This,ULONG celt,IRemoteDebugApplicationThread **pprdat,ULONG *pceltFetched) {
+    return This->lpVtbl->Next(This,celt,pprdat,pceltFetched);
+}
+static FORCEINLINE HRESULT IEnumRemoteDebugApplicationThreads_Skip(IEnumRemoteDebugApplicationThreads* This,ULONG celt) {
+    return This->lpVtbl->Skip(This,celt);
+}
+static FORCEINLINE HRESULT IEnumRemoteDebugApplicationThreads_Reset(IEnumRemoteDebugApplicationThreads* This) {
+    return This->lpVtbl->Reset(This);
+}
+static FORCEINLINE HRESULT IEnumRemoteDebugApplicationThreads_Clone(IEnumRemoteDebugApplicationThreads* This,IEnumRemoteDebugApplicationThreads **pperdat) {
+    return This->lpVtbl->Clone(This,pperdat);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT __stdcall IEnumRemoteDebugApplicationThreads_RemoteNext_Proxy(
+    IEnumRemoteDebugApplicationThreads* This,
+    ULONG celt,
+    IRemoteDebugApplicationThread **ppdat,
+    ULONG *pceltFetched);
+void __RPC_STUB IEnumRemoteDebugApplicationThreads_RemoteNext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplicationThreads_Skip_Proxy(
+    IEnumRemoteDebugApplicationThreads* This,
+    ULONG celt);
+void __RPC_STUB IEnumRemoteDebugApplicationThreads_Skip_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplicationThreads_Reset_Proxy(
+    IEnumRemoteDebugApplicationThreads* This);
+void __RPC_STUB IEnumRemoteDebugApplicationThreads_Reset_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumRemoteDebugApplicationThreads_Clone_Proxy(
+    IEnumRemoteDebugApplicationThreads* This,
+    IEnumRemoteDebugApplicationThreads **pperdat);
+void __RPC_STUB IEnumRemoteDebugApplicationThreads_Clone_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumRemoteDebugApplicationThreads_Next_Proxy(
+    IEnumRemoteDebugApplicationThreads* This,
+    ULONG celt,
+    IRemoteDebugApplicationThread **pprdat,
+    ULONG *pceltFetched);
+HRESULT __RPC_STUB IEnumRemoteDebugApplicationThreads_Next_Stub(
+    IEnumRemoteDebugApplicationThreads* This,
+    ULONG celt,
+    IRemoteDebugApplicationThread **ppdat,
+    ULONG *pceltFetched);
+
+#endif  /* __IEnumRemoteDebugApplicationThreads_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugFormatter interface
+ */
+#ifndef __IDebugFormatter_INTERFACE_DEFINED__
+#define __IDebugFormatter_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugFormatter, 0x51973c05, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c05-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugFormatter : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetStringForVariant(
+        VARIANT *pvar,
+        ULONG nRadix,
+        BSTR *pbstrValue) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetVariantForString(
+        LPCOLESTR pwstrValue,
+        VARIANT *pvar) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetStringForVarType(
+        VARTYPE vt,
+        TYPEDESC *ptdescArrayType,
+        BSTR *pbstr) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugFormatter, 0x51973c05, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugFormatterVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugFormatter* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugFormatter* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugFormatter* This);
+
+    /*** IDebugFormatter methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetStringForVariant)(
+        IDebugFormatter* This,
+        VARIANT *pvar,
+        ULONG nRadix,
+        BSTR *pbstrValue);
+
+    HRESULT (STDMETHODCALLTYPE *GetVariantForString)(
+        IDebugFormatter* This,
+        LPCOLESTR pwstrValue,
+        VARIANT *pvar);
+
+    HRESULT (STDMETHODCALLTYPE *GetStringForVarType)(
+        IDebugFormatter* This,
+        VARTYPE vt,
+        TYPEDESC *ptdescArrayType,
+        BSTR *pbstr);
+
+    END_INTERFACE
+} IDebugFormatterVtbl;
+interface IDebugFormatter {
+    CONST_VTBL IDebugFormatterVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugFormatter_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugFormatter_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugFormatter_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugFormatter methods ***/
+#define IDebugFormatter_GetStringForVariant(This,pvar,nRadix,pbstrValue) (This)->lpVtbl->GetStringForVariant(This,pvar,nRadix,pbstrValue)
+#define IDebugFormatter_GetVariantForString(This,pwstrValue,pvar) (This)->lpVtbl->GetVariantForString(This,pwstrValue,pvar)
+#define IDebugFormatter_GetStringForVarType(This,vt,ptdescArrayType,pbstr) (This)->lpVtbl->GetStringForVarType(This,vt,ptdescArrayType,pbstr)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugFormatter_QueryInterface(IDebugFormatter* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugFormatter_AddRef(IDebugFormatter* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugFormatter_Release(IDebugFormatter* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugFormatter methods ***/
+static FORCEINLINE HRESULT IDebugFormatter_GetStringForVariant(IDebugFormatter* This,VARIANT *pvar,ULONG nRadix,BSTR *pbstrValue) {
+    return This->lpVtbl->GetStringForVariant(This,pvar,nRadix,pbstrValue);
+}
+static FORCEINLINE HRESULT IDebugFormatter_GetVariantForString(IDebugFormatter* This,LPCOLESTR pwstrValue,VARIANT *pvar) {
+    return This->lpVtbl->GetVariantForString(This,pwstrValue,pvar);
+}
+static FORCEINLINE HRESULT IDebugFormatter_GetStringForVarType(IDebugFormatter* This,VARTYPE vt,TYPEDESC *ptdescArrayType,BSTR *pbstr) {
+    return This->lpVtbl->GetStringForVarType(This,vt,ptdescArrayType,pbstr);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugFormatter_GetStringForVariant_Proxy(
+    IDebugFormatter* This,
+    VARIANT *pvar,
+    ULONG nRadix,
+    BSTR *pbstrValue);
+void __RPC_STUB IDebugFormatter_GetStringForVariant_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugFormatter_GetVariantForString_Proxy(
+    IDebugFormatter* This,
+    LPCOLESTR pwstrValue,
+    VARIANT *pvar);
+void __RPC_STUB IDebugFormatter_GetVariantForString_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugFormatter_GetStringForVarType_Proxy(
+    IDebugFormatter* This,
+    VARTYPE vt,
+    TYPEDESC *ptdescArrayType,
+    BSTR *pbstr);
+void __RPC_STUB IDebugFormatter_GetStringForVarType_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugFormatter_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * ISimpleConnectionPoint interface
+ */
+#ifndef __ISimpleConnectionPoint_INTERFACE_DEFINED__
+#define __ISimpleConnectionPoint_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_ISimpleConnectionPoint, 0x51973c3e, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c3e-cb0c-11d0-b5c9-00a0244a0e7a")
+ISimpleConnectionPoint : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetEventCount(
+        ULONG *pulCount) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE DescribeEvents(
+        ULONG iEvent,
+        ULONG cEvents,
+        DISPID *prgid,
+        BSTR *prgbstr,
+        ULONG *pcEventsFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Advise(
+        IDispatch *pdisp,
+        DWORD *pdwCookie) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Unadvise(
+        DWORD dwCookie) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(ISimpleConnectionPoint, 0x51973c3e, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct ISimpleConnectionPointVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        ISimpleConnectionPoint* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        ISimpleConnectionPoint* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        ISimpleConnectionPoint* This);
+
+    /*** ISimpleConnectionPoint methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetEventCount)(
+        ISimpleConnectionPoint* This,
+        ULONG *pulCount);
+
+    HRESULT (STDMETHODCALLTYPE *DescribeEvents)(
+        ISimpleConnectionPoint* This,
+        ULONG iEvent,
+        ULONG cEvents,
+        DISPID *prgid,
+        BSTR *prgbstr,
+        ULONG *pcEventsFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Advise)(
+        ISimpleConnectionPoint* This,
+        IDispatch *pdisp,
+        DWORD *pdwCookie);
+
+    HRESULT (STDMETHODCALLTYPE *Unadvise)(
+        ISimpleConnectionPoint* This,
+        DWORD dwCookie);
+
+    END_INTERFACE
+} ISimpleConnectionPointVtbl;
+interface ISimpleConnectionPoint {
+    CONST_VTBL ISimpleConnectionPointVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define ISimpleConnectionPoint_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define ISimpleConnectionPoint_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define ISimpleConnectionPoint_Release(This) (This)->lpVtbl->Release(This)
+/*** ISimpleConnectionPoint methods ***/
+#define ISimpleConnectionPoint_GetEventCount(This,pulCount) (This)->lpVtbl->GetEventCount(This,pulCount)
+#define ISimpleConnectionPoint_DescribeEvents(This,iEvent,cEvents,prgid,prgbstr,pcEventsFetched) (This)->lpVtbl->DescribeEvents(This,iEvent,cEvents,prgid,prgbstr,pcEventsFetched)
+#define ISimpleConnectionPoint_Advise(This,pdisp,pdwCookie) (This)->lpVtbl->Advise(This,pdisp,pdwCookie)
+#define ISimpleConnectionPoint_Unadvise(This,dwCookie) (This)->lpVtbl->Unadvise(This,dwCookie)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT ISimpleConnectionPoint_QueryInterface(ISimpleConnectionPoint* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG ISimpleConnectionPoint_AddRef(ISimpleConnectionPoint* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG ISimpleConnectionPoint_Release(ISimpleConnectionPoint* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** ISimpleConnectionPoint methods ***/
+static FORCEINLINE HRESULT ISimpleConnectionPoint_GetEventCount(ISimpleConnectionPoint* This,ULONG *pulCount) {
+    return This->lpVtbl->GetEventCount(This,pulCount);
+}
+static FORCEINLINE HRESULT ISimpleConnectionPoint_DescribeEvents(ISimpleConnectionPoint* This,ULONG iEvent,ULONG cEvents,DISPID *prgid,BSTR *prgbstr,ULONG *pcEventsFetched) {
+    return This->lpVtbl->DescribeEvents(This,iEvent,cEvents,prgid,prgbstr,pcEventsFetched);
+}
+static FORCEINLINE HRESULT ISimpleConnectionPoint_Advise(ISimpleConnectionPoint* This,IDispatch *pdisp,DWORD *pdwCookie) {
+    return This->lpVtbl->Advise(This,pdisp,pdwCookie);
+}
+static FORCEINLINE HRESULT ISimpleConnectionPoint_Unadvise(ISimpleConnectionPoint* This,DWORD dwCookie) {
+    return This->lpVtbl->Unadvise(This,dwCookie);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE ISimpleConnectionPoint_GetEventCount_Proxy(
+    ISimpleConnectionPoint* This,
+    ULONG *pulCount);
+void __RPC_STUB ISimpleConnectionPoint_GetEventCount_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE ISimpleConnectionPoint_DescribeEvents_Proxy(
+    ISimpleConnectionPoint* This,
+    ULONG iEvent,
+    ULONG cEvents,
+    DISPID *prgid,
+    BSTR *prgbstr,
+    ULONG *pcEventsFetched);
+void __RPC_STUB ISimpleConnectionPoint_DescribeEvents_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE ISimpleConnectionPoint_Advise_Proxy(
+    ISimpleConnectionPoint* This,
+    IDispatch *pdisp,
+    DWORD *pdwCookie);
+void __RPC_STUB ISimpleConnectionPoint_Advise_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE ISimpleConnectionPoint_Unadvise_Proxy(
+    ISimpleConnectionPoint* This,
+    DWORD dwCookie);
+void __RPC_STUB ISimpleConnectionPoint_Unadvise_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __ISimpleConnectionPoint_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugHelper interface
+ */
+#ifndef __IDebugHelper_INTERFACE_DEFINED__
+#define __IDebugHelper_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugHelper, 0x51973c3f, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c3f-cb0c-11d0-b5c9-00a0244a0e7a")
+IDebugHelper : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE CreatePropertyBrowser(
+        VARIANT *pvar,
+        LPCOLESTR bstrName,
+        IDebugApplicationThread *pdat,
+        IDebugProperty **ppdob) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreatePropertyBrowserEx(
+        VARIANT *pvar,
+        LPCOLESTR bstrName,
+        IDebugApplicationThread *pdat,
+        IDebugFormatter *pdf,
+        IDebugProperty **ppdob) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateSimpleConnectionPoint(
+        IDispatch *pdisp,
+        ISimpleConnectionPoint **ppscp) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugHelper, 0x51973c3f, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IDebugHelperVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugHelper* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugHelper* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugHelper* This);
+
+    /*** IDebugHelper methods ***/
+    HRESULT (STDMETHODCALLTYPE *CreatePropertyBrowser)(
+        IDebugHelper* This,
+        VARIANT *pvar,
+        LPCOLESTR bstrName,
+        IDebugApplicationThread *pdat,
+        IDebugProperty **ppdob);
+
+    HRESULT (STDMETHODCALLTYPE *CreatePropertyBrowserEx)(
+        IDebugHelper* This,
+        VARIANT *pvar,
+        LPCOLESTR bstrName,
+        IDebugApplicationThread *pdat,
+        IDebugFormatter *pdf,
+        IDebugProperty **ppdob);
+
+    HRESULT (STDMETHODCALLTYPE *CreateSimpleConnectionPoint)(
+        IDebugHelper* This,
+        IDispatch *pdisp,
+        ISimpleConnectionPoint **ppscp);
+
+    END_INTERFACE
+} IDebugHelperVtbl;
+interface IDebugHelper {
+    CONST_VTBL IDebugHelperVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugHelper_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugHelper_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugHelper_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugHelper methods ***/
+#define IDebugHelper_CreatePropertyBrowser(This,pvar,bstrName,pdat,ppdob) (This)->lpVtbl->CreatePropertyBrowser(This,pvar,bstrName,pdat,ppdob)
+#define IDebugHelper_CreatePropertyBrowserEx(This,pvar,bstrName,pdat,pdf,ppdob) (This)->lpVtbl->CreatePropertyBrowserEx(This,pvar,bstrName,pdat,pdf,ppdob)
+#define IDebugHelper_CreateSimpleConnectionPoint(This,pdisp,ppscp) (This)->lpVtbl->CreateSimpleConnectionPoint(This,pdisp,ppscp)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugHelper_QueryInterface(IDebugHelper* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugHelper_AddRef(IDebugHelper* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugHelper_Release(IDebugHelper* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugHelper methods ***/
+static FORCEINLINE HRESULT IDebugHelper_CreatePropertyBrowser(IDebugHelper* This,VARIANT *pvar,LPCOLESTR bstrName,IDebugApplicationThread *pdat,IDebugProperty **ppdob) {
+    return This->lpVtbl->CreatePropertyBrowser(This,pvar,bstrName,pdat,ppdob);
+}
+static FORCEINLINE HRESULT IDebugHelper_CreatePropertyBrowserEx(IDebugHelper* This,VARIANT *pvar,LPCOLESTR bstrName,IDebugApplicationThread *pdat,IDebugFormatter *pdf,IDebugProperty **ppdob) {
+    return This->lpVtbl->CreatePropertyBrowserEx(This,pvar,bstrName,pdat,pdf,ppdob);
+}
+static FORCEINLINE HRESULT IDebugHelper_CreateSimpleConnectionPoint(IDebugHelper* This,IDispatch *pdisp,ISimpleConnectionPoint **ppscp) {
+    return This->lpVtbl->CreateSimpleConnectionPoint(This,pdisp,ppscp);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugHelper_CreatePropertyBrowser_Proxy(
+    IDebugHelper* This,
+    VARIANT *pvar,
+    LPCOLESTR bstrName,
+    IDebugApplicationThread *pdat,
+    IDebugProperty **ppdob);
+void __RPC_STUB IDebugHelper_CreatePropertyBrowser_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugHelper_CreatePropertyBrowserEx_Proxy(
+    IDebugHelper* This,
+    VARIANT *pvar,
+    LPCOLESTR bstrName,
+    IDebugApplicationThread *pdat,
+    IDebugFormatter *pdf,
+    IDebugProperty **ppdob);
+void __RPC_STUB IDebugHelper_CreatePropertyBrowserEx_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugHelper_CreateSimpleConnectionPoint_Proxy(
+    IDebugHelper* This,
+    IDispatch *pdisp,
+    ISimpleConnectionPoint **ppscp);
+void __RPC_STUB IDebugHelper_CreateSimpleConnectionPoint_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugHelper_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IEnumDebugExpressionContexts interface
+ */
+#ifndef __IEnumDebugExpressionContexts_INTERFACE_DEFINED__
+#define __IEnumDebugExpressionContexts_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IEnumDebugExpressionContexts, 0x51973c40, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c40-cb0c-11d0-b5c9-00a0244a0e7a")
+IEnumDebugExpressionContexts : public IUnknown
+{
+    virtual HRESULT __stdcall Next(
+        ULONG celt,
+        IDebugExpressionContext **ppdec,
+        ULONG *pceltFetched) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Skip(
+        ULONG celt) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Reset(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE Clone(
+        IEnumDebugExpressionContexts **ppedec) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IEnumDebugExpressionContexts, 0x51973c40, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IEnumDebugExpressionContextsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IEnumDebugExpressionContexts* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IEnumDebugExpressionContexts* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IEnumDebugExpressionContexts* This);
+
+    /*** IEnumDebugExpressionContexts methods ***/
+    HRESULT (__stdcall *Next)(
+        IEnumDebugExpressionContexts* This,
+        ULONG celt,
+        IDebugExpressionContext **ppdec,
+        ULONG *pceltFetched);
+
+    HRESULT (STDMETHODCALLTYPE *Skip)(
+        IEnumDebugExpressionContexts* This,
+        ULONG celt);
+
+    HRESULT (STDMETHODCALLTYPE *Reset)(
+        IEnumDebugExpressionContexts* This);
+
+    HRESULT (STDMETHODCALLTYPE *Clone)(
+        IEnumDebugExpressionContexts* This,
+        IEnumDebugExpressionContexts **ppedec);
+
+    END_INTERFACE
+} IEnumDebugExpressionContextsVtbl;
+interface IEnumDebugExpressionContexts {
+    CONST_VTBL IEnumDebugExpressionContextsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IEnumDebugExpressionContexts_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IEnumDebugExpressionContexts_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IEnumDebugExpressionContexts_Release(This) (This)->lpVtbl->Release(This)
+/*** IEnumDebugExpressionContexts methods ***/
+#define IEnumDebugExpressionContexts_Next(This,celt,ppdec,pceltFetched) (This)->lpVtbl->Next(This,celt,ppdec,pceltFetched)
+#define IEnumDebugExpressionContexts_Skip(This,celt) (This)->lpVtbl->Skip(This,celt)
+#define IEnumDebugExpressionContexts_Reset(This) (This)->lpVtbl->Reset(This)
+#define IEnumDebugExpressionContexts_Clone(This,ppedec) (This)->lpVtbl->Clone(This,ppedec)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IEnumDebugExpressionContexts_QueryInterface(IEnumDebugExpressionContexts* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IEnumDebugExpressionContexts_AddRef(IEnumDebugExpressionContexts* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IEnumDebugExpressionContexts_Release(IEnumDebugExpressionContexts* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IEnumDebugExpressionContexts methods ***/
+static FORCEINLINE HRESULT IEnumDebugExpressionContexts_Next(IEnumDebugExpressionContexts* This,ULONG celt,IDebugExpressionContext **ppdec,ULONG *pceltFetched) {
+    return This->lpVtbl->Next(This,celt,ppdec,pceltFetched);
+}
+static FORCEINLINE HRESULT IEnumDebugExpressionContexts_Skip(IEnumDebugExpressionContexts* This,ULONG celt) {
+    return This->lpVtbl->Skip(This,celt);
+}
+static FORCEINLINE HRESULT IEnumDebugExpressionContexts_Reset(IEnumDebugExpressionContexts* This) {
+    return This->lpVtbl->Reset(This);
+}
+static FORCEINLINE HRESULT IEnumDebugExpressionContexts_Clone(IEnumDebugExpressionContexts* This,IEnumDebugExpressionContexts **ppedec) {
+    return This->lpVtbl->Clone(This,ppedec);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT __stdcall IEnumDebugExpressionContexts_RemoteNext_Proxy(
+    IEnumDebugExpressionContexts* This,
+    ULONG celt,
+    IDebugExpressionContext **pprgdec,
+    ULONG *pceltFetched);
+void __RPC_STUB IEnumDebugExpressionContexts_RemoteNext_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDebugExpressionContexts_Skip_Proxy(
+    IEnumDebugExpressionContexts* This,
+    ULONG celt);
+void __RPC_STUB IEnumDebugExpressionContexts_Skip_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDebugExpressionContexts_Reset_Proxy(
+    IEnumDebugExpressionContexts* This);
+void __RPC_STUB IEnumDebugExpressionContexts_Reset_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IEnumDebugExpressionContexts_Clone_Proxy(
+    IEnumDebugExpressionContexts* This,
+    IEnumDebugExpressionContexts **ppedec);
+void __RPC_STUB IEnumDebugExpressionContexts_Clone_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT CALLBACK IEnumDebugExpressionContexts_Next_Proxy(
+    IEnumDebugExpressionContexts* This,
+    ULONG celt,
+    IDebugExpressionContext **ppdec,
+    ULONG *pceltFetched);
+HRESULT __RPC_STUB IEnumDebugExpressionContexts_Next_Stub(
+    IEnumDebugExpressionContexts* This,
+    ULONG celt,
+    IDebugExpressionContext **pprgdec,
+    ULONG *pceltFetched);
+
+#endif  /* __IEnumDebugExpressionContexts_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IProvideExpressionContexts interface
+ */
+#ifndef __IProvideExpressionContexts_INTERFACE_DEFINED__
+#define __IProvideExpressionContexts_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IProvideExpressionContexts, 0x51973c41, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("51973c41-cb0c-11d0-b5c9-00a0244a0e7a")
+IProvideExpressionContexts : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE EnumExpressionContexts(
+        IEnumDebugExpressionContexts **ppedec) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IProvideExpressionContexts, 0x51973c41, 0xcb0c, 0x11d0, 0xb5,0xc9, 0x00,0xa0,0x24,0x4a,0x0e,0x7a)
+#endif
+#else
+typedef struct IProvideExpressionContextsVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IProvideExpressionContexts* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IProvideExpressionContexts* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IProvideExpressionContexts* This);
+
+    /*** IProvideExpressionContexts methods ***/
+    HRESULT (STDMETHODCALLTYPE *EnumExpressionContexts)(
+        IProvideExpressionContexts* This,
+        IEnumDebugExpressionContexts **ppedec);
+
+    END_INTERFACE
+} IProvideExpressionContextsVtbl;
+interface IProvideExpressionContexts {
+    CONST_VTBL IProvideExpressionContextsVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IProvideExpressionContexts_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IProvideExpressionContexts_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IProvideExpressionContexts_Release(This) (This)->lpVtbl->Release(This)
+/*** IProvideExpressionContexts methods ***/
+#define IProvideExpressionContexts_EnumExpressionContexts(This,ppedec) (This)->lpVtbl->EnumExpressionContexts(This,ppedec)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IProvideExpressionContexts_QueryInterface(IProvideExpressionContexts* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IProvideExpressionContexts_AddRef(IProvideExpressionContexts* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IProvideExpressionContexts_Release(IProvideExpressionContexts* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IProvideExpressionContexts methods ***/
+static FORCEINLINE HRESULT IProvideExpressionContexts_EnumExpressionContexts(IProvideExpressionContexts* This,IEnumDebugExpressionContexts **ppedec) {
+    return This->lpVtbl->EnumExpressionContexts(This,ppedec);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IProvideExpressionContexts_EnumExpressionContexts_Proxy(
+    IProvideExpressionContexts* This,
+    IEnumDebugExpressionContexts **ppedec);
+void __RPC_STUB IProvideExpressionContexts_EnumExpressionContexts_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IProvideExpressionContexts_INTERFACE_DEFINED__ */
+
+
+DEFINE_GUID(LIBID_ProcessDebugManagerLib, 0x78a51821, 0x51f4, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
+
+#ifndef __IActiveScriptDebug32_FWD_DEFINED__
+#define __IActiveScriptDebug32_FWD_DEFINED__
+typedef interface IActiveScriptDebug32 IActiveScriptDebug32;
+#endif
+
+#ifndef __IActiveScriptDebug64_FWD_DEFINED__
+#define __IActiveScriptDebug64_FWD_DEFINED__
+typedef interface IActiveScriptDebug64 IActiveScriptDebug64;
+#endif
+
+#ifndef __IActiveScriptErrorDebug_FWD_DEFINED__
+#define __IActiveScriptErrorDebug_FWD_DEFINED__
+typedef interface IActiveScriptErrorDebug IActiveScriptErrorDebug;
+#endif
+
+#ifndef __IActiveScriptSiteDebug32_FWD_DEFINED__
+#define __IActiveScriptSiteDebug32_FWD_DEFINED__
+typedef interface IActiveScriptSiteDebug32 IActiveScriptSiteDebug32;
+#endif
+
+#ifndef __IActiveScriptSiteDebug64_FWD_DEFINED__
+#define __IActiveScriptSiteDebug64_FWD_DEFINED__
+typedef interface IActiveScriptSiteDebug64 IActiveScriptSiteDebug64;
+#endif
+
+#ifndef __IActiveScriptSiteDebugEx_FWD_DEFINED__
+#define __IActiveScriptSiteDebugEx_FWD_DEFINED__
+typedef interface IActiveScriptSiteDebugEx IActiveScriptSiteDebugEx;
+#endif
+
+#ifndef __IApplicationDebugger_FWD_DEFINED__
+#define __IApplicationDebugger_FWD_DEFINED__
+typedef interface IApplicationDebugger IApplicationDebugger;
+#endif
+
+#ifndef __IApplicationDebuggerUI_FWD_DEFINED__
+#define __IApplicationDebuggerUI_FWD_DEFINED__
+typedef interface IApplicationDebuggerUI IApplicationDebuggerUI;
+#endif
+
+#ifndef __IDebugApplication32_FWD_DEFINED__
+#define __IDebugApplication32_FWD_DEFINED__
+typedef interface IDebugApplication32 IDebugApplication32;
+#endif
+
+#ifndef __IDebugApplication64_FWD_DEFINED__
+#define __IDebugApplication64_FWD_DEFINED__
+typedef interface IDebugApplication64 IDebugApplication64;
+#endif
+
+#ifndef __IDebugApplicationNode_FWD_DEFINED__
+#define __IDebugApplicationNode_FWD_DEFINED__
+typedef interface IDebugApplicationNode IDebugApplicationNode;
+#endif
+
+#ifndef __IDebugApplicationNodeEvents_FWD_DEFINED__
+#define __IDebugApplicationNodeEvents_FWD_DEFINED__
+typedef interface IDebugApplicationNodeEvents IDebugApplicationNodeEvents;
+#endif
+
+#ifndef __AsyncIDebugApplicationNodeEvents_FWD_DEFINED__
+#define __AsyncIDebugApplicationNodeEvents_FWD_DEFINED__
+typedef interface AsyncIDebugApplicationNodeEvents AsyncIDebugApplicationNodeEvents;
+#endif
+
+#ifndef __IDebugApplicationThread_FWD_DEFINED__
+#define __IDebugApplicationThread_FWD_DEFINED__
+typedef interface IDebugApplicationThread IDebugApplicationThread;
+#endif
+
+#ifndef __IDebugAsyncOperation_FWD_DEFINED__
+#define __IDebugAsyncOperation_FWD_DEFINED__
+typedef interface IDebugAsyncOperation IDebugAsyncOperation;
+#endif
+
+#ifndef __IDebugAsyncOperationCallBack_FWD_DEFINED__
+#define __IDebugAsyncOperationCallBack_FWD_DEFINED__
+typedef interface IDebugAsyncOperationCallBack IDebugAsyncOperationCallBack;
+#endif
+
+#ifndef __IDebugCodeContext_FWD_DEFINED__
+#define __IDebugCodeContext_FWD_DEFINED__
+typedef interface IDebugCodeContext IDebugCodeContext;
+#endif
+
+#ifndef __IDebugCookie_FWD_DEFINED__
+#define __IDebugCookie_FWD_DEFINED__
+typedef interface IDebugCookie IDebugCookie;
+#endif
+
+#ifndef __IDebugDocument_FWD_DEFINED__
+#define __IDebugDocument_FWD_DEFINED__
+typedef interface IDebugDocument IDebugDocument;
+#endif
+
+#ifndef __IDebugDocumentContext_FWD_DEFINED__
+#define __IDebugDocumentContext_FWD_DEFINED__
+typedef interface IDebugDocumentContext IDebugDocumentContext;
+#endif
+
+#ifndef __IDebugDocumentHelper32_FWD_DEFINED__
+#define __IDebugDocumentHelper32_FWD_DEFINED__
+typedef interface IDebugDocumentHelper32 IDebugDocumentHelper32;
+#endif
+
+#ifndef __IDebugDocumentHelper64_FWD_DEFINED__
+#define __IDebugDocumentHelper64_FWD_DEFINED__
+typedef interface IDebugDocumentHelper64 IDebugDocumentHelper64;
+#endif
+
+#ifndef __IDebugDocumentHost_FWD_DEFINED__
+#define __IDebugDocumentHost_FWD_DEFINED__
+typedef interface IDebugDocumentHost IDebugDocumentHost;
+#endif
+
+#ifndef __IDebugDocumentInfo_FWD_DEFINED__
+#define __IDebugDocumentInfo_FWD_DEFINED__
+typedef interface IDebugDocumentInfo IDebugDocumentInfo;
+#endif
+
+#ifndef __IDebugDocumentProvider_FWD_DEFINED__
+#define __IDebugDocumentProvider_FWD_DEFINED__
+typedef interface IDebugDocumentProvider IDebugDocumentProvider;
+#endif
+
+#ifndef __IDebugDocumentText_FWD_DEFINED__
+#define __IDebugDocumentText_FWD_DEFINED__
+typedef interface IDebugDocumentText IDebugDocumentText;
+#endif
+
+#ifndef __IDebugDocumentTextAuthor_FWD_DEFINED__
+#define __IDebugDocumentTextAuthor_FWD_DEFINED__
+typedef interface IDebugDocumentTextAuthor IDebugDocumentTextAuthor;
+#endif
+
+#ifndef __IDebugDocumentTextEvents_FWD_DEFINED__
+#define __IDebugDocumentTextEvents_FWD_DEFINED__
+typedef interface IDebugDocumentTextEvents IDebugDocumentTextEvents;
+#endif
+
+#ifndef __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
+#define __IDebugDocumentTextExternalAuthor_FWD_DEFINED__
+typedef interface IDebugDocumentTextExternalAuthor IDebugDocumentTextExternalAuthor;
+#endif
+
+#ifndef __IDebugExpression_FWD_DEFINED__
+#define __IDebugExpression_FWD_DEFINED__
+typedef interface IDebugExpression IDebugExpression;
+#endif
+
+#ifndef __IDebugExpressionCallBack_FWD_DEFINED__
+#define __IDebugExpressionCallBack_FWD_DEFINED__
+typedef interface IDebugExpressionCallBack IDebugExpressionCallBack;
+#endif
+
+#ifndef __IDebugExpressionContext_FWD_DEFINED__
+#define __IDebugExpressionContext_FWD_DEFINED__
+typedef interface IDebugExpressionContext IDebugExpressionContext;
+#endif
+
+#ifndef __IDebugFormatter_FWD_DEFINED__
+#define __IDebugFormatter_FWD_DEFINED__
+typedef interface IDebugFormatter IDebugFormatter;
+#endif
+
+#ifndef __IDebugHelper_FWD_DEFINED__
+#define __IDebugHelper_FWD_DEFINED__
+typedef interface IDebugHelper IDebugHelper;
+#endif
+
+#ifndef __IDebugSessionProvider_FWD_DEFINED__
+#define __IDebugSessionProvider_FWD_DEFINED__
+typedef interface IDebugSessionProvider IDebugSessionProvider;
+#endif
+
+#ifndef __IDebugStackFrame_FWD_DEFINED__
+#define __IDebugStackFrame_FWD_DEFINED__
+typedef interface IDebugStackFrame IDebugStackFrame;
+#endif
+
+#ifndef __IDebugStackFrameSniffer_FWD_DEFINED__
+#define __IDebugStackFrameSniffer_FWD_DEFINED__
+typedef interface IDebugStackFrameSniffer IDebugStackFrameSniffer;
+#endif
+
+#ifndef __IDebugStackFrameSnifferEx32_FWD_DEFINED__
+#define __IDebugStackFrameSnifferEx32_FWD_DEFINED__
+typedef interface IDebugStackFrameSnifferEx32 IDebugStackFrameSnifferEx32;
+#endif
+
+#ifndef __IDebugStackFrameSnifferEx64_FWD_DEFINED__
+#define __IDebugStackFrameSnifferEx64_FWD_DEFINED__
+typedef interface IDebugStackFrameSnifferEx64 IDebugStackFrameSnifferEx64;
+#endif
+
+#ifndef __IDebugSyncOperation_FWD_DEFINED__
+#define __IDebugSyncOperation_FWD_DEFINED__
+typedef interface IDebugSyncOperation IDebugSyncOperation;
+#endif
+
+#ifndef __IDebugThreadCall32_FWD_DEFINED__
+#define __IDebugThreadCall32_FWD_DEFINED__
+typedef interface IDebugThreadCall32 IDebugThreadCall32;
+#endif
+
+#ifndef __IDebugThreadCall64_FWD_DEFINED__
+#define __IDebugThreadCall64_FWD_DEFINED__
+typedef interface IDebugThreadCall64 IDebugThreadCall64;
+#endif
+
+#ifndef __IEnumDebugApplicationNodes_FWD_DEFINED__
+#define __IEnumDebugApplicationNodes_FWD_DEFINED__
+typedef interface IEnumDebugApplicationNodes IEnumDebugApplicationNodes;
+#endif
+
+#ifndef __IEnumDebugCodeContexts_FWD_DEFINED__
+#define __IEnumDebugCodeContexts_FWD_DEFINED__
+typedef interface IEnumDebugCodeContexts IEnumDebugCodeContexts;
+#endif
+
+#ifndef __IEnumDebugExpressionContexts_FWD_DEFINED__
+#define __IEnumDebugExpressionContexts_FWD_DEFINED__
+typedef interface IEnumDebugExpressionContexts IEnumDebugExpressionContexts;
+#endif
+
+#ifndef __IEnumDebugStackFrames_FWD_DEFINED__
+#define __IEnumDebugStackFrames_FWD_DEFINED__
+typedef interface IEnumDebugStackFrames IEnumDebugStackFrames;
+#endif
+
+#ifndef __IEnumDebugStackFrames64_FWD_DEFINED__
+#define __IEnumDebugStackFrames64_FWD_DEFINED__
+typedef interface IEnumDebugStackFrames64 IEnumDebugStackFrames64;
+#endif
+
+#ifndef __IEnumRemoteDebugApplications_FWD_DEFINED__
+#define __IEnumRemoteDebugApplications_FWD_DEFINED__
+typedef interface IEnumRemoteDebugApplications IEnumRemoteDebugApplications;
+#endif
+
+#ifndef __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
+#define __IEnumRemoteDebugApplicationThreads_FWD_DEFINED__
+typedef interface IEnumRemoteDebugApplicationThreads IEnumRemoteDebugApplicationThreads;
+#endif
+
+#ifndef __IProcessDebugManager32_FWD_DEFINED__
+#define __IProcessDebugManager32_FWD_DEFINED__
+typedef interface IProcessDebugManager32 IProcessDebugManager32;
+#endif
+
+#ifndef __IProcessDebugManager64_FWD_DEFINED__
+#define __IProcessDebugManager64_FWD_DEFINED__
+typedef interface IProcessDebugManager64 IProcessDebugManager64;
+#endif
+
+#ifndef __IProvideExpressionContexts_FWD_DEFINED__
+#define __IProvideExpressionContexts_FWD_DEFINED__
+typedef interface IProvideExpressionContexts IProvideExpressionContexts;
+#endif
+
+#ifndef __IMachineDebugManager_FWD_DEFINED__
+#define __IMachineDebugManager_FWD_DEFINED__
+typedef interface IMachineDebugManager IMachineDebugManager;
+#endif
+
+#ifndef __IMachineDebugManagerCookie_FWD_DEFINED__
+#define __IMachineDebugManagerCookie_FWD_DEFINED__
+typedef interface IMachineDebugManagerCookie IMachineDebugManagerCookie;
+#endif
+
+#ifndef __IMachineDebugManagerEvents_FWD_DEFINED__
+#define __IMachineDebugManagerEvents_FWD_DEFINED__
+typedef interface IMachineDebugManagerEvents IMachineDebugManagerEvents;
+#endif
+
+#ifndef __IRemoteDebugApplication_FWD_DEFINED__
+#define __IRemoteDebugApplication_FWD_DEFINED__
+typedef interface IRemoteDebugApplication IRemoteDebugApplication;
+#endif
+
+#ifndef __IRemoteDebugApplicationEvents_FWD_DEFINED__
+#define __IRemoteDebugApplicationEvents_FWD_DEFINED__
+typedef interface IRemoteDebugApplicationEvents IRemoteDebugApplicationEvents;
+#endif
+
+#ifndef __IRemoteDebugApplicationThread_FWD_DEFINED__
+#define __IRemoteDebugApplicationThread_FWD_DEFINED__
+typedef interface IRemoteDebugApplicationThread IRemoteDebugApplicationThread;
+#endif
+
+#ifndef __ISimpleConnectionPoint_FWD_DEFINED__
+#define __ISimpleConnectionPoint_FWD_DEFINED__
+typedef interface ISimpleConnectionPoint ISimpleConnectionPoint;
+#endif
+
+/*****************************************************************************
+ * ProcessDebugManager coclass
+ */
+
+DEFINE_GUID(CLSID_ProcessDebugManager, 0x78a51822, 0x51f4, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("78a51822-51f4-11d0-8f20-00805f2cd064") ProcessDebugManager;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(ProcessDebugManager, 0x78a51822, 0x51f4, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64)
+#endif
+#endif
+
+/*****************************************************************************
+ * DebugHelper coclass
+ */
+
+DEFINE_GUID(CLSID_DebugHelper, 0x0bfcc060, 0x8c1d, 0x11d0, 0xac,0xcd, 0x00,0xaa,0x00,0x60,0x27,0x5c);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("0bfcc060-8c1d-11d0-accd-00aa0060275c") DebugHelper;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(DebugHelper, 0x0bfcc060, 0x8c1d, 0x11d0, 0xac,0xcd, 0x00,0xaa,0x00,0x60,0x27,0x5c)
+#endif
+#endif
+
+EXTERN_C const CLSID CLSID_CDebugDocumentHelper;
+/*****************************************************************************
+ * CDebugDocumentHelper coclass
+ */
+
+DEFINE_GUID(CLSID_CDebugDocumentHelper, 0x83b8bca6, 0x687c, 0x11d0, 0xa4,0x05, 0x00,0xaa,0x00,0x60,0x27,0x5c);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("83b8bca6-687c-11d0-a405-00aa0060275c") CDebugDocumentHelper;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(CDebugDocumentHelper, 0x83b8bca6, 0x687c, 0x11d0, 0xa4,0x05, 0x00,0xaa,0x00,0x60,0x27,0x5c)
+#endif
+#endif
+
+#ifdef DEBUG
+#define MachineDebugManger MachineDebugManager_DEBUG
+#define CLSID_MachineDebugManager CLSID_MachineDebugManager_DEBUG
+#else
+#define MachineDebugManger MachineDebugManager_RETAIL
+#define CLSID_MachineDebugManager CLSID_MachineDebugManager_RETAIL
+#endif
+/*****************************************************************************
+ * MachineDebugManager_RETAIL coclass
+ */
+
+DEFINE_GUID(CLSID_MachineDebugManager_RETAIL, 0x0c0a3666, 0x30c9, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("0c0a3666-30c9-11d0-8f20-00805f2cd064") MachineDebugManager_RETAIL;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(MachineDebugManager_RETAIL, 0x0c0a3666, 0x30c9, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64)
+#endif
+#endif
+
+/*****************************************************************************
+ * MachineDebugManager_DEBUG coclass
+ */
+
+DEFINE_GUID(CLSID_MachineDebugManager_DEBUG, 0x49769cec, 0x3a55, 0x4bb0, 0xb6,0x97, 0x88,0xfe,0xde,0x77,0xe8,0xea);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("49769cec-3a55-4bb0-b697-88fede77e8ea") MachineDebugManager_DEBUG;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(MachineDebugManager_DEBUG, 0x49769cec, 0x3a55, 0x4bb0, 0xb6,0x97, 0x88,0xfe,0xde,0x77,0xe8,0xea)
+#endif
+#endif
+
+/*****************************************************************************
+ * DefaultDebugSessionProvider coclass
+ */
+
+DEFINE_GUID(CLSID_DefaultDebugSessionProvider, 0x834128a2, 0x51f4, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64);
+
+#ifdef __cplusplus
+class DECLSPEC_UUID("834128a2-51f4-11d0-8f20-00805f2cd064") DefaultDebugSessionProvider;
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(DefaultDebugSessionProvider, 0x834128a2, 0x51f4, 0x11d0, 0x8f,0x20, 0x00,0x80,0x5f,0x2c,0xd0,0x64)
+#endif
+#endif
+
+#endif
+#endif
+/* Begin additional prototypes for all interfaces */
+
+ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
+unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
+unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
+void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __activdbg_h__ */
diff --git a/mingw-w64-headers/include/activdbg.idl b/mingw-w64-headers/include/activdbg.idl
new file mode 100755
index 0000000..ca4053c
--- /dev/null
+++ b/mingw-w64-headers/include/activdbg.idl
@@ -0,0 +1,830 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+
+#ifndef DO_NO_IMPORTS
+import "ocidl.idl";
+import "oleidl.idl";
+import "oaidl.idl";
+#ifndef AD7_NO_AD7_IMPORTS
+import "activscp.idl";
+import "dbgprop.idl";
+#endif
+#endif
+
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+cpp_quote("")
+cpp_quote("#ifndef __ActivDbg_h")
+cpp_quote("#define __ActivDbg_h")
+
+interface IActiveScriptDebug32;
+interface IActiveScriptDebug64;
+interface IActiveScriptErrorDebug;
+interface IActiveScriptSiteDebug32;
+interface IActiveScriptSiteDebug64;
+interface IActiveScriptSiteDebugEx;
+interface IActiveScriptTextInfo;
+interface IApplicationDebugger;
+interface IDebugApplication32;
+interface IDebugApplication64;
+interface IDebugApplicationNode;
+interface IDebugApplicationNodeEvents;
+interface IDebugApplicationThread;
+interface IDebugAsyncOperation;
+interface IDebugAsyncOperationCallBack;
+interface IDebugCodeContext;
+interface IDebugDocument;
+interface IDebugDocumentContext;
+interface IDebugDocumentHelper32;
+interface IDebugDocumentHelper64;
+interface IDebugDocumentHost;
+interface IDebugDocumentInfo;
+interface IDebugDocumentProvider;
+interface IDebugDocumentText;
+interface IDebugDocumentTextAuthor;
+interface IDebugDocumentTextEvents;
+interface IDebugExpression;
+interface IDebugExpressionCallBack;
+interface IDebugExpressionContext;
+interface IDebugFormatter;
+interface IDebugSessionProvider;
+interface IDebugStackFrame;
+interface IDebugStackFrameSniffer;
+interface IDebugSyncOperation;
+interface IDebugThreadCall32;
+interface IDebugThreadCall64;
+interface IEnumActiveScriptDebugs;
+interface IEnumDebugApplicationNodes;
+interface IEnumDebugCodeContexts;
+interface IEnumDebugDocumentContexts;
+interface IEnumDebugExpressionContexts;
+interface IEnumDebugObjectBrowsers;
+interface IEnumDebugStackFrames;
+interface IEnumDebugStackFrames64;
+interface IEnumRemoteDebugApplications;
+interface IEnumRemoteDebugApplicationThreads;
+interface IMachineDebugManager;
+interface IMachineDebugManagerCookie;
+interface IMachineDebugManagerEvents;
+interface IProcessDebugManager;
+interface IProvideExpressionContexts;
+interface IRemoteDebugApplication;
+interface IRemoteDebugApplicationThread;
+
+typedef DWORD APPBREAKFLAGS;
+typedef WORD SOURCE_TEXT_ATTR;
+typedef DWORD TEXT_DOC_ATTR;
+
+typedef enum tagBREAKPOINT_STATE {
+  BREAKPOINT_DELETED = 0,
+  BREAKPOINT_DISABLED = 1,
+  BREAKPOINT_ENABLED = 2
+} BREAKPOINT_STATE;
+
+typedef enum tagBREAKREASON {
+  BREAKREASON_STEP,
+  BREAKREASON_BREAKPOINT,
+  BREAKREASON_DEBUGGER_BLOCK,
+  BREAKREASON_HOST_INITIATED,
+  BREAKREASON_LANGUAGE_INITIATED,
+  BREAKREASON_DEBUGGER_HALT,
+  BREAKREASON_ERROR,
+  BREAKREASON_JIT
+} BREAKREASON;
+
+typedef enum tagBREAKRESUME_ACTION {
+  BREAKRESUMEACTION_ABORT,
+  BREAKRESUMEACTION_CONTINUE,
+  BREAKRESUMEACTION_STEP_INTO,
+  BREAKRESUMEACTION_STEP_OVER,
+  BREAKRESUMEACTION_STEP_OUT,
+  BREAKRESUMEACTION_IGNORE,
+} BREAKRESUMEACTION;
+
+typedef enum tagDOCUMENTNAMETYPE {
+  DOCUMENTNAMETYPE_APPNODE,
+  DOCUMENTNAMETYPE_TITLE,
+  DOCUMENTNAMETYPE_FILE_TAIL,
+  DOCUMENTNAMETYPE_URL,
+  DOCUMENTNAMETYPE_UNIQUE_TITLE,
+} DOCUMENTNAMETYPE;
+
+typedef enum tagERRORRESUMEACTION {
+  ERRORRESUMEACTION_ReexecuteErrorStatement,
+  ERRORRESUMEACTION_AbortCallAndReturnErrorToCaller,
+  ERRORRESUMEACTION_SkipErrorStatement,
+} ERRORRESUMEACTION;
+
+typedef struct tagDebugStackFrameDescriptor {
+  IDebugStackFrame *pdsf;
+  DWORD dwMin;
+  DWORD dwLim;
+  BOOL fFinal;
+  IUnknown *punkFinal;
+} DebugStackFrameDescriptor;
+
+typedef struct tagDebugStackFrameDescriptor64 {
+  IDebugStackFrame *pdsf;
+  DWORDLONG dwMin;
+  DWORDLONG dwLim;
+  BOOL fFinal;
+  IUnknown *punkFinal;
+} DebugStackFrameDescriptor64;
+
+const APPBREAKFLAGS APPBREAKFLAG_DEBUGGER_BLOCK = 0x00000001;
+const APPBREAKFLAGS APPBREAKFLAG_DEBUGGER_HALT = 0x00000002;
+const APPBREAKFLAGS APPBREAKFLAG_STEP = 0x00010000;
+const APPBREAKFLAGS APPBREAKFLAG_NESTED = 0x00020000;
+const APPBREAKFLAGS APPBREAKFLAG_STEPTYPE_SOURCE = 0x00000000;
+const APPBREAKFLAGS APPBREAKFLAG_STEPTYPE_BYTECODE = 0x00100000;
+const APPBREAKFLAGS APPBREAKFLAG_STEPTYPE_MACHINE = 0x00200000;
+const APPBREAKFLAGS APPBREAKFLAG_STEPTYPE_MASK = 0x00f00000;
+const APPBREAKFLAGS APPBREAKFLAG_IN_BREAKPOINT = 0x80000000;
+
+const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_KEYWORD = 0x1;
+const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_COMMENT = 0x2;
+const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_NONSOURCE = 0x4;
+const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_OPERATOR = 0x8;
+const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_NUMBER = 0x10;
+const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_STRING = 0x20;
+const SOURCE_TEXT_ATTR SOURCETEXT_ATTR_FUNCTION_START = 0x40;
+
+const TEXT_DOC_ATTR TEXT_DOC_ATTR_READONLY = 0x1;
+const TEXT_DOC_ATTR TEXT_DOC_ATTR_TYPE_PRIMARY = 0x2;
+const TEXT_DOC_ATTR TEXT_DOC_ATTR_TYPE_WORKER = 0x4;
+const TEXT_DOC_ATTR TEXT_DOC_ATTR_TYPE_SCRIPT = 0x8;
+cpp_quote("")
+const DWORD DEBUG_TEXT_ISEXPRESSION = 0x1;
+const DWORD DEBUG_TEXT_RETURNVALUE = 0x2;
+const DWORD DEBUG_TEXT_NOSIDEEFFECTS = 0x4;
+const DWORD DEBUG_TEXT_ALLOWBREAKPOINTS = 0x8;
+const DWORD DEBUG_TEXT_ALLOWERRORREPORT = 0x10;
+const DWORD DEBUG_TEXT_EVALUATETOCODECONTEXT = 0x20;
+
+cpp_quote("#ifndef DISABLE_ACTIVDBG_INTERFACE_WRAPPERS")
+cpp_quote("#ifdef _WIN64")
+cpp_quote("#define IDebugApplication IDebugApplication64")
+cpp_quote("#define IID_IDebugApplication IID_IDebugApplication64")
+cpp_quote("#define IDebugThreadCall IDebugThreadCall64")
+cpp_quote("#define IID_IDebugThreadCall IID_IDebugThreadCall64")
+cpp_quote("#define SynchronousCallIntoThread SynchronousCallIntoThread64")
+cpp_quote("#define IActiveScriptDebug IActiveScriptDebug64")
+cpp_quote("#define IID_IActiveScriptDebug IID_IActiveScriptDebug64")
+cpp_quote("#define IActiveScriptSiteDebug IActiveScriptSiteDebug64")
+cpp_quote("#define IID_IActiveScriptSiteDebug IID_IActiveScriptSiteDebug64")
+cpp_quote("#define IDebugStackFrameSnifferEx IDebugStackFrameSnifferEx64")
+cpp_quote("#define IID_IDebugStackFrameSnifferEx IID_IDebugStackFrameSnifferEx64")
+cpp_quote("#define EnumStackFramesEx EnumStackFramesEx64")
+cpp_quote("#define IDebugDocumentHelper IDebugDocumentHelper64")
+cpp_quote("#define IID_IDebugDocumentHelper IID_IDebugDocumentHelper64")
+cpp_quote("#define IProcessDebugManager IProcessDebugManager64")
+cpp_quote("#define IID_IProcessDebugManager IID_IProcessDebugManager64")
+cpp_quote("#else")
+cpp_quote("#define IDebugApplication IDebugApplication32")
+cpp_quote("#define IID_IDebugApplication IID_IDebugApplication32")
+cpp_quote("#define IDebugThreadCall IDebugThreadCall32")
+cpp_quote("#define IID_IDebugThreadCall IID_IDebugThreadCall32")
+cpp_quote("#define SynchronousCallIntoThread SynchronousCallIntoThread32")
+cpp_quote("#define IActiveScriptDebug IActiveScriptDebug32")
+cpp_quote("#define IID_IActiveScriptDebug IID_IActiveScriptDebug32")
+cpp_quote("#define IActiveScriptSiteDebug IActiveScriptSiteDebug32")
+cpp_quote("#define IID_IActiveScriptSiteDebug IID_IActiveScriptSiteDebug32")
+cpp_quote("#define IDebugStackFrameSnifferEx IDebugStackFrameSnifferEx32")
+cpp_quote("#define IID_IDebugStackFrameSnifferEx IID_IDebugStackFrameSnifferEx32")
+cpp_quote("#define EnumStackFramesEx EnumStackFramesEx32")
+cpp_quote("#define IDebugDocumentHelper IDebugDocumentHelper32")
+cpp_quote("#define IID_IDebugDocumentHelper IID_IDebugDocumentHelper32")
+cpp_quote("#define IProcessDebugManager IProcessDebugManager32")
+cpp_quote("#define IID_IProcessDebugManager IID_IProcessDebugManager32")
+cpp_quote("#endif")
+cpp_quote("#endif")
+
+cpp_quote("EXTERN_C const CLSID CLSID_DebugHelper;")
+cpp_quote("EXTERN_C const CLSID CLSID_MachineDebugManager;")
+cpp_quote("EXTERN_C const CLSID CLSID_ProcessDebugManager;")
+
+[object, uuid (51973c10-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IActiveScriptDebug32 : IUnknown {
+  HRESULT GetScriptTextAttributes ([in, size_is (uNumCodeChars)] LPCOLESTR pstrCode,[in] ULONG uNumCodeChars,[in] LPCOLESTR pstrDelimiter,[in] DWORD dwFlags,[in, out, size_is (uNumCodeChars)] SOURCE_TEXT_ATTR *pattr);
+  HRESULT GetScriptletTextAttributes ([in, size_is (uNumCodeChars)] LPCOLESTR pstrCode,[in] ULONG uNumCodeChars,[in] LPCOLESTR pstrDelimiter,[in] DWORD dwFlags,[in, out, size_is (uNumCodeChars)] SOURCE_TEXT_ATTR *pattr);
+  HRESULT EnumCodeContextsOfPosition ([in] DWORD dwSourceContext,[in] ULONG uCharacterOffset,[in] ULONG uNumChars,[out] IEnumDebugCodeContexts **ppescc);
+}
+
+[object, uuid (bc437e23-f5b8-47f4-bb79-7d1ce5483b86), pointer_default (unique)]
+interface IActiveScriptDebug64 : IUnknown {
+  HRESULT GetScriptTextAttributes ([in, size_is (uNumCodeChars)] LPCOLESTR pstrCode,[in] ULONG uNumCodeChars,[in] LPCOLESTR pstrDelimiter,[in] DWORD dwFlags,[in, out, size_is (uNumCodeChars)] SOURCE_TEXT_ATTR *pattr);
+  HRESULT GetScriptletTextAttributes ([in, size_is (uNumCodeChars)] LPCOLESTR pstrCode,[in] ULONG uNumCodeChars,[in] LPCOLESTR pstrDelimiter,[in] DWORD dwFlags,[in, out, size_is (uNumCodeChars)] SOURCE_TEXT_ATTR *pattr);
+  HRESULT EnumCodeContextsOfPosition ([in] DWORDLONG dwSourceContext,[in] ULONG uCharacterOffset,[in] ULONG uNumChars,[out] IEnumDebugCodeContexts **ppescc);
+}
+
+[object, local, uuid (51973c11-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IActiveScriptSiteDebug32 : IUnknown {
+  HRESULT GetDocumentContextFromPosition ([in] DWORD dwSourceContext,[in] ULONG uCharacterOffset,[in] ULONG uNumChars,[out] IDebugDocumentContext **ppsc);
+  HRESULT GetApplication ([out] IDebugApplication32 **ppda);
+  HRESULT GetRootApplicationNode ([out] IDebugApplicationNode **ppdanRoot);
+  HRESULT OnScriptErrorDebug ([in] IActiveScriptErrorDebug *pErrorDebug,[out] BOOL *pfEnterDebugger,[out] BOOL *pfCallOnScriptErrorWhenContinuing);
+}
+
+[object, local, uuid (d6b96b0a-7463-402c-92ac-89984226942f), pointer_default (unique)]
+interface IActiveScriptSiteDebug64 : IUnknown {
+  HRESULT GetDocumentContextFromPosition ([in] DWORDLONG dwSourceContext,[in] ULONG uCharacterOffset,[in] ULONG uNumChars,[out] IDebugDocumentContext **ppsc);
+  HRESULT GetApplication ([out] IDebugApplication64 **ppda);
+  HRESULT GetRootApplicationNode ([out] IDebugApplicationNode **ppdanRoot);
+  HRESULT OnScriptErrorDebug ([in] IActiveScriptErrorDebug *pErrorDebug,[out] BOOL *pfEnterDebugger,[out] BOOL *pfCallOnScriptErrorWhenContinuing);
+}
+
+[object, local, uuid (BB722CCB-6ad2-41c6-b780-af9c03ee69f5), pointer_default (unique)]
+interface IActiveScriptSiteDebugEx : IUnknown {
+  HRESULT OnCanNotJITScriptErrorDebug ([in] IActiveScriptErrorDebug *pErrorDebug,[out] BOOL *pfCallOnScriptErrorWhenContinuing);
+}
+
+[object, uuid (51973c12-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IActiveScriptErrorDebug : IActiveScriptError {
+  HRESULT GetDocumentContext ([out] IDebugDocumentContext **ppssc);
+  HRESULT GetStackFrame ([out] IDebugStackFrame **ppdsf);
+}
+
+[object, uuid (51973c13-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugCodeContext : IUnknown {
+  HRESULT GetDocumentContext ([out] IDebugDocumentContext **ppsc);
+  HRESULT SetBreakPoint ([in] BREAKPOINT_STATE bps);
+}
+
+[object, uuid (51973c14-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugExpression : IUnknown {
+  HRESULT Start ([in] IDebugExpressionCallBack *pdecb);
+  HRESULT Abort (void);
+  HRESULT QueryIsComplete (void);
+  HRESULT GetResultAsString ([out] HRESULT *phrResult,[out] BSTR *pbstrResult);
+  HRESULT GetResultAsDebugProperty ([out] HRESULT *phrResult,[out] IDebugProperty **ppdp);
+}
+
+[object, uuid (51973c15-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugExpressionContext : IUnknown {
+  HRESULT ParseLanguageText ([in] LPCOLESTR pstrCode,[in] UINT nRadix,[in] LPCOLESTR pstrDelimiter,[in] DWORD dwFlags,[out] IDebugExpression **ppe);
+  HRESULT GetLanguageInfo ([out] BSTR *pbstrLanguageName,[out] GUID *pLanguageID);
+}
+
+[object, uuid (51973c16-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugExpressionCallBack : IUnknown {
+  HRESULT onComplete (void);
+}
+
+[object, uuid (51973c17-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugStackFrame : IUnknown {
+  HRESULT GetCodeContext ([out] IDebugCodeContext **ppcc);
+  HRESULT GetDescriptionString ([in] BOOL fLong,[out] BSTR *pbstrDescription);
+  HRESULT GetLanguageString ([in] BOOL fLong,[out] BSTR *pbstrLanguage);
+  HRESULT GetThread ([out] IDebugApplicationThread **ppat);
+  HRESULT GetDebugProperty ([out] IDebugProperty **ppDebugProp);
+}
+
+[object, uuid (51973c18-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugStackFrameSniffer : IUnknown {
+  HRESULT EnumStackFrames ([out] IEnumDebugStackFrames **ppedsf);
+}
+
+[object, uuid (51973c19-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugStackFrameSnifferEx32 : IDebugStackFrameSniffer {
+  HRESULT EnumStackFramesEx32 ([in] DWORD dwSpMin,[out] IEnumDebugStackFrames **ppedsf);
+};
+
+[object, uuid (8cd12af4-49c1-4d52-8d8a-c146f47581aa), pointer_default (unique)]
+interface IDebugStackFrameSnifferEx64 : IDebugStackFrameSniffer {
+  HRESULT EnumStackFramesEx64 ([in] DWORDLONG dwSpMin,[out] IEnumDebugStackFrames64 **ppedsf);
+};
+
+[object, local, uuid (51973c1a-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugSyncOperation : IUnknown {
+  HRESULT GetTargetThread ([out] IDebugApplicationThread **ppatTarget);
+  HRESULT Execute ([out] IUnknown **ppunkResult);
+  HRESULT InProgressAbort (void);
+}
+
+[object, local, uuid (51973c1b-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugAsyncOperation : IUnknown {
+  HRESULT GetSyncDebugOperation ([out] IDebugSyncOperation **ppsdo);
+  HRESULT Start (IDebugAsyncOperationCallBack *padocb);
+  HRESULT Abort (void);
+  HRESULT QueryIsComplete (void);
+  HRESULT GetResult ([out] HRESULT *phrResult,[out] IUnknown **ppunkResult);
+}
+
+[object, local, uuid (51973c1c-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugAsyncOperationCallBack : IUnknown {
+  HRESULT onComplete (void);
+}
+
+[object, uuid (51973c1d-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IEnumDebugCodeContexts : IUnknown {
+  [local] HRESULT __stdcall Next ([in] ULONG celt,[out] IDebugCodeContext **pscc,[out] ULONG *pceltFetched);
+  [call_as (Next)] HRESULT __stdcall RemoteNext ([in] ULONG celt,[out, size_is (celt), length_is (*pceltFetched)]IDebugCodeContext **pscc,[out] ULONG *pceltFetched);
+  HRESULT Skip ([in] ULONG celt);
+  HRESULT Reset (void);
+  HRESULT Clone ([out] IEnumDebugCodeContexts **ppescc);
+}
+
+[object, uuid (51973c1e-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IEnumDebugStackFrames : IUnknown {
+  [local] HRESULT __stdcall Next ([in] ULONG celt,[out] DebugStackFrameDescriptor *prgdsfd,[out] ULONG *pceltFetched);
+  [call_as (Next)] HRESULT __stdcall RemoteNext ([in] ULONG celt,[out, size_is (celt), length_is (*pceltFetched)]DebugStackFrameDescriptor *prgdsfd,[out] ULONG *pceltFetched);
+  HRESULT Skip ([in] ULONG celt);
+  HRESULT Reset (void);
+  HRESULT Clone ([out] IEnumDebugStackFrames **ppedsf);
+}
+
+[object, uuid (0dc38853-c1b0-4176-a984-b298361027af), pointer_default (unique)]
+interface IEnumDebugStackFrames64 : IEnumDebugStackFrames {
+  [local] HRESULT __stdcall Next64 ([in] ULONG celt,[out] DebugStackFrameDescriptor64 *prgdsfd,[out] ULONG *pceltFetched);
+  [call_as (Next64)] HRESULT __stdcall RemoteNext64 ([in] ULONG celt,[out, size_is (celt), length_is (*pceltFetched)]DebugStackFrameDescriptor64 *prgdsfd,[out] ULONG *pceltFetched);
+}
+
+[object, uuid (51973c1f-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugDocumentInfo : IUnknown {
+  HRESULT GetName ([in] DOCUMENTNAMETYPE dnt,[out] BSTR *pbstrName);
+  HRESULT GetDocumentClassId ([out] CLSID *pclsidDocument);
+}
+
+[object, uuid (51973c20-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugDocumentProvider : IDebugDocumentInfo {
+  HRESULT GetDocument ([out] IDebugDocument **ppssd);
+}
+
+[object, uuid (51973c21-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugDocument : IDebugDocumentInfo {
+}
+
+[object, uuid (51973c22-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugDocumentText : IDebugDocument {
+  HRESULT GetDocumentAttributes ([out] TEXT_DOC_ATTR *ptextdocattr);
+  HRESULT GetSize ([out] ULONG *pcNumLines,[out] ULONG *pcNumChars);
+  HRESULT GetPositionOfLine ([in] ULONG cLineNumber,[out] ULONG *pcCharacterPosition);
+  HRESULT GetLineOfPosition ([in] ULONG cCharacterPosition,[out] ULONG *pcLineNumber,[out] ULONG *pcCharacterOffsetInLine);
+  HRESULT GetText ([in] ULONG cCharacterPosition,[in, out, length_is (*pcNumChars), size_is (cMaxChars)] WCHAR *pcharText,[in, out, length_is (*pcNumChars), size_is (cMaxChars), ptr] SOURCE_TEXT_ATTR *pstaTextAttr,[in, out] ULONG *pcNumChars,[in] ULONG cMaxChars);
+  HRESULT GetPositionOfContext ([in] IDebugDocumentContext *psc,[out] ULONG *pcCharacterPosition,[out] ULONG *cNumChars);
+  HRESULT GetContextOfPosition ([in] ULONG cCharacterPosition,[in] ULONG cNumChars,[out] IDebugDocumentContext **ppsc);
+}
+
+[object, uuid (51973c23-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugDocumentTextEvents : IUnknown {
+  HRESULT onDestroy (void);
+  HRESULT onInsertText ([in] ULONG cCharacterPosition,[in] ULONG cNumToInsert);
+  HRESULT onRemoveText ([in] ULONG cCharacterPosition,[in] ULONG cNumToRemove);
+  HRESULT onReplaceText ([in] ULONG cCharacterPosition,[in] ULONG cNumToReplace);
+  HRESULT onUpdateTextAttributes ([in] ULONG cCharacterPosition,[in] ULONG cNumToUpdate);
+  HRESULT onUpdateDocumentAttributes ([in] TEXT_DOC_ATTR textdocattr);
+}
+
+[object, uuid (51973c24-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugDocumentTextAuthor : IDebugDocumentText {
+  HRESULT InsertText ([in] ULONG cCharacterPosition,[in] ULONG cNumToInsert,[in, size_is (cNumToInsert)]OLECHAR pcharText[]);
+  HRESULT RemoveText ([in] ULONG cCharacterPosition,[in] ULONG cNumToRemove);
+  HRESULT ReplaceText ([in] ULONG cCharacterPosition,[in] ULONG cNumToReplace,[in, size_is (cNumToReplace)]OLECHAR pcharText[]);
+}
+
+[object, uuid (51973c25-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugDocumentTextExternalAuthor : IUnknown {
+  HRESULT GetPathName ([out] BSTR *pbstrLongName,[out] BOOL *pfIsOriginalFile);
+  HRESULT GetFileName ([out] BSTR *pbstrShortName);
+  HRESULT NotifyChanged ();
+}
+
+[object, uuid (51973c26-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugDocumentHelper32 : IUnknown {
+  HRESULT Init ([in] IDebugApplication32 *pda,[in, string] LPCOLESTR pszShortName,[in, string] LPCOLESTR pszLongName,[in] TEXT_DOC_ATTR docAttr);
+  HRESULT Attach ([in] IDebugDocumentHelper32 *pddhParent);
+  HRESULT Detach ();
+  HRESULT AddUnicodeText ([in, string] LPCOLESTR pszText);
+  HRESULT AddDBCSText ([in, string] LPCSTR pszText);
+  HRESULT SetDebugDocumentHost ([in] IDebugDocumentHost *pddh);
+  HRESULT AddDeferredText ([in] ULONG cChars,[in] DWORD dwTextStartCookie);
+  HRESULT DefineScriptBlock ([in] ULONG ulCharOffset,[in] ULONG cChars,[in] IActiveScript *pas,[in] BOOL fScriptlet,[out] DWORD *pdwSourceContext);
+  HRESULT SetDefaultTextAttr (SOURCE_TEXT_ATTR staTextAttr);
+  HRESULT SetTextAttributes ([in] ULONG ulCharOffset,[in] ULONG cChars,[in, length_is (cChars), size_is (cChars)]SOURCE_TEXT_ATTR *pstaTextAttr);
+  HRESULT SetLongName ([in, string] LPCOLESTR pszLongName);
+  HRESULT SetShortName ([in, string] LPCOLESTR pszShortName);
+  HRESULT SetDocumentAttr ([in] TEXT_DOC_ATTR pszAttributes);
+  HRESULT GetDebugApplicationNode ([out] IDebugApplicationNode **ppdan);
+  HRESULT GetScriptBlockInfo ([in] DWORD dwSourceContext,[out] IActiveScript **ppasd,[out] ULONG *piCharPos,[out] ULONG *pcChars);
+  HRESULT CreateDebugDocumentContext ([in] ULONG iCharPos,[in] ULONG cChars,[out] IDebugDocumentContext **ppddc);
+  HRESULT BringDocumentToTop ();
+  HRESULT BringDocumentContextToTop (IDebugDocumentContext *pddc);
+};
+
+[object, uuid (c4c7363c-20fd-47f9-bd82-4855e0150871), pointer_default (unique)]
+interface IDebugDocumentHelper64 : IUnknown {
+  HRESULT Init ([in] IDebugApplication64 *pda,[in, string] LPCOLESTR pszShortName,[in, string] LPCOLESTR pszLongName,[in] TEXT_DOC_ATTR docAttr);
+  HRESULT Attach ([in] IDebugDocumentHelper64 *pddhParent);
+  HRESULT Detach ();
+  HRESULT AddUnicodeText ([in, string] LPCOLESTR pszText);
+  HRESULT AddDBCSText ([in, string] LPCSTR pszText);
+  HRESULT SetDebugDocumentHost ([in] IDebugDocumentHost *pddh);
+  HRESULT AddDeferredText ([in] ULONG cChars,[in] DWORD dwTextStartCookie);
+  HRESULT DefineScriptBlock ([in] ULONG ulCharOffset,[in] ULONG cChars,[in] IActiveScript *pas,[in] BOOL fScriptlet,[out] DWORDLONG *pdwSourceContext);
+  HRESULT SetDefaultTextAttr (SOURCE_TEXT_ATTR staTextAttr);
+  HRESULT SetTextAttributes ([in] ULONG ulCharOffset,[in] ULONG cChars,[in, length_is (cChars), size_is (cChars)]SOURCE_TEXT_ATTR *pstaTextAttr);
+  HRESULT SetLongName ([in, string] LPCOLESTR pszLongName);
+  HRESULT SetShortName ([in, string] LPCOLESTR pszShortName);
+  HRESULT SetDocumentAttr ([in] TEXT_DOC_ATTR pszAttributes);
+  HRESULT GetDebugApplicationNode ([out] IDebugApplicationNode **ppdan);
+  HRESULT GetScriptBlockInfo ([in] DWORDLONG dwSourceContext,[out] IActiveScript **ppasd,[out] ULONG *piCharPos,[out] ULONG *pcChars);
+  HRESULT CreateDebugDocumentContext ([in] ULONG iCharPos,[in] ULONG cChars,[out] IDebugDocumentContext **ppddc);
+  HRESULT BringDocumentToTop ();
+  HRESULT BringDocumentContextToTop (IDebugDocumentContext *pddc);
+};
+
+[object, uuid (51973c27-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugDocumentHost : IUnknown {
+  HRESULT GetDeferredText ([in] DWORD dwTextStartCookie,[in, out, length_is (*pcNumChars), size_is (cMaxChars)] WCHAR *pcharText,[in, out, length_is (*pcNumChars), size_is (cMaxChars)] SOURCE_TEXT_ATTR *pstaTextAttr,[in, out] ULONG *pcNumChars,[in] ULONG cMaxChars);
+  HRESULT GetScriptTextAttributes ([in, size_is (uNumCodeChars)] LPCOLESTR pstrCode,[in] ULONG uNumCodeChars,[in] LPCOLESTR pstrDelimiter,[in] DWORD dwFlags,[in, out, size_is (uNumCodeChars)] SOURCE_TEXT_ATTR *pattr);
+  HRESULT OnCreateDocumentContext ([out] IUnknown **ppunkOuter);
+  HRESULT GetPathName ([out] BSTR *pbstrLongName,[out] BOOL *pfIsOriginalFile);
+  HRESULT GetFileName ([out] BSTR *pbstrShortName);
+  HRESULT NotifyChanged ();
+};
+
+[object, uuid (51973c28-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugDocumentContext : IUnknown {
+  HRESULT GetDocument ([out] IDebugDocument **ppsd);
+  HRESULT EnumCodeContexts ([out] IEnumDebugCodeContexts **ppescc);
+}
+
+[object, uuid (51973c29-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugSessionProvider : IUnknown {
+  HRESULT StartDebugSession ([in] IRemoteDebugApplication *pda);
+};
+
+[object, uuid (51973c2a-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IApplicationDebugger : IUnknown {
+  HRESULT QueryAlive (void);
+  HRESULT CreateInstanceAtDebugger ([in] REFCLSID rclsid,[in] IUnknown *pUnkOuter,[in] DWORD dwClsContext,[in] REFIID riid,[out, iid_is (riid)] IUnknown **ppvObject);
+  HRESULT onDebugOutput ([in] LPCOLESTR pstr);
+  HRESULT onHandleBreakPoint ([in] IRemoteDebugApplicationThread *prpt,[in] BREAKREASON br,[in] IActiveScriptErrorDebug *pError);
+  HRESULT onClose (void);
+  HRESULT onDebuggerEvent ([in] REFIID riid,[in] IUnknown *punk);
+};
+
+[object, uuid (51973c2b-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IApplicationDebuggerUI : IUnknown {
+  HRESULT BringDocumentToTop ([in] IDebugDocumentText *pddt);
+  HRESULT BringDocumentContextToTop ([in] IDebugDocumentContext *pddc);
+};
+
+[object, uuid (51973c2c-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IMachineDebugManager : IUnknown {
+  HRESULT AddApplication ([in] IRemoteDebugApplication *pda,[out] DWORD *pdwAppCookie);
+  HRESULT RemoveApplication ([in] DWORD dwAppCookie);
+  HRESULT EnumApplications ([out] IEnumRemoteDebugApplications **ppeda);
+};
+
+[object, uuid (51973c2d-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IMachineDebugManagerCookie : IUnknown {
+  HRESULT AddApplication ([in] IRemoteDebugApplication *pda,[in] DWORD dwDebugAppCookie,[out] DWORD *pdwAppCookie);
+  HRESULT RemoveApplication ([in] DWORD dwDebugAppCookie,[in] DWORD dwAppCookie);
+  HRESULT EnumApplications ([out] IEnumRemoteDebugApplications **ppeda);
+};
+
+[object, uuid (51973c2e-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IMachineDebugManagerEvents : IUnknown {
+  HRESULT onAddApplication ([in] IRemoteDebugApplication *pda,[in] DWORD dwAppCookie);
+  HRESULT onRemoveApplication ([in] IRemoteDebugApplication *pda,[in] DWORD dwAppCookie);
+};
+
+[object, local, uuid (51973c2f-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IProcessDebugManager32 : IUnknown {
+  HRESULT CreateApplication ([out] IDebugApplication32 **ppda);
+  HRESULT GetDefaultApplication ([out] IDebugApplication32 **ppda);
+  HRESULT AddApplication ([in] IDebugApplication32 *pda,[out] DWORD *pdwAppCookie);
+  HRESULT RemoveApplication ([in] DWORD dwAppCookie);
+  HRESULT CreateDebugDocumentHelper ([in] IUnknown *punkOuter,[out] IDebugDocumentHelper32 **pddh);
+};
+
+[object, local, uuid (56b9fc1c-63a9-4cc1-ac21-087d69a17fab), pointer_default (unique)]
+interface IProcessDebugManager64 : IUnknown {
+  HRESULT CreateApplication ([out] IDebugApplication64 **ppda);
+  HRESULT GetDefaultApplication ([out] IDebugApplication64 **ppda);
+  HRESULT AddApplication ([in] IDebugApplication64 *pda,[out] DWORD *pdwAppCookie);
+  HRESULT RemoveApplication ([in] DWORD dwAppCookie);
+  HRESULT CreateDebugDocumentHelper ([in] IUnknown *punkOuter,[out] IDebugDocumentHelper64 **pddh);
+};
+
+[object, uuid (51973c30-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IRemoteDebugApplication : IUnknown {
+  HRESULT ResumeFromBreakPoint ([in] IRemoteDebugApplicationThread *prptFocus,[in] BREAKRESUMEACTION bra,[in] ERRORRESUMEACTION era);
+  HRESULT CauseBreak (void);
+  HRESULT ConnectDebugger ([in] IApplicationDebugger *pad);
+  HRESULT DisconnectDebugger (void);
+  HRESULT GetDebugger ([out] IApplicationDebugger **pad);
+  HRESULT CreateInstanceAtApplication ([in] REFCLSID rclsid,[in] IUnknown *pUnkOuter,[in] DWORD dwClsContext,[in] REFIID riid,[out, iid_is (riid)] IUnknown **ppvObject);
+  HRESULT QueryAlive (void);
+  HRESULT EnumThreads ([out] IEnumRemoteDebugApplicationThreads **pperdat);
+  HRESULT GetName ([out] BSTR *pbstrName);
+  HRESULT GetRootNode ([out] IDebugApplicationNode **ppdanRoot);
+  HRESULT EnumGlobalExpressionContexts ([out] IEnumDebugExpressionContexts **ppedec);
+};
+
+[object, local, uuid (51973c32-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugApplication32 : IRemoteDebugApplication {
+  HRESULT SetName ([in] LPCOLESTR pstrName);
+  HRESULT StepOutComplete (void);
+  HRESULT DebugOutput ([in] LPCOLESTR pstr);
+  HRESULT StartDebugSession (void);
+  HRESULT HandleBreakPoint ([in] BREAKREASON br,[out] BREAKRESUMEACTION *pbra);
+  HRESULT Close (void);
+  HRESULT GetBreakFlags ([out] APPBREAKFLAGS *pabf,[out] IRemoteDebugApplicationThread **pprdatSteppingThread);
+  HRESULT GetCurrentThread ([out] IDebugApplicationThread **pat);
+  HRESULT CreateAsyncDebugOperation ([in] IDebugSyncOperation *psdo,[out] IDebugAsyncOperation **ppado);
+  HRESULT AddStackFrameSniffer ([in] IDebugStackFrameSniffer *pdsfs,[out] DWORD *pdwCookie);
+  HRESULT RemoveStackFrameSniffer ([in] DWORD dwCookie);
+  HRESULT QueryCurrentThreadIsDebuggerThread (void);
+  HRESULT SynchronousCallInDebuggerThread ([in] IDebugThreadCall32 *pptc,[in] DWORD dwParam1,[in] DWORD dwParam2,[in] DWORD dwParam3);
+  HRESULT CreateApplicationNode ([out] IDebugApplicationNode **ppdanNew);
+  HRESULT FireDebuggerEvent ([in] REFGUID riid,[in] IUnknown *punk);
+  HRESULT HandleRuntimeError ([in] IActiveScriptErrorDebug *pErrorDebug,[in] IActiveScriptSite *pScriptSite,[out] BREAKRESUMEACTION *pbra,[out] ERRORRESUMEACTION *perra,[out] BOOL *pfCallOnScriptError);
+  BOOL FCanJitDebug ();
+  BOOL FIsAutoJitDebugEnabled ();
+  HRESULT AddGlobalExpressionContextProvider ([in] IProvideExpressionContexts *pdsfs,[out] DWORD *pdwCookie);
+  HRESULT RemoveGlobalExpressionContextProvider ([in] DWORD dwCookie);
+}
+
+[object, local, uuid (4dedc754-04c7-4f10-9e60-16a390fe6e62), pointer_default (unique)]
+interface IDebugApplication64 : IRemoteDebugApplication {
+  HRESULT SetName ([in] LPCOLESTR pstrName);
+  HRESULT StepOutComplete (void);
+  HRESULT DebugOutput ([in] LPCOLESTR pstr);
+  HRESULT StartDebugSession (void);
+  HRESULT HandleBreakPoint ([in] BREAKREASON br,[out] BREAKRESUMEACTION *pbra);
+  HRESULT Close (void);
+  HRESULT GetBreakFlags ([out] APPBREAKFLAGS *pabf,[out] IRemoteDebugApplicationThread **pprdatSteppingThread);
+  HRESULT GetCurrentThread ([out] IDebugApplicationThread **pat);
+  HRESULT CreateAsyncDebugOperation ([in] IDebugSyncOperation *psdo,[out] IDebugAsyncOperation **ppado);
+  HRESULT AddStackFrameSniffer ([in] IDebugStackFrameSniffer *pdsfs,[out] DWORD *pdwCookie);
+  HRESULT RemoveStackFrameSniffer ([in] DWORD dwCookie);
+  HRESULT QueryCurrentThreadIsDebuggerThread (void);
+  HRESULT SynchronousCallInDebuggerThread ([in] IDebugThreadCall64 *pptc,[in] DWORDLONG dwParam1,[in] DWORDLONG dwParam2,[in] DWORDLONG dwParam3);
+  HRESULT CreateApplicationNode ([out] IDebugApplicationNode **ppdanNew);
+  HRESULT FireDebuggerEvent ([in] REFGUID riid,[in] IUnknown *punk);
+  HRESULT HandleRuntimeError ([in] IActiveScriptErrorDebug *pErrorDebug,[in] IActiveScriptSite *pScriptSite,[out] BREAKRESUMEACTION *pbra,[out] ERRORRESUMEACTION *perra,[out] BOOL *pfCallOnScriptError);
+  BOOL FCanJitDebug ();
+  BOOL FIsAutoJitDebugEnabled ();
+  HRESULT AddGlobalExpressionContextProvider ([in] IProvideExpressionContexts *pdsfs,[out] DWORDLONG *pdwCookie);
+  HRESULT RemoveGlobalExpressionContextProvider ([in] DWORDLONG dwCookie);
+};
+
+[object, uuid (51973c33-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IRemoteDebugApplicationEvents : IUnknown {
+  HRESULT OnConnectDebugger ([in] IApplicationDebugger *pad);
+  HRESULT OnDisconnectDebugger (void);
+  HRESULT OnSetName ([in] LPCOLESTR pstrName);
+  HRESULT OnDebugOutput ([in] LPCOLESTR pstr);
+  HRESULT OnClose (void);
+  HRESULT OnEnterBreakPoint ([in] IRemoteDebugApplicationThread *prdat);
+  HRESULT OnLeaveBreakPoint ([in] IRemoteDebugApplicationThread *prdat);
+  HRESULT OnCreateThread ([in] IRemoteDebugApplicationThread *prdat);
+  HRESULT OnDestroyThread ([in] IRemoteDebugApplicationThread *prdat);
+  HRESULT OnBreakFlagChange ([in] APPBREAKFLAGS abf,[in] IRemoteDebugApplicationThread *prdatSteppingThread);
+};
+
+[object, uuid (51973c34-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugApplicationNode : IDebugDocumentProvider {
+  HRESULT EnumChildren ([out] IEnumDebugApplicationNodes **pperddp);
+  HRESULT GetParent ([out] IDebugApplicationNode **pprddp);
+  HRESULT SetDocumentProvider ([in] IDebugDocumentProvider *pddp);
+  HRESULT Close (void);
+  HRESULT Attach ([in] IDebugApplicationNode *pdanParent);
+  HRESULT Detach (void);
+}
+
+[object, uuid (51973c35-cb0c-11d0-b5c9-00a0244a0e7a), async_uuid (a2e3aa3b-aa8d-4ebf-84cd-648b737b8c13), pointer_default (unique)]
+interface IDebugApplicationNodeEvents : IUnknown {
+  HRESULT onAddChild ([in] IDebugApplicationNode *prddpChild);
+  HRESULT onRemoveChild ([in] IDebugApplicationNode *prddpChild);
+  HRESULT onDetach (void);
+  HRESULT onAttach ([in] IDebugApplicationNode *prddpParent);
+}
+
+[object, local, uuid (51973c36-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugThreadCall32 : IUnknown {
+  HRESULT ThreadCallHandler ([in] DWORD dwParam1,[in] DWORD dwParam2,[in] DWORD dwParam3);
+}
+
+[object, local, uuid (cb3fa335-e979-42fd-9fcf-a7546a0f3905), pointer_default (unique)]
+interface IDebugThreadCall64 : IUnknown {
+  HRESULT ThreadCallHandler ([in] DWORDLONG dwParam1,[in] DWORDLONG dwParam2,[in] DWORDLONG dwParam3);
+}
+
+[object, uuid (51973c37-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IRemoteDebugApplicationThread : IUnknown {
+  typedef DWORD THREAD_STATE;
+
+  const THREAD_STATE THREAD_STATE_RUNNING = 0x1;
+  const THREAD_STATE THREAD_STATE_SUSPENDED = 0x2;
+  const THREAD_STATE THREAD_BLOCKED = 0x4;
+  const THREAD_STATE THREAD_OUT_OF_CONTEXT = 0x8;
+
+  HRESULT GetSystemThreadId ([out] DWORD *dwThreadId);
+  HRESULT GetApplication ([out] IRemoteDebugApplication **pprda);
+  HRESULT EnumStackFrames ([out] IEnumDebugStackFrames **ppedsf);
+  HRESULT GetDescription ([out] BSTR *pbstrDescription,[out] BSTR *pbstrState);
+  HRESULT SetNextStatement ([in] IDebugStackFrame *pStackFrame,[in] IDebugCodeContext *pCodeContext);
+  HRESULT GetState ([out] DWORD *pState);
+  HRESULT Suspend ([out] DWORD *pdwCount);
+  HRESULT Resume ([out] DWORD *pdwCount);
+  HRESULT GetSuspendCount ([out] DWORD *pdwCount);
+}
+
+[object, local, uuid (51973c38-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugApplicationThread : IRemoteDebugApplicationThread {
+  HRESULT SynchronousCallIntoThread32 ([in] IDebugThreadCall32 *pstcb,[in] DWORD dwParam1,[in] DWORD dwParam2,[in] DWORD dwParam3);
+  HRESULT QueryIsCurrentThread (void);
+  HRESULT QueryIsDebuggerThread (void);
+  HRESULT SetDescription ([in] LPCOLESTR pstrDescription);
+  HRESULT SetStateString ([in] LPCOLESTR pstrState);
+}
+
+[object, local, uuid (9dac5886-dbad-456d-9dee-5dec39ab3dda), pointer_default (unique)]
+interface IDebugApplicationThread64 : IDebugApplicationThread {
+  HRESULT SynchronousCallIntoThread64 ([in] IDebugThreadCall64 *pstcb,[in] DWORDLONG dwParam1,[in] DWORDLONG dwParam2,[in] DWORDLONG dwParam3);
+}
+
+[object, local, uuid (51973c39-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugCookie : IUnknown {
+  HRESULT SetDebugCookie ([in]DWORD dwDebugAppCookie);
+};
+
+[object, uuid (51973c3a-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IEnumDebugApplicationNodes : IUnknown {
+  [local] HRESULT __stdcall Next ([in] ULONG celt,[out] IDebugApplicationNode **pprddp,[out] ULONG *pceltFetched);
+  [call_as (Next)]  HRESULT __stdcall RemoteNext ([in] ULONG celt,[out, size_is (celt), length_is (*pceltFetched)]IDebugApplicationNode **pprddp,[out] ULONG *pceltFetched);
+  HRESULT Skip ([in] ULONG celt);
+  HRESULT Reset (void);
+  HRESULT Clone ([out] IEnumDebugApplicationNodes **pperddp);
+};
+
+[object, uuid (51973c3b-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IEnumRemoteDebugApplications : IUnknown {
+  [local] HRESULT __stdcall Next ([in] ULONG celt,[out] IRemoteDebugApplication **ppda,[out] ULONG *pceltFetched);
+  [call_as (Next)] HRESULT __stdcall RemoteNext ([in] ULONG celt,[out, size_is (celt), length_is (*pceltFetched)]IRemoteDebugApplication **ppda,[out] ULONG *pceltFetched);
+  HRESULT Skip ([in] ULONG celt);
+  HRESULT Reset (void);
+  HRESULT Clone ([out] IEnumRemoteDebugApplications **ppessd);
+}
+
+[object, uuid (51973c3c-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IEnumRemoteDebugApplicationThreads : IUnknown {
+  [local] HRESULT __stdcall Next ([in] ULONG celt,[out] IRemoteDebugApplicationThread **pprdat,[out] ULONG *pceltFetched);
+  [call_as (Next)] HRESULT __stdcall RemoteNext ([in] ULONG celt,[out, size_is (celt), length_is (*pceltFetched)]IRemoteDebugApplicationThread **ppdat,[out] ULONG *pceltFetched);
+  HRESULT Skip ([in] ULONG celt);
+  HRESULT Reset (void);
+  HRESULT Clone ([out] IEnumRemoteDebugApplicationThreads **pperdat);
+}
+
+[object, local, uuid (51973c05-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugFormatter : IUnknown {
+  HRESULT GetStringForVariant ([in] VARIANT *pvar,[in] ULONG nRadix,[out] BSTR *pbstrValue);
+  HRESULT GetVariantForString ([in] LPCOLESTR pwstrValue,[out] VARIANT *pvar);
+  HRESULT GetStringForVarType ([in] VARTYPE vt,[in] TYPEDESC *ptdescArrayType,[out] BSTR *pbstr);
+}
+
+[object, local, uuid (51973c3e-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface ISimpleConnectionPoint : IUnknown {
+  HRESULT GetEventCount ([out] ULONG *pulCount);
+  HRESULT DescribeEvents ([in] ULONG iEvent,[in] ULONG cEvents,[out, size_is (cEvents), length_is (*pcEventsFetched)]DISPID *prgid,[out, size_is (cEvents), length_is (*pcEventsFetched)]BSTR *prgbstr,[out] ULONG *pcEventsFetched);
+  HRESULT Advise ([in] IDispatch *pdisp,[out] DWORD *pdwCookie);
+  HRESULT Unadvise ([in] DWORD dwCookie);
+};
+
+[object, local, uuid (51973c3f-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IDebugHelper : IUnknown {
+  HRESULT CreatePropertyBrowser ([in] VARIANT *pvar,[in] LPCOLESTR bstrName,[in] IDebugApplicationThread *pdat,[out] IDebugProperty **ppdob);
+  HRESULT CreatePropertyBrowserEx ([in] VARIANT *pvar,[in] LPCOLESTR bstrName,[in] IDebugApplicationThread *pdat,[in] IDebugFormatter *pdf,[out] IDebugProperty **ppdob);
+  HRESULT CreateSimpleConnectionPoint ([in] IDispatch *pdisp,[out] ISimpleConnectionPoint **ppscp);
+};
+
+[object, uuid (51973c40-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IEnumDebugExpressionContexts : IUnknown {
+  [local] HRESULT __stdcall Next ([in] ULONG celt,[out] IDebugExpressionContext **ppdec,[out] ULONG *pceltFetched);
+  [call_as (Next)] HRESULT __stdcall RemoteNext ([in] ULONG celt,[out, size_is (celt), length_is (*pceltFetched)]IDebugExpressionContext **pprgdec,[out] ULONG *pceltFetched);
+  HRESULT Skip ([in] ULONG celt);
+  HRESULT Reset (void);
+  HRESULT Clone ([out] IEnumDebugExpressionContexts **ppedec);
+}
+
+[object, uuid (51973c41-cb0c-11d0-b5c9-00a0244a0e7a), pointer_default (unique)]
+interface IProvideExpressionContexts : IUnknown {
+  HRESULT EnumExpressionContexts ([out] IEnumDebugExpressionContexts **ppedec);
+}
+
+[uuid (78a51821-51f4-11d0-8f20-00805f2cd064), version (1.0)]
+library ProcessDebugManagerLib {
+  importlib ("stdole2.tlb");
+  interface IActiveScriptDebug32;
+  interface IActiveScriptDebug64;
+  interface IActiveScriptErrorDebug;
+  interface IActiveScriptSiteDebug32;
+  interface IActiveScriptSiteDebug64;
+  interface IActiveScriptSiteDebugEx;
+  interface IApplicationDebugger;
+  interface IApplicationDebuggerUI;
+  interface IDebugApplication32;
+  interface IDebugApplication64;
+  interface IDebugApplicationNode;
+  interface IDebugApplicationNodeEvents;
+  interface IDebugApplicationThread;
+  interface IDebugAsyncOperation;
+  interface IDebugAsyncOperationCallBack;
+  interface IDebugCodeContext;
+  interface IDebugCookie;
+  interface IDebugDocument;
+  interface IDebugDocumentContext;
+  interface IDebugDocumentHelper32;
+  interface IDebugDocumentHelper64;
+  interface IDebugDocumentHost;
+  interface IDebugDocumentInfo;
+  interface IDebugDocumentProvider;
+  interface IDebugDocumentText;
+  interface IDebugDocumentTextAuthor;
+  interface IDebugDocumentTextEvents;
+  interface IDebugDocumentTextExternalAuthor;
+  interface IDebugExpression;
+  interface IDebugExpressionCallBack;
+  interface IDebugExpressionContext;
+  interface IDebugFormatter;
+  interface IDebugHelper;
+  interface IDebugSessionProvider;
+  interface IDebugStackFrame;
+  interface IDebugStackFrameSniffer;
+  interface IDebugStackFrameSnifferEx32;
+  interface IDebugStackFrameSnifferEx64;
+  interface IDebugSyncOperation;
+  interface IDebugThreadCall32;
+  interface IDebugThreadCall64;
+  interface IEnumDebugApplicationNodes;
+  interface IEnumDebugCodeContexts;
+  interface IEnumDebugExpressionContexts;
+  interface IEnumDebugStackFrames;
+  interface IEnumDebugStackFrames64;
+  interface IEnumRemoteDebugApplications;
+  interface IEnumRemoteDebugApplicationThreads;
+  interface IProcessDebugManager32;
+  interface IProcessDebugManager64;
+  interface IProvideExpressionContexts;
+  interface IMachineDebugManager;
+  interface IMachineDebugManagerCookie;
+  interface IMachineDebugManagerEvents;
+  interface IRemoteDebugApplication;
+  interface IRemoteDebugApplicationEvents;
+  interface IRemoteDebugApplicationThread;
+  interface ISimpleConnectionPoint;
+  [uuid (78a51822-51f4-11d0-8f20-00805f2cd064)]
+  coclass ProcessDebugManager {
+#ifdef _WIN64
+    [default] interface IProcessDebugManager64;
+#else
+    [default] interface IProcessDebugManager32;
+#endif
+  };
+  [uuid (0bfcc060-8c1d-11d0-ACCD-00aa0060275c)]
+  coclass DebugHelper {
+    [default] interface IDebugHelper;
+  };
+  cpp_quote("EXTERN_C const CLSID CLSID_CDebugDocumentHelper;")
+  [uuid (83b8bca6-687c-11d0-A405-00aa0060275c)]
+  coclass CDebugDocumentHelper {
+#ifdef _WIN64
+    [default] interface IDebugDocumentHelper64;
+#else
+    [default] interface IDebugDocumentHelper32;
+#endif
+    interface IDebugDocumentProvider;
+    interface IDebugDocument;
+    interface IDebugDocumentText;
+    interface IDebugDocumentTextAuthor;
+    interface IConnectionPointContainer;
+    [default, source] interface IDebugDocumentTextEvents;
+  };
+  cpp_quote("#ifdef DEBUG")
+  cpp_quote("#define MachineDebugManger MachineDebugManager_DEBUG")
+  cpp_quote("#define CLSID_MachineDebugManager CLSID_MachineDebugManager_DEBUG")
+  cpp_quote("#else")
+  cpp_quote("#define MachineDebugManger MachineDebugManager_RETAIL")
+  cpp_quote("#define CLSID_MachineDebugManager CLSID_MachineDebugManager_RETAIL")
+  cpp_quote("#endif")
+  [uuid (0c0a3666-30c9-11d0-8f20-00805f2cd064)]
+  coclass MachineDebugManager_RETAIL {
+    [default] interface IMachineDebugManager;
+  };
+  [uuid (49769cec-3a55-4bb0-B697-88fede77e8ea)]
+  coclass MachineDebugManager_DEBUG {
+    [default] interface IMachineDebugManager;
+  };
+  [uuid (834128a2-51f4-11d0-8f20-00805f2cd064)]
+  coclass DefaultDebugSessionProvider {
+    [default] interface IDebugSessionProvider;
+  };
+};
+cpp_quote("#endif")
+cpp_quote("#endif")
diff --git a/mingw-w64-headers/include/activdbg100.h b/mingw-w64-headers/include/activdbg100.h
new file mode 100644
index 0000000..00759c7
--- /dev/null
+++ b/mingw-w64-headers/include/activdbg100.h
@@ -0,0 +1,1707 @@
+/*** Autogenerated by WIDL 1.6 from activdbg100.idl - Do not edit ***/
+
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+
+#include <rpc.h>
+#include <rpcndr.h>
+
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include <ole2.h>
+#endif
+
+#ifndef __activdbg100_h__
+#define __activdbg100_h__
+
+/* Forward declarations */
+
+#ifndef __IDebugApplicationNode100_FWD_DEFINED__
+#define __IDebugApplicationNode100_FWD_DEFINED__
+typedef interface IDebugApplicationNode100 IDebugApplicationNode100;
+#endif
+
+#ifndef __IWebAppDiagnosticsSetup_FWD_DEFINED__
+#define __IWebAppDiagnosticsSetup_FWD_DEFINED__
+typedef interface IWebAppDiagnosticsSetup IWebAppDiagnosticsSetup;
+#endif
+
+#ifndef __IRemoteDebugApplication110_FWD_DEFINED__
+#define __IRemoteDebugApplication110_FWD_DEFINED__
+typedef interface IRemoteDebugApplication110 IRemoteDebugApplication110;
+#endif
+
+#ifndef __IDebugApplication11032_FWD_DEFINED__
+#define __IDebugApplication11032_FWD_DEFINED__
+typedef interface IDebugApplication11032 IDebugApplication11032;
+#endif
+
+#ifndef __IDebugApplication11064_FWD_DEFINED__
+#define __IDebugApplication11064_FWD_DEFINED__
+typedef interface IDebugApplication11064 IDebugApplication11064;
+#endif
+
+#ifndef __IWebAppDiagnosticsObjectInitialization_FWD_DEFINED__
+#define __IWebAppDiagnosticsObjectInitialization_FWD_DEFINED__
+typedef interface IWebAppDiagnosticsObjectInitialization IWebAppDiagnosticsObjectInitialization;
+#endif
+
+#ifndef __IActiveScriptWinRTErrorDebug_FWD_DEFINED__
+#define __IActiveScriptWinRTErrorDebug_FWD_DEFINED__
+typedef interface IActiveScriptWinRTErrorDebug IActiveScriptWinRTErrorDebug;
+#endif
+
+#ifndef __IActiveScriptErrorDebug110_FWD_DEFINED__
+#define __IActiveScriptErrorDebug110_FWD_DEFINED__
+typedef interface IActiveScriptErrorDebug110 IActiveScriptErrorDebug110;
+#endif
+
+#ifndef __IDebugApplicationThreadEvents110_FWD_DEFINED__
+#define __IDebugApplicationThreadEvents110_FWD_DEFINED__
+typedef interface IDebugApplicationThreadEvents110 IDebugApplicationThreadEvents110;
+#endif
+
+#ifndef __IDebugApplicationThread11032_FWD_DEFINED__
+#define __IDebugApplicationThread11032_FWD_DEFINED__
+typedef interface IDebugApplicationThread11032 IDebugApplicationThread11032;
+#endif
+
+#ifndef __IDebugApplicationThread11064_FWD_DEFINED__
+#define __IDebugApplicationThread11064_FWD_DEFINED__
+typedef interface IDebugApplicationThread11064 IDebugApplicationThread11064;
+#endif
+
+#ifndef __IRemoteDebugCriticalErrorEvent110_FWD_DEFINED__
+#define __IRemoteDebugCriticalErrorEvent110_FWD_DEFINED__
+typedef interface IRemoteDebugCriticalErrorEvent110 IRemoteDebugCriticalErrorEvent110;
+#endif
+
+/* Headers for imported files */
+
+#include <activdbg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <winapifamily.h>
+
+#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
+#ifndef __IWebAppDiagnosticsSetupEvent_FWD_DEFINED__
+#define __IWebAppDiagnosticsSetupEvent_FWD_DEFINED__
+typedef interface IWebAppDiagnosticsSetupEvent IWebAppDiagnosticsSetupEvent;
+#endif
+
+typedef enum tagAPPLICATION_NODE_EVENT_FILTER {
+    FILTER_EXCLUDE_NOTHING = 0x0,
+    FILTER_EXCLUDE_ANONYMOUS_CODE = 0x1,
+    FILTER_EXCLUDE_EVAL_CODE = 0x2
+} APPLICATION_NODE_EVENT_FILTER;
+typedef enum tagSCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND {
+    ETK_FIRST_CHANCE = 0x0,
+    ETK_USER_UNHANDLED = 0x1,
+    ETK_UNHANDLED = 0x2
+} SCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND;
+enum SCRIPT_DEBUGGER_OPTIONS {
+    SDO_NONE = 0x0,
+    SDO_ENABLE_FIRST_CHANCE_EXCEPTIONS = 0x1,
+    SDO_ENABLE_WEB_WORKER_SUPPORT = 0x2,
+    SDO_ENABLE_NONUSER_CODE_SUPPORT = 0x4
+};
+
+typedef struct tagTEXT_DOCUMENT_ARRAY {
+    DWORD dwCount;
+    IDebugDocumentText **Members;
+} TEXT_DOCUMENT_ARRAY;
+DEFINE_ENUM_FLAG_OPERATORS(SCRIPT_DEBUGGER_OPTIONS)
+#ifndef DISABLE_ACTIVDBG_INTERFACE_WRAPPERS
+#ifdef _WIN64
+#define IDebugApplication110 IDebugApplication11064
+#define IID_IDebugApplication110 IID_IDebugApplication11064
+#define IDebugApplicationThread110 IDebugApplicationThread11064
+#define IID_IDebugApplicationThread110 IID_IDebugApplicationThread11064
+#else
+#define IDebugApplication110 IDebugApplication11032
+#define IID_IDebugApplication110 IID_IDebugApplication11032
+#define IDebugApplicationThread110 IDebugApplicationThread11032
+#define IID_IDebugApplicationThread110 IID_IDebugApplicationThread11032
+#endif
+#endif
+/*****************************************************************************
+ * IDebugApplicationNode100 interface
+ */
+#ifndef __IDebugApplicationNode100_INTERFACE_DEFINED__
+#define __IDebugApplicationNode100_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugApplicationNode100, 0x90a7734e, 0x841b, 0x4f77, 0x93,0x84, 0xa2,0x89,0x1e,0x76,0xe7,0xe2);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("90a7734e-841b-4f77-9384-a2891e76e7e2")
+IDebugApplicationNode100 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetFilterForEventSink(
+        DWORD dwCookie,
+        APPLICATION_NODE_EVENT_FILTER filter) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetExcludedDocuments(
+        APPLICATION_NODE_EVENT_FILTER filter,
+        TEXT_DOCUMENT_ARRAY *pDocuments) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE QueryIsChildNode(
+        IDebugDocument *pSearchKey) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugApplicationNode100, 0x90a7734e, 0x841b, 0x4f77, 0x93,0x84, 0xa2,0x89,0x1e,0x76,0xe7,0xe2)
+#endif
+#else
+typedef struct IDebugApplicationNode100Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugApplicationNode100* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugApplicationNode100* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugApplicationNode100* This);
+
+    /*** IDebugApplicationNode100 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetFilterForEventSink)(
+        IDebugApplicationNode100* This,
+        DWORD dwCookie,
+        APPLICATION_NODE_EVENT_FILTER filter);
+
+    HRESULT (STDMETHODCALLTYPE *GetExcludedDocuments)(
+        IDebugApplicationNode100* This,
+        APPLICATION_NODE_EVENT_FILTER filter,
+        TEXT_DOCUMENT_ARRAY *pDocuments);
+
+    HRESULT (STDMETHODCALLTYPE *QueryIsChildNode)(
+        IDebugApplicationNode100* This,
+        IDebugDocument *pSearchKey);
+
+    END_INTERFACE
+} IDebugApplicationNode100Vtbl;
+interface IDebugApplicationNode100 {
+    CONST_VTBL IDebugApplicationNode100Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugApplicationNode100_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugApplicationNode100_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugApplicationNode100_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugApplicationNode100 methods ***/
+#define IDebugApplicationNode100_SetFilterForEventSink(This,dwCookie,filter) (This)->lpVtbl->SetFilterForEventSink(This,dwCookie,filter)
+#define IDebugApplicationNode100_GetExcludedDocuments(This,filter,pDocuments) (This)->lpVtbl->GetExcludedDocuments(This,filter,pDocuments)
+#define IDebugApplicationNode100_QueryIsChildNode(This,pSearchKey) (This)->lpVtbl->QueryIsChildNode(This,pSearchKey)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugApplicationNode100_QueryInterface(IDebugApplicationNode100* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugApplicationNode100_AddRef(IDebugApplicationNode100* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugApplicationNode100_Release(IDebugApplicationNode100* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugApplicationNode100 methods ***/
+static FORCEINLINE HRESULT IDebugApplicationNode100_SetFilterForEventSink(IDebugApplicationNode100* This,DWORD dwCookie,APPLICATION_NODE_EVENT_FILTER filter) {
+    return This->lpVtbl->SetFilterForEventSink(This,dwCookie,filter);
+}
+static FORCEINLINE HRESULT IDebugApplicationNode100_GetExcludedDocuments(IDebugApplicationNode100* This,APPLICATION_NODE_EVENT_FILTER filter,TEXT_DOCUMENT_ARRAY *pDocuments) {
+    return This->lpVtbl->GetExcludedDocuments(This,filter,pDocuments);
+}
+static FORCEINLINE HRESULT IDebugApplicationNode100_QueryIsChildNode(IDebugApplicationNode100* This,IDebugDocument *pSearchKey) {
+    return This->lpVtbl->QueryIsChildNode(This,pSearchKey);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugApplicationNode100_SetFilterForEventSink_Proxy(
+    IDebugApplicationNode100* This,
+    DWORD dwCookie,
+    APPLICATION_NODE_EVENT_FILTER filter);
+void __RPC_STUB IDebugApplicationNode100_SetFilterForEventSink_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationNode100_GetExcludedDocuments_Proxy(
+    IDebugApplicationNode100* This,
+    APPLICATION_NODE_EVENT_FILTER filter,
+    TEXT_DOCUMENT_ARRAY *pDocuments);
+void __RPC_STUB IDebugApplicationNode100_GetExcludedDocuments_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationNode100_QueryIsChildNode_Proxy(
+    IDebugApplicationNode100* This,
+    IDebugDocument *pSearchKey);
+void __RPC_STUB IDebugApplicationNode100_QueryIsChildNode_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugApplicationNode100_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWebAppDiagnosticsSetup interface
+ */
+#ifndef __IWebAppDiagnosticsSetup_INTERFACE_DEFINED__
+#define __IWebAppDiagnosticsSetup_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWebAppDiagnosticsSetup, 0x379bfbe1, 0xc6c9, 0x432a, 0x93,0xe1, 0x6d,0x17,0x65,0x6c,0x53,0x8c);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("379bfbe1-c6c9-432a-93e1-6d17656c538c")
+IWebAppDiagnosticsSetup : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE DiagnosticsSupported(
+        VARIANT_BOOL *pRetVal) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CreateObjectWithSiteAtWebApp(
+        REFCLSID rclsid,
+        DWORD dwClsContext,
+        REFIID riid,
+        DWORD_PTR hPassToObject) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWebAppDiagnosticsSetup, 0x379bfbe1, 0xc6c9, 0x432a, 0x93,0xe1, 0x6d,0x17,0x65,0x6c,0x53,0x8c)
+#endif
+#else
+typedef struct IWebAppDiagnosticsSetupVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWebAppDiagnosticsSetup* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWebAppDiagnosticsSetup* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWebAppDiagnosticsSetup* This);
+
+    /*** IWebAppDiagnosticsSetup methods ***/
+    HRESULT (STDMETHODCALLTYPE *DiagnosticsSupported)(
+        IWebAppDiagnosticsSetup* This,
+        VARIANT_BOOL *pRetVal);
+
+    HRESULT (STDMETHODCALLTYPE *CreateObjectWithSiteAtWebApp)(
+        IWebAppDiagnosticsSetup* This,
+        REFCLSID rclsid,
+        DWORD dwClsContext,
+        REFIID riid,
+        DWORD_PTR hPassToObject);
+
+    END_INTERFACE
+} IWebAppDiagnosticsSetupVtbl;
+interface IWebAppDiagnosticsSetup {
+    CONST_VTBL IWebAppDiagnosticsSetupVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWebAppDiagnosticsSetup_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWebAppDiagnosticsSetup_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWebAppDiagnosticsSetup_Release(This) (This)->lpVtbl->Release(This)
+/*** IWebAppDiagnosticsSetup methods ***/
+#define IWebAppDiagnosticsSetup_DiagnosticsSupported(This,pRetVal) (This)->lpVtbl->DiagnosticsSupported(This,pRetVal)
+#define IWebAppDiagnosticsSetup_CreateObjectWithSiteAtWebApp(This,rclsid,dwClsContext,riid,hPassToObject) (This)->lpVtbl->CreateObjectWithSiteAtWebApp(This,rclsid,dwClsContext,riid,hPassToObject)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWebAppDiagnosticsSetup_QueryInterface(IWebAppDiagnosticsSetup* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWebAppDiagnosticsSetup_AddRef(IWebAppDiagnosticsSetup* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWebAppDiagnosticsSetup_Release(IWebAppDiagnosticsSetup* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWebAppDiagnosticsSetup methods ***/
+static FORCEINLINE HRESULT IWebAppDiagnosticsSetup_DiagnosticsSupported(IWebAppDiagnosticsSetup* This,VARIANT_BOOL *pRetVal) {
+    return This->lpVtbl->DiagnosticsSupported(This,pRetVal);
+}
+static FORCEINLINE HRESULT IWebAppDiagnosticsSetup_CreateObjectWithSiteAtWebApp(IWebAppDiagnosticsSetup* This,REFCLSID rclsid,DWORD dwClsContext,REFIID riid,DWORD_PTR hPassToObject) {
+    return This->lpVtbl->CreateObjectWithSiteAtWebApp(This,rclsid,dwClsContext,riid,hPassToObject);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWebAppDiagnosticsSetup_DiagnosticsSupported_Proxy(
+    IWebAppDiagnosticsSetup* This,
+    VARIANT_BOOL *pRetVal);
+void __RPC_STUB IWebAppDiagnosticsSetup_DiagnosticsSupported_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IWebAppDiagnosticsSetup_CreateObjectWithSiteAtWebApp_Proxy(
+    IWebAppDiagnosticsSetup* This,
+    REFCLSID rclsid,
+    DWORD dwClsContext,
+    REFIID riid,
+    DWORD_PTR hPassToObject);
+void __RPC_STUB IWebAppDiagnosticsSetup_CreateObjectWithSiteAtWebApp_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWebAppDiagnosticsSetup_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IRemoteDebugApplication110 interface
+ */
+#ifndef __IRemoteDebugApplication110_INTERFACE_DEFINED__
+#define __IRemoteDebugApplication110_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IRemoteDebugApplication110, 0xd5fe005b, 0x2836, 0x485e, 0xb1,0xf9, 0x89,0xd9,0x1a,0xa2,0x4f,0xd4);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("d5fe005b-2836-485e-b1f9-89d91aa24fd4")
+IRemoteDebugApplication110 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE SetDebuggerOptions(
+        enum SCRIPT_DEBUGGER_OPTIONS mask,
+        enum SCRIPT_DEBUGGER_OPTIONS value) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCurrentDebuggerOptions(
+        enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetMainThread(
+        IRemoteDebugApplicationThread **ppThread) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IRemoteDebugApplication110, 0xd5fe005b, 0x2836, 0x485e, 0xb1,0xf9, 0x89,0xd9,0x1a,0xa2,0x4f,0xd4)
+#endif
+#else
+typedef struct IRemoteDebugApplication110Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IRemoteDebugApplication110* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IRemoteDebugApplication110* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IRemoteDebugApplication110* This);
+
+    /*** IRemoteDebugApplication110 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetDebuggerOptions)(
+        IRemoteDebugApplication110* This,
+        enum SCRIPT_DEBUGGER_OPTIONS mask,
+        enum SCRIPT_DEBUGGER_OPTIONS value);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentDebuggerOptions)(
+        IRemoteDebugApplication110* This,
+        enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions);
+
+    HRESULT (STDMETHODCALLTYPE *GetMainThread)(
+        IRemoteDebugApplication110* This,
+        IRemoteDebugApplicationThread **ppThread);
+
+    END_INTERFACE
+} IRemoteDebugApplication110Vtbl;
+interface IRemoteDebugApplication110 {
+    CONST_VTBL IRemoteDebugApplication110Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IRemoteDebugApplication110_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IRemoteDebugApplication110_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRemoteDebugApplication110_Release(This) (This)->lpVtbl->Release(This)
+/*** IRemoteDebugApplication110 methods ***/
+#define IRemoteDebugApplication110_SetDebuggerOptions(This,mask,value) (This)->lpVtbl->SetDebuggerOptions(This,mask,value)
+#define IRemoteDebugApplication110_GetCurrentDebuggerOptions(This,pCurrentOptions) (This)->lpVtbl->GetCurrentDebuggerOptions(This,pCurrentOptions)
+#define IRemoteDebugApplication110_GetMainThread(This,ppThread) (This)->lpVtbl->GetMainThread(This,ppThread)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IRemoteDebugApplication110_QueryInterface(IRemoteDebugApplication110* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IRemoteDebugApplication110_AddRef(IRemoteDebugApplication110* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IRemoteDebugApplication110_Release(IRemoteDebugApplication110* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRemoteDebugApplication110 methods ***/
+static FORCEINLINE HRESULT IRemoteDebugApplication110_SetDebuggerOptions(IRemoteDebugApplication110* This,enum SCRIPT_DEBUGGER_OPTIONS mask,enum SCRIPT_DEBUGGER_OPTIONS value) {
+    return This->lpVtbl->SetDebuggerOptions(This,mask,value);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplication110_GetCurrentDebuggerOptions(IRemoteDebugApplication110* This,enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions) {
+    return This->lpVtbl->GetCurrentDebuggerOptions(This,pCurrentOptions);
+}
+static FORCEINLINE HRESULT IRemoteDebugApplication110_GetMainThread(IRemoteDebugApplication110* This,IRemoteDebugApplicationThread **ppThread) {
+    return This->lpVtbl->GetMainThread(This,ppThread);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication110_SetDebuggerOptions_Proxy(
+    IRemoteDebugApplication110* This,
+    enum SCRIPT_DEBUGGER_OPTIONS mask,
+    enum SCRIPT_DEBUGGER_OPTIONS value);
+void __RPC_STUB IRemoteDebugApplication110_SetDebuggerOptions_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication110_GetCurrentDebuggerOptions_Proxy(
+    IRemoteDebugApplication110* This,
+    enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions);
+void __RPC_STUB IRemoteDebugApplication110_GetCurrentDebuggerOptions_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IRemoteDebugApplication110_GetMainThread_Proxy(
+    IRemoteDebugApplication110* This,
+    IRemoteDebugApplicationThread **ppThread);
+void __RPC_STUB IRemoteDebugApplication110_GetMainThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IRemoteDebugApplication110_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugApplication11032 interface
+ */
+#ifndef __IDebugApplication11032_INTERFACE_DEFINED__
+#define __IDebugApplication11032_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugApplication11032, 0xbdb3b5de, 0x89f2, 0x4e11, 0x84,0xa5, 0x97,0x44,0x5f,0x94,0x1c,0x7d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("bdb3b5de-89f2-4e11-84a5-97445f941c7d")
+IDebugApplication11032 : public IRemoteDebugApplication110
+{
+    virtual HRESULT STDMETHODCALLTYPE SynchronousCallInMainThread(
+        IDebugThreadCall32 *pptc,
+        DWORD_PTR dwParam1,
+        DWORD_PTR dwParam2,
+        DWORD_PTR dwParam3) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AsynchronousCallInMainThread(
+        IDebugThreadCall32 *pptc,
+        DWORD_PTR dwParam1,
+        DWORD_PTR dwParam2,
+        DWORD_PTR dwParam3) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CallableWaitForHandles(
+        DWORD handleCount,
+        const HANDLE *pHandles,
+        DWORD *pIndex) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugApplication11032, 0xbdb3b5de, 0x89f2, 0x4e11, 0x84,0xa5, 0x97,0x44,0x5f,0x94,0x1c,0x7d)
+#endif
+#else
+typedef struct IDebugApplication11032Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugApplication11032* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugApplication11032* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugApplication11032* This);
+
+    /*** IRemoteDebugApplication110 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetDebuggerOptions)(
+        IDebugApplication11032* This,
+        enum SCRIPT_DEBUGGER_OPTIONS mask,
+        enum SCRIPT_DEBUGGER_OPTIONS value);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentDebuggerOptions)(
+        IDebugApplication11032* This,
+        enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions);
+
+    HRESULT (STDMETHODCALLTYPE *GetMainThread)(
+        IDebugApplication11032* This,
+        IRemoteDebugApplicationThread **ppThread);
+
+    /*** IDebugApplication11032 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SynchronousCallInMainThread)(
+        IDebugApplication11032* This,
+        IDebugThreadCall32 *pptc,
+        DWORD_PTR dwParam1,
+        DWORD_PTR dwParam2,
+        DWORD_PTR dwParam3);
+
+    HRESULT (STDMETHODCALLTYPE *AsynchronousCallInMainThread)(
+        IDebugApplication11032* This,
+        IDebugThreadCall32 *pptc,
+        DWORD_PTR dwParam1,
+        DWORD_PTR dwParam2,
+        DWORD_PTR dwParam3);
+
+    HRESULT (STDMETHODCALLTYPE *CallableWaitForHandles)(
+        IDebugApplication11032* This,
+        DWORD handleCount,
+        const HANDLE *pHandles,
+        DWORD *pIndex);
+
+    END_INTERFACE
+} IDebugApplication11032Vtbl;
+interface IDebugApplication11032 {
+    CONST_VTBL IDebugApplication11032Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugApplication11032_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugApplication11032_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugApplication11032_Release(This) (This)->lpVtbl->Release(This)
+/*** IRemoteDebugApplication110 methods ***/
+#define IDebugApplication11032_SetDebuggerOptions(This,mask,value) (This)->lpVtbl->SetDebuggerOptions(This,mask,value)
+#define IDebugApplication11032_GetCurrentDebuggerOptions(This,pCurrentOptions) (This)->lpVtbl->GetCurrentDebuggerOptions(This,pCurrentOptions)
+#define IDebugApplication11032_GetMainThread(This,ppThread) (This)->lpVtbl->GetMainThread(This,ppThread)
+/*** IDebugApplication11032 methods ***/
+#define IDebugApplication11032_SynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3)
+#define IDebugApplication11032_AsynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->AsynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3)
+#define IDebugApplication11032_CallableWaitForHandles(This,handleCount,pHandles,pIndex) (This)->lpVtbl->CallableWaitForHandles(This,handleCount,pHandles,pIndex)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugApplication11032_QueryInterface(IDebugApplication11032* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugApplication11032_AddRef(IDebugApplication11032* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugApplication11032_Release(IDebugApplication11032* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRemoteDebugApplication110 methods ***/
+static FORCEINLINE HRESULT IDebugApplication11032_SetDebuggerOptions(IDebugApplication11032* This,enum SCRIPT_DEBUGGER_OPTIONS mask,enum SCRIPT_DEBUGGER_OPTIONS value) {
+    return This->lpVtbl->SetDebuggerOptions(This,mask,value);
+}
+static FORCEINLINE HRESULT IDebugApplication11032_GetCurrentDebuggerOptions(IDebugApplication11032* This,enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions) {
+    return This->lpVtbl->GetCurrentDebuggerOptions(This,pCurrentOptions);
+}
+static FORCEINLINE HRESULT IDebugApplication11032_GetMainThread(IDebugApplication11032* This,IRemoteDebugApplicationThread **ppThread) {
+    return This->lpVtbl->GetMainThread(This,ppThread);
+}
+/*** IDebugApplication11032 methods ***/
+static FORCEINLINE HRESULT IDebugApplication11032_SynchronousCallInMainThread(IDebugApplication11032* This,IDebugThreadCall32 *pptc,DWORD_PTR dwParam1,DWORD_PTR dwParam2,DWORD_PTR dwParam3) {
+    return This->lpVtbl->SynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3);
+}
+static FORCEINLINE HRESULT IDebugApplication11032_AsynchronousCallInMainThread(IDebugApplication11032* This,IDebugThreadCall32 *pptc,DWORD_PTR dwParam1,DWORD_PTR dwParam2,DWORD_PTR dwParam3) {
+    return This->lpVtbl->AsynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3);
+}
+static FORCEINLINE HRESULT IDebugApplication11032_CallableWaitForHandles(IDebugApplication11032* This,DWORD handleCount,const HANDLE *pHandles,DWORD *pIndex) {
+    return This->lpVtbl->CallableWaitForHandles(This,handleCount,pHandles,pIndex);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugApplication11032_SynchronousCallInMainThread_Proxy(
+    IDebugApplication11032* This,
+    IDebugThreadCall32 *pptc,
+    DWORD_PTR dwParam1,
+    DWORD_PTR dwParam2,
+    DWORD_PTR dwParam3);
+void __RPC_STUB IDebugApplication11032_SynchronousCallInMainThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication11032_AsynchronousCallInMainThread_Proxy(
+    IDebugApplication11032* This,
+    IDebugThreadCall32 *pptc,
+    DWORD_PTR dwParam1,
+    DWORD_PTR dwParam2,
+    DWORD_PTR dwParam3);
+void __RPC_STUB IDebugApplication11032_AsynchronousCallInMainThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication11032_CallableWaitForHandles_Proxy(
+    IDebugApplication11032* This,
+    DWORD handleCount,
+    const HANDLE *pHandles,
+    DWORD *pIndex);
+void __RPC_STUB IDebugApplication11032_CallableWaitForHandles_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugApplication11032_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugApplication11064 interface
+ */
+#ifndef __IDebugApplication11064_INTERFACE_DEFINED__
+#define __IDebugApplication11064_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugApplication11064, 0x2039d958, 0x4eeb, 0x496a, 0x87,0xbb, 0x2e,0x52,0x01,0xea,0xde,0xef);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("2039d958-4eeb-496a-87bb-2e5201eadeef")
+IDebugApplication11064 : public IRemoteDebugApplication110
+{
+    virtual HRESULT STDMETHODCALLTYPE SynchronousCallInMainThread(
+        IDebugThreadCall64 *pptc,
+        DWORD_PTR dwParam1,
+        DWORD_PTR dwParam2,
+        DWORD_PTR dwParam3) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AsynchronousCallInMainThread(
+        IDebugThreadCall64 *pptc,
+        DWORD_PTR dwParam1,
+        DWORD_PTR dwParam2,
+        DWORD_PTR dwParam3) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE CallableWaitForHandles(
+        DWORD handleCount,
+        const HANDLE *pHandles,
+        DWORD *pIndex) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugApplication11064, 0x2039d958, 0x4eeb, 0x496a, 0x87,0xbb, 0x2e,0x52,0x01,0xea,0xde,0xef)
+#endif
+#else
+typedef struct IDebugApplication11064Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugApplication11064* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugApplication11064* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugApplication11064* This);
+
+    /*** IRemoteDebugApplication110 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SetDebuggerOptions)(
+        IDebugApplication11064* This,
+        enum SCRIPT_DEBUGGER_OPTIONS mask,
+        enum SCRIPT_DEBUGGER_OPTIONS value);
+
+    HRESULT (STDMETHODCALLTYPE *GetCurrentDebuggerOptions)(
+        IDebugApplication11064* This,
+        enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions);
+
+    HRESULT (STDMETHODCALLTYPE *GetMainThread)(
+        IDebugApplication11064* This,
+        IRemoteDebugApplicationThread **ppThread);
+
+    /*** IDebugApplication11064 methods ***/
+    HRESULT (STDMETHODCALLTYPE *SynchronousCallInMainThread)(
+        IDebugApplication11064* This,
+        IDebugThreadCall64 *pptc,
+        DWORD_PTR dwParam1,
+        DWORD_PTR dwParam2,
+        DWORD_PTR dwParam3);
+
+    HRESULT (STDMETHODCALLTYPE *AsynchronousCallInMainThread)(
+        IDebugApplication11064* This,
+        IDebugThreadCall64 *pptc,
+        DWORD_PTR dwParam1,
+        DWORD_PTR dwParam2,
+        DWORD_PTR dwParam3);
+
+    HRESULT (STDMETHODCALLTYPE *CallableWaitForHandles)(
+        IDebugApplication11064* This,
+        DWORD handleCount,
+        const HANDLE *pHandles,
+        DWORD *pIndex);
+
+    END_INTERFACE
+} IDebugApplication11064Vtbl;
+interface IDebugApplication11064 {
+    CONST_VTBL IDebugApplication11064Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugApplication11064_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugApplication11064_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugApplication11064_Release(This) (This)->lpVtbl->Release(This)
+/*** IRemoteDebugApplication110 methods ***/
+#define IDebugApplication11064_SetDebuggerOptions(This,mask,value) (This)->lpVtbl->SetDebuggerOptions(This,mask,value)
+#define IDebugApplication11064_GetCurrentDebuggerOptions(This,pCurrentOptions) (This)->lpVtbl->GetCurrentDebuggerOptions(This,pCurrentOptions)
+#define IDebugApplication11064_GetMainThread(This,ppThread) (This)->lpVtbl->GetMainThread(This,ppThread)
+/*** IDebugApplication11064 methods ***/
+#define IDebugApplication11064_SynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->SynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3)
+#define IDebugApplication11064_AsynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->AsynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3)
+#define IDebugApplication11064_CallableWaitForHandles(This,handleCount,pHandles,pIndex) (This)->lpVtbl->CallableWaitForHandles(This,handleCount,pHandles,pIndex)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugApplication11064_QueryInterface(IDebugApplication11064* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugApplication11064_AddRef(IDebugApplication11064* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugApplication11064_Release(IDebugApplication11064* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRemoteDebugApplication110 methods ***/
+static FORCEINLINE HRESULT IDebugApplication11064_SetDebuggerOptions(IDebugApplication11064* This,enum SCRIPT_DEBUGGER_OPTIONS mask,enum SCRIPT_DEBUGGER_OPTIONS value) {
+    return This->lpVtbl->SetDebuggerOptions(This,mask,value);
+}
+static FORCEINLINE HRESULT IDebugApplication11064_GetCurrentDebuggerOptions(IDebugApplication11064* This,enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions) {
+    return This->lpVtbl->GetCurrentDebuggerOptions(This,pCurrentOptions);
+}
+static FORCEINLINE HRESULT IDebugApplication11064_GetMainThread(IDebugApplication11064* This,IRemoteDebugApplicationThread **ppThread) {
+    return This->lpVtbl->GetMainThread(This,ppThread);
+}
+/*** IDebugApplication11064 methods ***/
+static FORCEINLINE HRESULT IDebugApplication11064_SynchronousCallInMainThread(IDebugApplication11064* This,IDebugThreadCall64 *pptc,DWORD_PTR dwParam1,DWORD_PTR dwParam2,DWORD_PTR dwParam3) {
+    return This->lpVtbl->SynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3);
+}
+static FORCEINLINE HRESULT IDebugApplication11064_AsynchronousCallInMainThread(IDebugApplication11064* This,IDebugThreadCall64 *pptc,DWORD_PTR dwParam1,DWORD_PTR dwParam2,DWORD_PTR dwParam3) {
+    return This->lpVtbl->AsynchronousCallInMainThread(This,pptc,dwParam1,dwParam2,dwParam3);
+}
+static FORCEINLINE HRESULT IDebugApplication11064_CallableWaitForHandles(IDebugApplication11064* This,DWORD handleCount,const HANDLE *pHandles,DWORD *pIndex) {
+    return This->lpVtbl->CallableWaitForHandles(This,handleCount,pHandles,pIndex);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugApplication11064_SynchronousCallInMainThread_Proxy(
+    IDebugApplication11064* This,
+    IDebugThreadCall64 *pptc,
+    DWORD_PTR dwParam1,
+    DWORD_PTR dwParam2,
+    DWORD_PTR dwParam3);
+void __RPC_STUB IDebugApplication11064_SynchronousCallInMainThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication11064_AsynchronousCallInMainThread_Proxy(
+    IDebugApplication11064* This,
+    IDebugThreadCall64 *pptc,
+    DWORD_PTR dwParam1,
+    DWORD_PTR dwParam2,
+    DWORD_PTR dwParam3);
+void __RPC_STUB IDebugApplication11064_AsynchronousCallInMainThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplication11064_CallableWaitForHandles_Proxy(
+    IDebugApplication11064* This,
+    DWORD handleCount,
+    const HANDLE *pHandles,
+    DWORD *pIndex);
+void __RPC_STUB IDebugApplication11064_CallableWaitForHandles_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugApplication11064_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IWebAppDiagnosticsObjectInitialization interface
+ */
+#ifndef __IWebAppDiagnosticsObjectInitialization_INTERFACE_DEFINED__
+#define __IWebAppDiagnosticsObjectInitialization_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IWebAppDiagnosticsObjectInitialization, 0x16ff3a42, 0xa5f5, 0x432b, 0xb6,0x25, 0x8e,0x8e,0x16,0xf5,0x7e,0x15);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("16ff3a42-a5f5-432b-b625-8e8e16f57e15")
+IWebAppDiagnosticsObjectInitialization : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE Initialize(
+        HANDLE_PTR hPassedHandle,
+        IUnknown *pDebugApplication) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IWebAppDiagnosticsObjectInitialization, 0x16ff3a42, 0xa5f5, 0x432b, 0xb6,0x25, 0x8e,0x8e,0x16,0xf5,0x7e,0x15)
+#endif
+#else
+typedef struct IWebAppDiagnosticsObjectInitializationVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IWebAppDiagnosticsObjectInitialization* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IWebAppDiagnosticsObjectInitialization* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IWebAppDiagnosticsObjectInitialization* This);
+
+    /*** IWebAppDiagnosticsObjectInitialization methods ***/
+    HRESULT (STDMETHODCALLTYPE *Initialize)(
+        IWebAppDiagnosticsObjectInitialization* This,
+        HANDLE_PTR hPassedHandle,
+        IUnknown *pDebugApplication);
+
+    END_INTERFACE
+} IWebAppDiagnosticsObjectInitializationVtbl;
+interface IWebAppDiagnosticsObjectInitialization {
+    CONST_VTBL IWebAppDiagnosticsObjectInitializationVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IWebAppDiagnosticsObjectInitialization_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IWebAppDiagnosticsObjectInitialization_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IWebAppDiagnosticsObjectInitialization_Release(This) (This)->lpVtbl->Release(This)
+/*** IWebAppDiagnosticsObjectInitialization methods ***/
+#define IWebAppDiagnosticsObjectInitialization_Initialize(This,hPassedHandle,pDebugApplication) (This)->lpVtbl->Initialize(This,hPassedHandle,pDebugApplication)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IWebAppDiagnosticsObjectInitialization_QueryInterface(IWebAppDiagnosticsObjectInitialization* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IWebAppDiagnosticsObjectInitialization_AddRef(IWebAppDiagnosticsObjectInitialization* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IWebAppDiagnosticsObjectInitialization_Release(IWebAppDiagnosticsObjectInitialization* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IWebAppDiagnosticsObjectInitialization methods ***/
+static FORCEINLINE HRESULT IWebAppDiagnosticsObjectInitialization_Initialize(IWebAppDiagnosticsObjectInitialization* This,HANDLE_PTR hPassedHandle,IUnknown *pDebugApplication) {
+    return This->lpVtbl->Initialize(This,hPassedHandle,pDebugApplication);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IWebAppDiagnosticsObjectInitialization_Initialize_Proxy(
+    IWebAppDiagnosticsObjectInitialization* This,
+    HANDLE_PTR hPassedHandle,
+    IUnknown *pDebugApplication);
+void __RPC_STUB IWebAppDiagnosticsObjectInitialization_Initialize_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IWebAppDiagnosticsObjectInitialization_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IActiveScriptWinRTErrorDebug interface
+ */
+#ifndef __IActiveScriptWinRTErrorDebug_INTERFACE_DEFINED__
+#define __IActiveScriptWinRTErrorDebug_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IActiveScriptWinRTErrorDebug, 0x73a3f82a, 0x0fe9, 0x4b33, 0xba,0x3b, 0xfe,0x09,0x5f,0x69,0x7e,0x0a);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("73a3f82a-0fe9-4b33-ba3b-fe095f697e0a")
+IActiveScriptWinRTErrorDebug : public IActiveScriptError
+{
+    virtual HRESULT STDMETHODCALLTYPE GetRestrictedErrorString(
+        BSTR *errorString) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetRestrictedErrorReference(
+        BSTR *referenceString) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE GetCapabilitySid(
+        BSTR *capabilitySid) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IActiveScriptWinRTErrorDebug, 0x73a3f82a, 0x0fe9, 0x4b33, 0xba,0x3b, 0xfe,0x09,0x5f,0x69,0x7e,0x0a)
+#endif
+#else
+typedef struct IActiveScriptWinRTErrorDebugVtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IActiveScriptWinRTErrorDebug* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IActiveScriptWinRTErrorDebug* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IActiveScriptWinRTErrorDebug* This);
+
+    /*** IActiveScriptError methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetExceptionInfo)(
+        IActiveScriptWinRTErrorDebug* This,
+        EXCEPINFO *pexcepinfo);
+
+    HRESULT (STDMETHODCALLTYPE *GetSourcePosition)(
+        IActiveScriptWinRTErrorDebug* This,
+        DWORD *pdwSourceContext,
+        ULONG *pulLineNumber,
+        LONG *plCharacterPosition);
+
+    HRESULT (STDMETHODCALLTYPE *GetSourceLineText)(
+        IActiveScriptWinRTErrorDebug* This,
+        BSTR *pbstrSourceLine);
+
+    /*** IActiveScriptWinRTErrorDebug methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetRestrictedErrorString)(
+        IActiveScriptWinRTErrorDebug* This,
+        BSTR *errorString);
+
+    HRESULT (STDMETHODCALLTYPE *GetRestrictedErrorReference)(
+        IActiveScriptWinRTErrorDebug* This,
+        BSTR *referenceString);
+
+    HRESULT (STDMETHODCALLTYPE *GetCapabilitySid)(
+        IActiveScriptWinRTErrorDebug* This,
+        BSTR *capabilitySid);
+
+    END_INTERFACE
+} IActiveScriptWinRTErrorDebugVtbl;
+interface IActiveScriptWinRTErrorDebug {
+    CONST_VTBL IActiveScriptWinRTErrorDebugVtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IActiveScriptWinRTErrorDebug_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IActiveScriptWinRTErrorDebug_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IActiveScriptWinRTErrorDebug_Release(This) (This)->lpVtbl->Release(This)
+/*** IActiveScriptError methods ***/
+#define IActiveScriptWinRTErrorDebug_GetExceptionInfo(This,pexcepinfo) (This)->lpVtbl->GetExceptionInfo(This,pexcepinfo)
+#define IActiveScriptWinRTErrorDebug_GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition) (This)->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition)
+#define IActiveScriptWinRTErrorDebug_GetSourceLineText(This,pbstrSourceLine) (This)->lpVtbl->GetSourceLineText(This,pbstrSourceLine)
+/*** IActiveScriptWinRTErrorDebug methods ***/
+#define IActiveScriptWinRTErrorDebug_GetRestrictedErrorString(This,errorString) (This)->lpVtbl->GetRestrictedErrorString(This,errorString)
+#define IActiveScriptWinRTErrorDebug_GetRestrictedErrorReference(This,referenceString) (This)->lpVtbl->GetRestrictedErrorReference(This,referenceString)
+#define IActiveScriptWinRTErrorDebug_GetCapabilitySid(This,capabilitySid) (This)->lpVtbl->GetCapabilitySid(This,capabilitySid)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_QueryInterface(IActiveScriptWinRTErrorDebug* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IActiveScriptWinRTErrorDebug_AddRef(IActiveScriptWinRTErrorDebug* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IActiveScriptWinRTErrorDebug_Release(IActiveScriptWinRTErrorDebug* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IActiveScriptError methods ***/
+static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_GetExceptionInfo(IActiveScriptWinRTErrorDebug* This,EXCEPINFO *pexcepinfo) {
+    return This->lpVtbl->GetExceptionInfo(This,pexcepinfo);
+}
+static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_GetSourcePosition(IActiveScriptWinRTErrorDebug* This,DWORD *pdwSourceContext,ULONG *pulLineNumber,LONG *plCharacterPosition) {
+    return This->lpVtbl->GetSourcePosition(This,pdwSourceContext,pulLineNumber,plCharacterPosition);
+}
+static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_GetSourceLineText(IActiveScriptWinRTErrorDebug* This,BSTR *pbstrSourceLine) {
+    return This->lpVtbl->GetSourceLineText(This,pbstrSourceLine);
+}
+/*** IActiveScriptWinRTErrorDebug methods ***/
+static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_GetRestrictedErrorString(IActiveScriptWinRTErrorDebug* This,BSTR *errorString) {
+    return This->lpVtbl->GetRestrictedErrorString(This,errorString);
+}
+static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_GetRestrictedErrorReference(IActiveScriptWinRTErrorDebug* This,BSTR *referenceString) {
+    return This->lpVtbl->GetRestrictedErrorReference(This,referenceString);
+}
+static FORCEINLINE HRESULT IActiveScriptWinRTErrorDebug_GetCapabilitySid(IActiveScriptWinRTErrorDebug* This,BSTR *capabilitySid) {
+    return This->lpVtbl->GetCapabilitySid(This,capabilitySid);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IActiveScriptWinRTErrorDebug_GetRestrictedErrorString_Proxy(
+    IActiveScriptWinRTErrorDebug* This,
+    BSTR *errorString);
+void __RPC_STUB IActiveScriptWinRTErrorDebug_GetRestrictedErrorString_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptWinRTErrorDebug_GetRestrictedErrorReference_Proxy(
+    IActiveScriptWinRTErrorDebug* This,
+    BSTR *referenceString);
+void __RPC_STUB IActiveScriptWinRTErrorDebug_GetRestrictedErrorReference_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IActiveScriptWinRTErrorDebug_GetCapabilitySid_Proxy(
+    IActiveScriptWinRTErrorDebug* This,
+    BSTR *capabilitySid);
+void __RPC_STUB IActiveScriptWinRTErrorDebug_GetCapabilitySid_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IActiveScriptWinRTErrorDebug_INTERFACE_DEFINED__ */
+
+
+/*****************************************************************************
+ * IActiveScriptErrorDebug110 interface
+ */
+#ifndef __IActiveScriptErrorDebug110_INTERFACE_DEFINED__
+#define __IActiveScriptErrorDebug110_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IActiveScriptErrorDebug110, 0x516e42b6, 0x89a8, 0x4530, 0x93,0x7b, 0x5f,0x07,0x08,0x43,0x14,0x42);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("516e42b6-89a8-4530-937b-5f0708431442")
+IActiveScriptErrorDebug110 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetExceptionThrownKind(
+        SCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND *pExceptionKind) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IActiveScriptErrorDebug110, 0x516e42b6, 0x89a8, 0x4530, 0x93,0x7b, 0x5f,0x07,0x08,0x43,0x14,0x42)
+#endif
+#else
+typedef struct IActiveScriptErrorDebug110Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IActiveScriptErrorDebug110* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IActiveScriptErrorDebug110* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IActiveScriptErrorDebug110* This);
+
+    /*** IActiveScriptErrorDebug110 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetExceptionThrownKind)(
+        IActiveScriptErrorDebug110* This,
+        SCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND *pExceptionKind);
+
+    END_INTERFACE
+} IActiveScriptErrorDebug110Vtbl;
+interface IActiveScriptErrorDebug110 {
+    CONST_VTBL IActiveScriptErrorDebug110Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IActiveScriptErrorDebug110_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IActiveScriptErrorDebug110_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IActiveScriptErrorDebug110_Release(This) (This)->lpVtbl->Release(This)
+/*** IActiveScriptErrorDebug110 methods ***/
+#define IActiveScriptErrorDebug110_GetExceptionThrownKind(This,pExceptionKind) (This)->lpVtbl->GetExceptionThrownKind(This,pExceptionKind)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IActiveScriptErrorDebug110_QueryInterface(IActiveScriptErrorDebug110* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IActiveScriptErrorDebug110_AddRef(IActiveScriptErrorDebug110* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IActiveScriptErrorDebug110_Release(IActiveScriptErrorDebug110* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IActiveScriptErrorDebug110 methods ***/
+static FORCEINLINE HRESULT IActiveScriptErrorDebug110_GetExceptionThrownKind(IActiveScriptErrorDebug110* This,SCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND *pExceptionKind) {
+    return This->lpVtbl->GetExceptionThrownKind(This,pExceptionKind);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IActiveScriptErrorDebug110_GetExceptionThrownKind_Proxy(
+    IActiveScriptErrorDebug110* This,
+    SCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND *pExceptionKind);
+void __RPC_STUB IActiveScriptErrorDebug110_GetExceptionThrownKind_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IActiveScriptErrorDebug110_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugApplicationThreadEvents110 interface
+ */
+#ifndef __IDebugApplicationThreadEvents110_INTERFACE_DEFINED__
+#define __IDebugApplicationThreadEvents110_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugApplicationThreadEvents110, 0x84e5e468, 0xd5da, 0x48a8, 0x83,0xf4, 0x40,0x36,0x64,0x29,0x00,0x7b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("84e5e468-d5da-48a8-83f4-40366429007b")
+IDebugApplicationThreadEvents110 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE OnSuspendForBreakPoint(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnResumeFromBreakPoint(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnThreadRequestComplete(
+        ) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE OnBeginThreadRequest(
+        ) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugApplicationThreadEvents110, 0x84e5e468, 0xd5da, 0x48a8, 0x83,0xf4, 0x40,0x36,0x64,0x29,0x00,0x7b)
+#endif
+#else
+typedef struct IDebugApplicationThreadEvents110Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugApplicationThreadEvents110* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugApplicationThreadEvents110* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugApplicationThreadEvents110* This);
+
+    /*** IDebugApplicationThreadEvents110 methods ***/
+    HRESULT (STDMETHODCALLTYPE *OnSuspendForBreakPoint)(
+        IDebugApplicationThreadEvents110* This);
+
+    HRESULT (STDMETHODCALLTYPE *OnResumeFromBreakPoint)(
+        IDebugApplicationThreadEvents110* This);
+
+    HRESULT (STDMETHODCALLTYPE *OnThreadRequestComplete)(
+        IDebugApplicationThreadEvents110* This);
+
+    HRESULT (STDMETHODCALLTYPE *OnBeginThreadRequest)(
+        IDebugApplicationThreadEvents110* This);
+
+    END_INTERFACE
+} IDebugApplicationThreadEvents110Vtbl;
+interface IDebugApplicationThreadEvents110 {
+    CONST_VTBL IDebugApplicationThreadEvents110Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugApplicationThreadEvents110_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugApplicationThreadEvents110_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugApplicationThreadEvents110_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugApplicationThreadEvents110 methods ***/
+#define IDebugApplicationThreadEvents110_OnSuspendForBreakPoint(This) (This)->lpVtbl->OnSuspendForBreakPoint(This)
+#define IDebugApplicationThreadEvents110_OnResumeFromBreakPoint(This) (This)->lpVtbl->OnResumeFromBreakPoint(This)
+#define IDebugApplicationThreadEvents110_OnThreadRequestComplete(This) (This)->lpVtbl->OnThreadRequestComplete(This)
+#define IDebugApplicationThreadEvents110_OnBeginThreadRequest(This) (This)->lpVtbl->OnBeginThreadRequest(This)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThreadEvents110_QueryInterface(IDebugApplicationThreadEvents110* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugApplicationThreadEvents110_AddRef(IDebugApplicationThreadEvents110* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugApplicationThreadEvents110_Release(IDebugApplicationThreadEvents110* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugApplicationThreadEvents110 methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThreadEvents110_OnSuspendForBreakPoint(IDebugApplicationThreadEvents110* This) {
+    return This->lpVtbl->OnSuspendForBreakPoint(This);
+}
+static FORCEINLINE HRESULT IDebugApplicationThreadEvents110_OnResumeFromBreakPoint(IDebugApplicationThreadEvents110* This) {
+    return This->lpVtbl->OnResumeFromBreakPoint(This);
+}
+static FORCEINLINE HRESULT IDebugApplicationThreadEvents110_OnThreadRequestComplete(IDebugApplicationThreadEvents110* This) {
+    return This->lpVtbl->OnThreadRequestComplete(This);
+}
+static FORCEINLINE HRESULT IDebugApplicationThreadEvents110_OnBeginThreadRequest(IDebugApplicationThreadEvents110* This) {
+    return This->lpVtbl->OnBeginThreadRequest(This);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugApplicationThreadEvents110_OnSuspendForBreakPoint_Proxy(
+    IDebugApplicationThreadEvents110* This);
+void __RPC_STUB IDebugApplicationThreadEvents110_OnSuspendForBreakPoint_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThreadEvents110_OnResumeFromBreakPoint_Proxy(
+    IDebugApplicationThreadEvents110* This);
+void __RPC_STUB IDebugApplicationThreadEvents110_OnResumeFromBreakPoint_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThreadEvents110_OnThreadRequestComplete_Proxy(
+    IDebugApplicationThreadEvents110* This);
+void __RPC_STUB IDebugApplicationThreadEvents110_OnThreadRequestComplete_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThreadEvents110_OnBeginThreadRequest_Proxy(
+    IDebugApplicationThreadEvents110* This);
+void __RPC_STUB IDebugApplicationThreadEvents110_OnBeginThreadRequest_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugApplicationThreadEvents110_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugApplicationThread11032 interface
+ */
+#ifndef __IDebugApplicationThread11032_INTERFACE_DEFINED__
+#define __IDebugApplicationThread11032_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugApplicationThread11032, 0x2194ac5c, 0x6561, 0x404a, 0xa2,0xe9, 0xf5,0x7d,0x72,0xde,0x37,0x02);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("2194ac5c-6561-404a-a2e9-f57d72de3702")
+IDebugApplicationThread11032 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetActiveThreadRequestCount(
+        UINT *puiThreadRequests) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsSuspendedForBreakPoint(
+        WINBOOL *pfIsSuspended) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsThreadCallable(
+        WINBOOL *pfIsCallable) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AsynchronousCallIntoThread(
+        IDebugThreadCall32 *pptc,
+        DWORD_PTR dwParam1,
+        DWORD_PTR dwParam2,
+        DWORD_PTR dwParam3) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugApplicationThread11032, 0x2194ac5c, 0x6561, 0x404a, 0xa2,0xe9, 0xf5,0x7d,0x72,0xde,0x37,0x02)
+#endif
+#else
+typedef struct IDebugApplicationThread11032Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugApplicationThread11032* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugApplicationThread11032* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugApplicationThread11032* This);
+
+    /*** IDebugApplicationThread11032 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetActiveThreadRequestCount)(
+        IDebugApplicationThread11032* This,
+        UINT *puiThreadRequests);
+
+    HRESULT (STDMETHODCALLTYPE *IsSuspendedForBreakPoint)(
+        IDebugApplicationThread11032* This,
+        WINBOOL *pfIsSuspended);
+
+    HRESULT (STDMETHODCALLTYPE *IsThreadCallable)(
+        IDebugApplicationThread11032* This,
+        WINBOOL *pfIsCallable);
+
+    HRESULT (STDMETHODCALLTYPE *AsynchronousCallIntoThread)(
+        IDebugApplicationThread11032* This,
+        IDebugThreadCall32 *pptc,
+        DWORD_PTR dwParam1,
+        DWORD_PTR dwParam2,
+        DWORD_PTR dwParam3);
+
+    END_INTERFACE
+} IDebugApplicationThread11032Vtbl;
+interface IDebugApplicationThread11032 {
+    CONST_VTBL IDebugApplicationThread11032Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugApplicationThread11032_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugApplicationThread11032_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugApplicationThread11032_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugApplicationThread11032 methods ***/
+#define IDebugApplicationThread11032_GetActiveThreadRequestCount(This,puiThreadRequests) (This)->lpVtbl->GetActiveThreadRequestCount(This,puiThreadRequests)
+#define IDebugApplicationThread11032_IsSuspendedForBreakPoint(This,pfIsSuspended) (This)->lpVtbl->IsSuspendedForBreakPoint(This,pfIsSuspended)
+#define IDebugApplicationThread11032_IsThreadCallable(This,pfIsCallable) (This)->lpVtbl->IsThreadCallable(This,pfIsCallable)
+#define IDebugApplicationThread11032_AsynchronousCallIntoThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->AsynchronousCallIntoThread(This,pptc,dwParam1,dwParam2,dwParam3)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThread11032_QueryInterface(IDebugApplicationThread11032* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugApplicationThread11032_AddRef(IDebugApplicationThread11032* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugApplicationThread11032_Release(IDebugApplicationThread11032* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugApplicationThread11032 methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThread11032_GetActiveThreadRequestCount(IDebugApplicationThread11032* This,UINT *puiThreadRequests) {
+    return This->lpVtbl->GetActiveThreadRequestCount(This,puiThreadRequests);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread11032_IsSuspendedForBreakPoint(IDebugApplicationThread11032* This,WINBOOL *pfIsSuspended) {
+    return This->lpVtbl->IsSuspendedForBreakPoint(This,pfIsSuspended);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread11032_IsThreadCallable(IDebugApplicationThread11032* This,WINBOOL *pfIsCallable) {
+    return This->lpVtbl->IsThreadCallable(This,pfIsCallable);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread11032_AsynchronousCallIntoThread(IDebugApplicationThread11032* This,IDebugThreadCall32 *pptc,DWORD_PTR dwParam1,DWORD_PTR dwParam2,DWORD_PTR dwParam3) {
+    return This->lpVtbl->AsynchronousCallIntoThread(This,pptc,dwParam1,dwParam2,dwParam3);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread11032_GetActiveThreadRequestCount_Proxy(
+    IDebugApplicationThread11032* This,
+    UINT *puiThreadRequests);
+void __RPC_STUB IDebugApplicationThread11032_GetActiveThreadRequestCount_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread11032_IsSuspendedForBreakPoint_Proxy(
+    IDebugApplicationThread11032* This,
+    WINBOOL *pfIsSuspended);
+void __RPC_STUB IDebugApplicationThread11032_IsSuspendedForBreakPoint_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread11032_IsThreadCallable_Proxy(
+    IDebugApplicationThread11032* This,
+    WINBOOL *pfIsCallable);
+void __RPC_STUB IDebugApplicationThread11032_IsThreadCallable_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread11032_AsynchronousCallIntoThread_Proxy(
+    IDebugApplicationThread11032* This,
+    IDebugThreadCall32 *pptc,
+    DWORD_PTR dwParam1,
+    DWORD_PTR dwParam2,
+    DWORD_PTR dwParam3);
+void __RPC_STUB IDebugApplicationThread11032_AsynchronousCallIntoThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugApplicationThread11032_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IDebugApplicationThread11064 interface
+ */
+#ifndef __IDebugApplicationThread11064_INTERFACE_DEFINED__
+#define __IDebugApplicationThread11064_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IDebugApplicationThread11064, 0x420aa4cc, 0xefd8, 0x4dac, 0x98,0x3b, 0x47,0x12,0x78,0x26,0x91,0x7d);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("420aa4cc-efd8-4dac-983b-47127826917d")
+IDebugApplicationThread11064 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetActiveThreadRequestCount(
+        UINT *puiThreadRequests) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsSuspendedForBreakPoint(
+        WINBOOL *pfIsSuspended) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE IsThreadCallable(
+        WINBOOL *pfIsCallable) = 0;
+
+    virtual HRESULT STDMETHODCALLTYPE AsynchronousCallIntoThread(
+        IDebugThreadCall64 *pptc,
+        DWORD_PTR dwParam1,
+        DWORD_PTR dwParam2,
+        DWORD_PTR dwParam3) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IDebugApplicationThread11064, 0x420aa4cc, 0xefd8, 0x4dac, 0x98,0x3b, 0x47,0x12,0x78,0x26,0x91,0x7d)
+#endif
+#else
+typedef struct IDebugApplicationThread11064Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IDebugApplicationThread11064* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IDebugApplicationThread11064* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IDebugApplicationThread11064* This);
+
+    /*** IDebugApplicationThread11064 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetActiveThreadRequestCount)(
+        IDebugApplicationThread11064* This,
+        UINT *puiThreadRequests);
+
+    HRESULT (STDMETHODCALLTYPE *IsSuspendedForBreakPoint)(
+        IDebugApplicationThread11064* This,
+        WINBOOL *pfIsSuspended);
+
+    HRESULT (STDMETHODCALLTYPE *IsThreadCallable)(
+        IDebugApplicationThread11064* This,
+        WINBOOL *pfIsCallable);
+
+    HRESULT (STDMETHODCALLTYPE *AsynchronousCallIntoThread)(
+        IDebugApplicationThread11064* This,
+        IDebugThreadCall64 *pptc,
+        DWORD_PTR dwParam1,
+        DWORD_PTR dwParam2,
+        DWORD_PTR dwParam3);
+
+    END_INTERFACE
+} IDebugApplicationThread11064Vtbl;
+interface IDebugApplicationThread11064 {
+    CONST_VTBL IDebugApplicationThread11064Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IDebugApplicationThread11064_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IDebugApplicationThread11064_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IDebugApplicationThread11064_Release(This) (This)->lpVtbl->Release(This)
+/*** IDebugApplicationThread11064 methods ***/
+#define IDebugApplicationThread11064_GetActiveThreadRequestCount(This,puiThreadRequests) (This)->lpVtbl->GetActiveThreadRequestCount(This,puiThreadRequests)
+#define IDebugApplicationThread11064_IsSuspendedForBreakPoint(This,pfIsSuspended) (This)->lpVtbl->IsSuspendedForBreakPoint(This,pfIsSuspended)
+#define IDebugApplicationThread11064_IsThreadCallable(This,pfIsCallable) (This)->lpVtbl->IsThreadCallable(This,pfIsCallable)
+#define IDebugApplicationThread11064_AsynchronousCallIntoThread(This,pptc,dwParam1,dwParam2,dwParam3) (This)->lpVtbl->AsynchronousCallIntoThread(This,pptc,dwParam1,dwParam2,dwParam3)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThread11064_QueryInterface(IDebugApplicationThread11064* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IDebugApplicationThread11064_AddRef(IDebugApplicationThread11064* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IDebugApplicationThread11064_Release(IDebugApplicationThread11064* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IDebugApplicationThread11064 methods ***/
+static FORCEINLINE HRESULT IDebugApplicationThread11064_GetActiveThreadRequestCount(IDebugApplicationThread11064* This,UINT *puiThreadRequests) {
+    return This->lpVtbl->GetActiveThreadRequestCount(This,puiThreadRequests);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread11064_IsSuspendedForBreakPoint(IDebugApplicationThread11064* This,WINBOOL *pfIsSuspended) {
+    return This->lpVtbl->IsSuspendedForBreakPoint(This,pfIsSuspended);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread11064_IsThreadCallable(IDebugApplicationThread11064* This,WINBOOL *pfIsCallable) {
+    return This->lpVtbl->IsThreadCallable(This,pfIsCallable);
+}
+static FORCEINLINE HRESULT IDebugApplicationThread11064_AsynchronousCallIntoThread(IDebugApplicationThread11064* This,IDebugThreadCall64 *pptc,DWORD_PTR dwParam1,DWORD_PTR dwParam2,DWORD_PTR dwParam3) {
+    return This->lpVtbl->AsynchronousCallIntoThread(This,pptc,dwParam1,dwParam2,dwParam3);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread11064_GetActiveThreadRequestCount_Proxy(
+    IDebugApplicationThread11064* This,
+    UINT *puiThreadRequests);
+void __RPC_STUB IDebugApplicationThread11064_GetActiveThreadRequestCount_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread11064_IsSuspendedForBreakPoint_Proxy(
+    IDebugApplicationThread11064* This,
+    WINBOOL *pfIsSuspended);
+void __RPC_STUB IDebugApplicationThread11064_IsSuspendedForBreakPoint_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread11064_IsThreadCallable_Proxy(
+    IDebugApplicationThread11064* This,
+    WINBOOL *pfIsCallable);
+void __RPC_STUB IDebugApplicationThread11064_IsThreadCallable_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+HRESULT STDMETHODCALLTYPE IDebugApplicationThread11064_AsynchronousCallIntoThread_Proxy(
+    IDebugApplicationThread11064* This,
+    IDebugThreadCall64 *pptc,
+    DWORD_PTR dwParam1,
+    DWORD_PTR dwParam2,
+    DWORD_PTR dwParam3);
+void __RPC_STUB IDebugApplicationThread11064_AsynchronousCallIntoThread_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IDebugApplicationThread11064_INTERFACE_DEFINED__ */
+
+/*****************************************************************************
+ * IRemoteDebugCriticalErrorEvent110 interface
+ */
+#ifndef __IRemoteDebugCriticalErrorEvent110_INTERFACE_DEFINED__
+#define __IRemoteDebugCriticalErrorEvent110_INTERFACE_DEFINED__
+
+DEFINE_GUID(IID_IRemoteDebugCriticalErrorEvent110, 0x2f69c611, 0x6b14, 0x47e8, 0x92,0x60, 0x4b,0xb7,0xc5,0x2f,0x50,0x4b);
+#if defined(__cplusplus) && !defined(CINTERFACE)
+MIDL_INTERFACE("2f69c611-6b14-47e8-9260-4bb7c52f504b")
+IRemoteDebugCriticalErrorEvent110 : public IUnknown
+{
+    virtual HRESULT STDMETHODCALLTYPE GetErrorInfo(
+        BSTR *pbstrSource,
+        int *pMessageId,
+        BSTR *pbstrMessage,
+        IDebugDocumentContext **ppLocation) = 0;
+
+};
+#ifdef __CRT_UUID_DECL
+__CRT_UUID_DECL(IRemoteDebugCriticalErrorEvent110, 0x2f69c611, 0x6b14, 0x47e8, 0x92,0x60, 0x4b,0xb7,0xc5,0x2f,0x50,0x4b)
+#endif
+#else
+typedef struct IRemoteDebugCriticalErrorEvent110Vtbl {
+    BEGIN_INTERFACE
+
+    /*** IUnknown methods ***/
+    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
+        IRemoteDebugCriticalErrorEvent110* This,
+        REFIID riid,
+        void **ppvObject);
+
+    ULONG (STDMETHODCALLTYPE *AddRef)(
+        IRemoteDebugCriticalErrorEvent110* This);
+
+    ULONG (STDMETHODCALLTYPE *Release)(
+        IRemoteDebugCriticalErrorEvent110* This);
+
+    /*** IRemoteDebugCriticalErrorEvent110 methods ***/
+    HRESULT (STDMETHODCALLTYPE *GetErrorInfo)(
+        IRemoteDebugCriticalErrorEvent110* This,
+        BSTR *pbstrSource,
+        int *pMessageId,
+        BSTR *pbstrMessage,
+        IDebugDocumentContext **ppLocation);
+
+    END_INTERFACE
+} IRemoteDebugCriticalErrorEvent110Vtbl;
+interface IRemoteDebugCriticalErrorEvent110 {
+    CONST_VTBL IRemoteDebugCriticalErrorEvent110Vtbl* lpVtbl;
+};
+
+#ifdef COBJMACROS
+#ifndef WIDL_C_INLINE_WRAPPERS
+/*** IUnknown methods ***/
+#define IRemoteDebugCriticalErrorEvent110_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
+#define IRemoteDebugCriticalErrorEvent110_AddRef(This) (This)->lpVtbl->AddRef(This)
+#define IRemoteDebugCriticalErrorEvent110_Release(This) (This)->lpVtbl->Release(This)
+/*** IRemoteDebugCriticalErrorEvent110 methods ***/
+#define IRemoteDebugCriticalErrorEvent110_GetErrorInfo(This,pbstrSource,pMessageId,pbstrMessage,ppLocation) (This)->lpVtbl->GetErrorInfo(This,pbstrSource,pMessageId,pbstrMessage,ppLocation)
+#else
+/*** IUnknown methods ***/
+static FORCEINLINE HRESULT IRemoteDebugCriticalErrorEvent110_QueryInterface(IRemoteDebugCriticalErrorEvent110* This,REFIID riid,void **ppvObject) {
+    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
+}
+static FORCEINLINE ULONG IRemoteDebugCriticalErrorEvent110_AddRef(IRemoteDebugCriticalErrorEvent110* This) {
+    return This->lpVtbl->AddRef(This);
+}
+static FORCEINLINE ULONG IRemoteDebugCriticalErrorEvent110_Release(IRemoteDebugCriticalErrorEvent110* This) {
+    return This->lpVtbl->Release(This);
+}
+/*** IRemoteDebugCriticalErrorEvent110 methods ***/
+static FORCEINLINE HRESULT IRemoteDebugCriticalErrorEvent110_GetErrorInfo(IRemoteDebugCriticalErrorEvent110* This,BSTR *pbstrSource,int *pMessageId,BSTR *pbstrMessage,IDebugDocumentContext **ppLocation) {
+    return This->lpVtbl->GetErrorInfo(This,pbstrSource,pMessageId,pbstrMessage,ppLocation);
+}
+#endif
+#endif
+
+#endif
+
+HRESULT STDMETHODCALLTYPE IRemoteDebugCriticalErrorEvent110_GetErrorInfo_Proxy(
+    IRemoteDebugCriticalErrorEvent110* This,
+    BSTR *pbstrSource,
+    int *pMessageId,
+    BSTR *pbstrMessage,
+    IDebugDocumentContext **ppLocation);
+void __RPC_STUB IRemoteDebugCriticalErrorEvent110_GetErrorInfo_Stub(
+    IRpcStubBuffer* This,
+    IRpcChannelBuffer* pRpcChannelBuffer,
+    PRPC_MESSAGE pRpcMessage,
+    DWORD* pdwStubPhase);
+
+#endif  /* __IRemoteDebugCriticalErrorEvent110_INTERFACE_DEFINED__ */
+
+#endif
+/* Begin additional prototypes for all interfaces */
+
+ULONG           __RPC_USER BSTR_UserSize     (ULONG *, ULONG, BSTR *);
+unsigned char * __RPC_USER BSTR_UserMarshal  (ULONG *, unsigned char *, BSTR *);
+unsigned char * __RPC_USER BSTR_UserUnmarshal(ULONG *, unsigned char *, BSTR *);
+void            __RPC_USER BSTR_UserFree     (ULONG *, BSTR *);
+
+/* End additional prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __activdbg100_h__ */
diff --git a/mingw-w64-headers/include/activdbg100.idl b/mingw-w64-headers/include/activdbg100.idl
new file mode 100755
index 0000000..892696d
--- /dev/null
+++ b/mingw-w64-headers/include/activdbg100.idl
@@ -0,0 +1,134 @@
+/**
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+
+import "activdbg.idl";
+
+cpp_quote("#include <winapifamily.h>")
+cpp_quote("")
+cpp_quote("#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)")
+
+interface IWebAppDiagnosticsSetupEvent;
+
+typedef enum tagAPPLICATION_NODE_EVENT_FILTER {
+  FILTER_EXCLUDE_NOTHING = 0x0,
+  FILTER_EXCLUDE_ANONYMOUS_CODE = 0x1,
+  FILTER_EXCLUDE_EVAL_CODE = 0x2
+} APPLICATION_NODE_EVENT_FILTER;
+
+typedef enum tagSCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND {
+  ETK_FIRST_CHANCE = 0x0,
+  ETK_USER_UNHANDLED = 0x1,
+  ETK_UNHANDLED = 0x2
+} SCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND;
+
+enum SCRIPT_DEBUGGER_OPTIONS {
+  SDO_NONE = 0x0,
+  SDO_ENABLE_FIRST_CHANCE_EXCEPTIONS = 0x1,
+  SDO_ENABLE_WEB_WORKER_SUPPORT = 0x2,
+  SDO_ENABLE_NONUSER_CODE_SUPPORT = 0x4
+};
+
+typedef struct tagTEXT_DOCUMENT_ARRAY {
+  DWORD dwCount;
+  [size_is (dwCount)] IDebugDocumentText **Members;
+} TEXT_DOCUMENT_ARRAY;
+
+cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(SCRIPT_DEBUGGER_OPTIONS)")
+
+cpp_quote("#ifndef DISABLE_ACTIVDBG_INTERFACE_WRAPPERS")
+cpp_quote("#ifdef _WIN64")
+cpp_quote("#define IDebugApplication110 IDebugApplication11064")
+cpp_quote("#define IID_IDebugApplication110 IID_IDebugApplication11064")
+cpp_quote("#define IDebugApplicationThread110 IDebugApplicationThread11064")
+cpp_quote("#define IID_IDebugApplicationThread110 IID_IDebugApplicationThread11064")
+cpp_quote("#else")
+cpp_quote("#define IDebugApplication110 IDebugApplication11032")
+cpp_quote("#define IID_IDebugApplication110 IID_IDebugApplication11032")
+cpp_quote("#define IDebugApplicationThread110 IDebugApplicationThread11032")
+cpp_quote("#define IID_IDebugApplicationThread110 IID_IDebugApplicationThread11032")
+cpp_quote("#endif")
+cpp_quote("#endif")
+
+[object, uuid (90a7734e-841b-4f77-9384-a2891e76e7e2), pointer_default (unique)]
+interface IDebugApplicationNode100 : IUnknown {
+  HRESULT SetFilterForEventSink ([in] DWORD dwCookie,[in] APPLICATION_NODE_EVENT_FILTER filter);
+  HRESULT GetExcludedDocuments ([in] APPLICATION_NODE_EVENT_FILTER filter,[out] TEXT_DOCUMENT_ARRAY *pDocuments);
+  HRESULT QueryIsChildNode ([in] IDebugDocument *pSearchKey);
+};
+
+[object, uuid (379bfbe1-C6C9-432a-93e1-6d17656c538c), pointer_default (unique)]
+interface IWebAppDiagnosticsSetup : IUnknown {
+  HRESULT DiagnosticsSupported ([out, retval] VARIANT_BOOL *pRetVal);
+  HRESULT CreateObjectWithSiteAtWebApp ([in] REFCLSID rclsid,[in] DWORD dwClsContext,[in] REFIID riid,[in] DWORD_PTR hPassToObject);
+};
+
+[object, uuid (d5fe005b-2836-485e-b1f9-89d91aa24fd4), pointer_default (unique)]
+interface IRemoteDebugApplication110 : IUnknown {
+  HRESULT SetDebuggerOptions ([in] enum SCRIPT_DEBUGGER_OPTIONS mask,[in] enum SCRIPT_DEBUGGER_OPTIONS value);
+  HRESULT GetCurrentDebuggerOptions ([out] enum SCRIPT_DEBUGGER_OPTIONS *pCurrentOptions);
+  HRESULT GetMainThread ([out] IRemoteDebugApplicationThread **ppThread);
+}
+
+[object, uuid (bdb3b5de-89f2-4e11-84a5-97445f941c7d), local, pointer_default (unique)]
+interface IDebugApplication11032 : IRemoteDebugApplication110 {
+  HRESULT SynchronousCallInMainThread ([in] IDebugThreadCall32 *pptc,[in] DWORD_PTR dwParam1,[in] DWORD_PTR dwParam2,[in] DWORD_PTR dwParam3);
+  HRESULT AsynchronousCallInMainThread ([in] IDebugThreadCall32 *pptc,[in] DWORD_PTR dwParam1,[in] DWORD_PTR dwParam2,[in] DWORD_PTR dwParam3);
+  HRESULT CallableWaitForHandles ([in] DWORD handleCount,[in, size_is (handleCount)] const HANDLE *pHandles,[out] DWORD *pIndex);
+}
+
+[object, uuid (2039d958-4eeb-496a-87bb-2e5201eadeef), local, pointer_default (unique)]
+interface IDebugApplication11064 : IRemoteDebugApplication110 {
+  HRESULT SynchronousCallInMainThread ([in] IDebugThreadCall64 *pptc,[in] DWORD_PTR dwParam1,[in] DWORD_PTR dwParam2,[in] DWORD_PTR dwParam3);
+  HRESULT AsynchronousCallInMainThread ([in] IDebugThreadCall64 *pptc,[in] DWORD_PTR dwParam1,[in] DWORD_PTR dwParam2,[in] DWORD_PTR dwParam3);
+  HRESULT CallableWaitForHandles ([in] DWORD handleCount,[in, size_is (handleCount)] const HANDLE *pHandles,[out] DWORD *pIndex);
+}
+
+[object, uuid (16ff3a42-A5F5-432b-B625-8e8e16f57e15), local, pointer_default (unique)]
+interface IWebAppDiagnosticsObjectInitialization : IUnknown {
+  HRESULT Initialize ([in] HANDLE_PTR hPassedHandle,[in] IUnknown *pDebugApplication);
+}
+
+[object, uuid (73a3f82a-0fe9-4b33-BA3B-FE095F697E0A), pointer_default (unique)]
+interface IActiveScriptWinRTErrorDebug : IActiveScriptError {
+  HRESULT GetRestrictedErrorString ([out] BSTR *errorString);
+  HRESULT GetRestrictedErrorReference ([out] BSTR *referenceString);
+  HRESULT GetCapabilitySid ([out] BSTR *capabilitySid);
+}
+
+cpp_quote("")
+[object, uuid (516e42b6-89a8-4530-937b-5f0708431442), pointer_default (unique)]
+interface IActiveScriptErrorDebug110 : IUnknown {
+  HRESULT GetExceptionThrownKind ([out] SCRIPT_ERROR_DEBUG_EXCEPTION_THROWN_KIND *pExceptionKind);
+};
+
+[object, local, uuid (84e5e468-D5DA-48a8-83f4-40366429007b), pointer_default (unique)]
+interface IDebugApplicationThreadEvents110 : IUnknown {
+  HRESULT OnSuspendForBreakPoint (void);
+  HRESULT OnResumeFromBreakPoint (void);
+  HRESULT OnThreadRequestComplete (void);
+  HRESULT OnBeginThreadRequest (void);
+}
+
+[object, local, uuid (2194ac5c-6561-404a-a2e9-f57d72de3702), pointer_default (unique)]
+interface IDebugApplicationThread11032 : IUnknown {
+  HRESULT GetActiveThreadRequestCount ([out] UINT *puiThreadRequests);
+  HRESULT IsSuspendedForBreakPoint ([out] BOOL *pfIsSuspended);
+  HRESULT IsThreadCallable ([out] BOOL *pfIsCallable);
+  HRESULT AsynchronousCallIntoThread ([in] IDebugThreadCall32 *pptc,[in] DWORD_PTR dwParam1,[in] DWORD_PTR dwParam2,[in] DWORD_PTR dwParam3);
+}
+
+[object, local, uuid (420aa4cc-EFD8-4dac-983b-47127826917d), pointer_default (unique)]
+interface IDebugApplicationThread11064 : IUnknown {
+  HRESULT GetActiveThreadRequestCount ([out] UINT *puiThreadRequests);
+  HRESULT IsSuspendedForBreakPoint ([out] BOOL *pfIsSuspended);
+  HRESULT IsThreadCallable ([out] BOOL *pfIsCallable);
+  HRESULT AsynchronousCallIntoThread ([in] IDebugThreadCall64 *pptc,[in] DWORD_PTR dwParam1,[in] DWORD_PTR dwParam2,[in] DWORD_PTR dwParam3);
+}
+
+[object, uuid (2f69c611-6b14-47e8-9260-4bb7c52f504b), pointer_default (unique)]
+interface IRemoteDebugCriticalErrorEvent110 : IUnknown {
+  HRESULT GetErrorInfo ([out] BSTR *pbstrSource,[out] int *pMessageId,[out] BSTR *pbstrMessage,[out] IDebugDocumentContext **ppLocation);
+};
+cpp_quote("#endif")
